diff --git a/src/RealtimeServer/scriptureforge/models/sf-project-user-config-test-data.ts b/src/RealtimeServer/scriptureforge/models/sf-project-user-config-test-data.ts index 3ed892f1823..3294bebcdc7 100644 --- a/src/RealtimeServer/scriptureforge/models/sf-project-user-config-test-data.ts +++ b/src/RealtimeServer/scriptureforge/models/sf-project-user-config-test-data.ts @@ -10,7 +10,7 @@ export function createTestProjectUserConfig(overrides?: RecursivePartial= 14.0.0'} - - '@algolia/client-abtesting@5.35.0': - resolution: {integrity: sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.35.0': - resolution: {integrity: sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.35.0': - resolution: {integrity: sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.35.0': - resolution: {integrity: sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.35.0': - resolution: {integrity: sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.35.0': - resolution: {integrity: sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.35.0': - resolution: {integrity: sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.35.0': - resolution: {integrity: sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.35.0': - resolution: {integrity: sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.35.0': - resolution: {integrity: sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.35.0': - resolution: {integrity: sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.35.0': - resolution: {integrity: sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.35.0': - resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} - engines: {node: '>= 14.0.0'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@angular-devkit/architect@0.2003.28': - resolution: {integrity: sha512-1m5xewVT5TrT28lHKuh7dQBoSwx86Z/lUMyYmrQJcgPm0hdcprowc8CPr2MNi1+RoccnAbgPVcUpokmSqYZx4A==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@angular-devkit/architect@0.2102.15': - resolution: {integrity: sha512-EZQXu6j7J7OUxmpxIO2mxd58NTlCb7HOAOfLLGdk7lRcwZeCxnjGRzb72tXlJgIEi3IoOYwcW0ft2cg7r/d6qA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@adobe/css-tools@4.5.0": + resolution: + { integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q== } + + "@aduh95/viz.js@3.4.0": + resolution: + { integrity: sha512-KI2nVf9JdwWCXqK6RVf+9/096G7VWN4Z84mnynlyZKao2xQENW8WNEjLmvdlxS5X8PNWXFC1zqwm7tveOXw/4A== } + + "@algolia/abtesting@1.1.0": + resolution: + { integrity: sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-abtesting@5.35.0": + resolution: + { integrity: sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-analytics@5.35.0": + resolution: + { integrity: sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-common@5.35.0": + resolution: + { integrity: sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-insights@5.35.0": + resolution: + { integrity: sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-personalization@5.35.0": + resolution: + { integrity: sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-query-suggestions@5.35.0": + resolution: + { integrity: sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w== } + engines: { node: ">= 14.0.0" } + + "@algolia/client-search@5.35.0": + resolution: + { integrity: sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg== } + engines: { node: ">= 14.0.0" } + + "@algolia/ingestion@1.35.0": + resolution: + { integrity: sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA== } + engines: { node: ">= 14.0.0" } + + "@algolia/monitoring@1.35.0": + resolution: + { integrity: sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw== } + engines: { node: ">= 14.0.0" } + + "@algolia/recommend@5.35.0": + resolution: + { integrity: sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ== } + engines: { node: ">= 14.0.0" } + + "@algolia/requester-browser-xhr@5.35.0": + resolution: + { integrity: sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw== } + engines: { node: ">= 14.0.0" } + + "@algolia/requester-fetch@5.35.0": + resolution: + { integrity: sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ== } + engines: { node: ">= 14.0.0" } + + "@algolia/requester-node-http@5.35.0": + resolution: + { integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ== } + engines: { node: ">= 14.0.0" } + + "@ampproject/remapping@2.3.0": + resolution: + { integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== } + engines: { node: ">=6.0.0" } + + "@angular-devkit/architect@0.2003.28": + resolution: + { integrity: sha512-1m5xewVT5TrT28lHKuh7dQBoSwx86Z/lUMyYmrQJcgPm0hdcprowc8CPr2MNi1+RoccnAbgPVcUpokmSqYZx4A== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } + + "@angular-devkit/architect@0.2102.15": + resolution: + { integrity: sha512-EZQXu6j7J7OUxmpxIO2mxd58NTlCb7HOAOfLLGdk7lRcwZeCxnjGRzb72tXlJgIEi3IoOYwcW0ft2cg7r/d6qA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } hasBin: true - '@angular-devkit/build-angular@20.3.28': - resolution: {integrity: sha512-D+OXO9Y69yNBlUMSXVKiJ2UjqCO8/bj7E8FX6sQVQpJZ/OlXgCx4A8R1PCRez/WL3K3RILh0GeohkBmBufd7Pg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/localize': ^20.0.0 - '@angular/platform-browser': ^20.0.0 - '@angular/platform-server': ^20.0.0 - '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.3.28 - '@web/test-runner': ^0.20.0 + "@angular-devkit/build-angular@20.3.28": + resolution: + { integrity: sha512-D+OXO9Y69yNBlUMSXVKiJ2UjqCO8/bj7E8FX6sQVQpJZ/OlXgCx4A8R1PCRez/WL3K3RILh0GeohkBmBufd7Pg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } + peerDependencies: + "@angular/compiler-cli": ^20.0.0 + "@angular/core": ^20.0.0 + "@angular/localize": ^20.0.0 + "@angular/platform-browser": ^20.0.0 + "@angular/platform-server": ^20.0.0 + "@angular/service-worker": ^20.0.0 + "@angular/ssr": ^20.3.28 + "@web/test-runner": ^0.20.0 browser-sync: ^3.0.2 jest: ^29.5.0 || ^30.2.0 jest-environment-jsdom: ^29.5.0 || ^30.2.0 @@ -511,21 +526,21 @@ packages: ng-packagr: ^20.0.0 protractor: ^7.0.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.8 <6.0' + typescript: ">=5.8 <6.0" peerDependenciesMeta: - '@angular/core': + "@angular/core": optional: true - '@angular/localize': + "@angular/localize": optional: true - '@angular/platform-browser': + "@angular/platform-browser": optional: true - '@angular/platform-server': + "@angular/platform-server": optional: true - '@angular/service-worker': + "@angular/service-worker": optional: true - '@angular/ssr': + "@angular/ssr": optional: true - '@web/test-runner': + "@web/test-runner": optional: true browser-sync: optional: true @@ -542,128 +557,143 @@ packages: tailwindcss: optional: true - '@angular-devkit/build-webpack@0.2003.28': - resolution: {integrity: sha512-pnSxHbIbyLfwNHqhBlJasalk8OYTFEEkwi6+O6qOdJW9qnrgoAYPWYqijNhuRdRnaXXF6nV2ggi3BDzRtG8VBA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/build-webpack@0.2003.28": + resolution: + { integrity: sha512-pnSxHbIbyLfwNHqhBlJasalk8OYTFEEkwi6+O6qOdJW9qnrgoAYPWYqijNhuRdRnaXXF6nV2ggi3BDzRtG8VBA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } peerDependencies: webpack: 5.105.0 webpack-dev-server: ^5.0.2 - '@angular-devkit/core@20.3.28': - resolution: {integrity: sha512-WwC7lm+Im3YVTugPLjOoNgjoYlAHzsVLY60jB9euyq5BdF8xB0L0LyhYHVWjEfkdddAiKPrdbLaRu6dMBPSc/w==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/core@20.3.28": + resolution: + { integrity: sha512-WwC7lm+Im3YVTugPLjOoNgjoYlAHzsVLY60jB9euyq5BdF8xB0L0LyhYHVWjEfkdddAiKPrdbLaRu6dMBPSc/w== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } peerDependencies: chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/core@21.1.0': - resolution: {integrity: sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/core@21.1.0": + resolution: + { integrity: sha512-dPfVy0CictDjWffRv4pGTPOFjdlJL3ZkGUqxzaosUjMbJW+Ai9cNn1VNr7zxYZ4kem3BxLBh1thzDsCPrkXlZA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } peerDependencies: chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/core@21.2.15': - resolution: {integrity: sha512-x7EwuQtMGHANVznHpwyEi/3lMo/kRoaxV2w7lXbRGjTezwv4SPaOBwhrIGCbAVFs5B1ziff4jZzors4owlCTgg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/core@21.2.15": + resolution: + { integrity: sha512-x7EwuQtMGHANVznHpwyEi/3lMo/kRoaxV2w7lXbRGjTezwv4SPaOBwhrIGCbAVFs5B1ziff4jZzors4owlCTgg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } peerDependencies: chokidar: ^5.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/schematics@20.3.28': - resolution: {integrity: sha512-12Jeu/0fboJXHRBy7Uo8/ZBVCv4DXZPwtY+RAIYaraHWd0kGk13S9DPG7VMFk+GK1J0mIuDDNIfw33f64L9ddQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/schematics@20.3.28": + resolution: + { integrity: sha512-12Jeu/0fboJXHRBy7Uo8/ZBVCv4DXZPwtY+RAIYaraHWd0kGk13S9DPG7VMFk+GK1J0mIuDDNIfw33f64L9ddQ== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } - '@angular-devkit/schematics@21.1.0': - resolution: {integrity: sha512-sVgTntCZCOV7mOpHzj6V14KOAoy4B9Ur9yHNRFZVgL2yD77TYRrJ0qwq+l7Im9fSjMCar6csjboqCvyAEpfV1g==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular-devkit/schematics@21.1.0": + resolution: + { integrity: sha512-sVgTntCZCOV7mOpHzj6V14KOAoy4B9Ur9yHNRFZVgL2yD77TYRrJ0qwq+l7Im9fSjMCar6csjboqCvyAEpfV1g== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } - '@angular-eslint/builder@20.7.0': - resolution: {integrity: sha512-qgf4Cfs1z0VsVpzF/OnxDRvBp60OIzeCsp4mzlckWYVniKo19EPIN6kFDol5eTAIOMPgiBQlMIwgQMHgocXEig==} + "@angular-eslint/builder@20.7.0": + resolution: + { integrity: sha512-qgf4Cfs1z0VsVpzF/OnxDRvBp60OIzeCsp4mzlckWYVniKo19EPIN6kFDol5eTAIOMPgiBQlMIwgQMHgocXEig== } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + typescript: "*" - '@angular-eslint/bundled-angular-compiler@20.7.0': - resolution: {integrity: sha512-9KPz24YoiL0SvTtTX6sd1zmysU5cKOCcmpEiXkCoO3L2oYZGlVxmMT4hfSaHMt8qmfvV2KzQMoR6DZM84BwRzQ==} + "@angular-eslint/bundled-angular-compiler@20.7.0": + resolution: + { integrity: sha512-9KPz24YoiL0SvTtTX6sd1zmysU5cKOCcmpEiXkCoO3L2oYZGlVxmMT4hfSaHMt8qmfvV2KzQMoR6DZM84BwRzQ== } - '@angular-eslint/eslint-plugin-template@20.7.0': - resolution: {integrity: sha512-WFmvW2vBR6ExsSKEaActQTteyw6ikWyuJau9XmWEPFd+2eusEt/+wO21ybjDn3uc5FTp1IcdhfYy+U5OdDjH5w==} + "@angular-eslint/eslint-plugin-template@20.7.0": + resolution: + { integrity: sha512-WFmvW2vBR6ExsSKEaActQTteyw6ikWyuJau9XmWEPFd+2eusEt/+wO21ybjDn3uc5FTp1IcdhfYy+U5OdDjH5w== } peerDependencies: - '@angular-eslint/template-parser': 20.7.0 - '@typescript-eslint/types': ^7.11.0 || ^8.0.0 - '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + "@angular-eslint/template-parser": 20.7.0 + "@typescript-eslint/types": ^7.11.0 || ^8.0.0 + "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + typescript: "*" - '@angular-eslint/eslint-plugin@20.7.0': - resolution: {integrity: sha512-aHH2YTiaonojsKN+y2z4IMugCwdsH/dYIjYBig6kfoSPyf9rGK4zx+gnNGq/pGRjF3bOYrmFgIviYpQVb80inQ==} + "@angular-eslint/eslint-plugin@20.7.0": + resolution: + { integrity: sha512-aHH2YTiaonojsKN+y2z4IMugCwdsH/dYIjYBig6kfoSPyf9rGK4zx+gnNGq/pGRjF3bOYrmFgIviYpQVb80inQ== } peerDependencies: - '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + typescript: "*" - '@angular-eslint/schematics@20.7.0': - resolution: {integrity: sha512-S0onfRipDUIL6gFGTFjiWwUDhi42XYrBoi3kJ3wBbKBeIgYv9SP1ppTKDD4ZoDaDU9cQE8nToX7iPn9ifMw6eQ==} + "@angular-eslint/schematics@20.7.0": + resolution: + { integrity: sha512-S0onfRipDUIL6gFGTFjiWwUDhi42XYrBoi3kJ3wBbKBeIgYv9SP1ppTKDD4ZoDaDU9cQE8nToX7iPn9ifMw6eQ== } - '@angular-eslint/template-parser@20.7.0': - resolution: {integrity: sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ==} + "@angular-eslint/template-parser@20.7.0": + resolution: + { integrity: sha512-CVskZnF38IIxVVlKWi1VCz7YH/gHMJu2IY9bD1AVoBBGIe0xA4FRXJkW2Y+EDs9vQqZTkZZljhK5gL65Ro1PeQ== } peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' + typescript: "*" - '@angular-eslint/utils@20.7.0': - resolution: {integrity: sha512-B6EJHbsk2W/lnS3kS/gm56VGvX735419z/DzgbRDcOvqMGMLwD1ILzv5OTEcL1rzpnB0AHW+IxOu6y/aCzSNUA==} + "@angular-eslint/utils@20.7.0": + resolution: + { integrity: sha512-B6EJHbsk2W/lnS3kS/gm56VGvX735419z/DzgbRDcOvqMGMLwD1ILzv5OTEcL1rzpnB0AHW+IxOu6y/aCzSNUA== } peerDependencies: - '@typescript-eslint/utils': ^7.11.0 || ^8.0.0 + "@typescript-eslint/utils": ^7.11.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - - '@angular/animations@20.3.25': - resolution: {integrity: sha512-lQmti3tI85D525TjUVGqCNLzFxSUoZg+vgIyvuGJZPY0UU/o2S6KAxW6ObmcRotZZHNfenLHIxWgzamBDjIjuw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - deprecated: '@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations.' - peerDependencies: - '@angular/core': 20.3.25 - - '@angular/build@20.3.28': - resolution: {integrity: sha512-qPMS9NAkOlaE+F7QieAbHzK5Fd7TEE8BXo8Y0GIkvbAaS1twiq6rmMbVZ54/pVE7lyzj5VcpYkBO+MREDdbyAA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler': ^20.0.0 - '@angular/compiler-cli': ^20.0.0 - '@angular/core': ^20.0.0 - '@angular/localize': ^20.0.0 - '@angular/platform-browser': ^20.0.0 - '@angular/platform-server': ^20.0.0 - '@angular/service-worker': ^20.0.0 - '@angular/ssr': ^20.3.28 + typescript: "*" + + "@angular/animations@20.3.25": + resolution: + { integrity: sha512-lQmti3tI85D525TjUVGqCNLzFxSUoZg+vgIyvuGJZPY0UU/o2S6KAxW6ObmcRotZZHNfenLHIxWgzamBDjIjuw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + deprecated: "@angular/animations is deprecated. Use `animate.enter` and `animate.leave` instead. For more information see: https://v22.angular.dev/guide/animations." + peerDependencies: + "@angular/core": 20.3.25 + + "@angular/build@20.3.28": + resolution: + { integrity: sha512-qPMS9NAkOlaE+F7QieAbHzK5Fd7TEE8BXo8Y0GIkvbAaS1twiq6rmMbVZ54/pVE7lyzj5VcpYkBO+MREDdbyAA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } + peerDependencies: + "@angular/compiler": ^20.0.0 + "@angular/compiler-cli": ^20.0.0 + "@angular/core": ^20.0.0 + "@angular/localize": ^20.0.0 + "@angular/platform-browser": ^20.0.0 + "@angular/platform-server": ^20.0.0 + "@angular/service-worker": ^20.0.0 + "@angular/ssr": ^20.3.28 karma: ^6.4.0 less: ^4.2.0 ng-packagr: ^20.0.0 postcss: ^8.4.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.8 <6.0' + typescript: ">=5.8 <6.0" vitest: ^3.1.1 peerDependenciesMeta: - '@angular/core': + "@angular/core": optional: true - '@angular/localize': + "@angular/localize": optional: true - '@angular/platform-browser': + "@angular/platform-browser": optional: true - '@angular/platform-server': + "@angular/platform-server": optional: true - '@angular/service-worker': + "@angular/service-worker": optional: true - '@angular/ssr': + "@angular/ssr": optional: true karma: optional: true @@ -678,2380 +708,2828 @@ packages: vitest: optional: true - '@angular/cdk@20.2.14': - resolution: {integrity: sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg==} + "@angular/cdk@20.2.14": + resolution: + { integrity: sha512-7bZxc01URbiPiIBWThQ69XwOxVduqEKN4PhpbF2AAyfMc/W8Hcr4VoIJOwL0O1Nkq5beS8pCAqoOeIgFyXd/kg== } peerDependencies: - '@angular/common': ^20.0.0 || ^21.0.0 - '@angular/core': ^20.0.0 || ^21.0.0 + "@angular/common": ^20.0.0 || ^21.0.0 + "@angular/core": ^20.0.0 || ^21.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/cli@20.3.28': - resolution: {integrity: sha512-fyNYIsBSdSZRfjOGLO9k4arRzJNbiEFGt0B6ZCMCUuVXSrkBxzG8hXUqxb8VfvonteE4qc+1UPS20SDL1BtP3A==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular/cli@20.3.28": + resolution: + { integrity: sha512-fyNYIsBSdSZRfjOGLO9k4arRzJNbiEFGt0B6ZCMCUuVXSrkBxzG8hXUqxb8VfvonteE4qc+1UPS20SDL1BtP3A== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } hasBin: true - '@angular/common@20.3.25': - resolution: {integrity: sha512-rnRGcXbjet0DHgkRL4Dqxk21G2T4UypVfiTV/fay58H8w9U89PJ1L6gRmk8B/uyfpii/9r23cBwnpcguQykxYw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/common@20.3.25": + resolution: + { integrity: sha512-rnRGcXbjet0DHgkRL4Dqxk21G2T4UypVfiTV/fay58H8w9U89PJ1L6gRmk8B/uyfpii/9r23cBwnpcguQykxYw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } peerDependencies: - '@angular/core': 20.3.25 + "@angular/core": 20.3.25 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@20.3.25': - resolution: {integrity: sha512-iqxwVo5Pgzt3EfT49OZ6plxA6KKxwv7ixx1XNH7QRvaOJC9gmsPScWpx+LO7ZsVZdo/NkA+rnXDl0PauUgGciw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/compiler-cli@20.3.25": + resolution: + { integrity: sha512-iqxwVo5Pgzt3EfT49OZ6plxA6KKxwv7ixx1XNH7QRvaOJC9gmsPScWpx+LO7ZsVZdo/NkA+rnXDl0PauUgGciw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } hasBin: true peerDependencies: - '@angular/compiler': 20.3.25 - typescript: '>=5.8 <6.0' + "@angular/compiler": 20.3.25 + typescript: ">=5.8 <6.0" peerDependenciesMeta: typescript: optional: true - '@angular/compiler@20.3.25': - resolution: {integrity: sha512-TSh6gVoQqlLPqWwsYMK0lfVEQYENQO+USzS+BHFXEHFfgBRap6qDpIUGnRdj0Y2PlaVJUVFbeq1855EZUPUEoA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/compiler@20.3.25": + resolution: + { integrity: sha512-TSh6gVoQqlLPqWwsYMK0lfVEQYENQO+USzS+BHFXEHFfgBRap6qDpIUGnRdj0Y2PlaVJUVFbeq1855EZUPUEoA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } - '@angular/core@20.3.25': - resolution: {integrity: sha512-B4XnnR5jzikZDvZ4PjwjAWZMT14dxrKrmJdwa/n0yp7rMPkIJTKF6ZJMg4d1pLWLLSsc2oWHioN3UrWlGqIKnA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/core@20.3.25": + resolution: + { integrity: sha512-B4XnnR5jzikZDvZ4PjwjAWZMT14dxrKrmJdwa/n0yp7rMPkIJTKF6ZJMg4d1pLWLLSsc2oWHioN3UrWlGqIKnA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } peerDependencies: - '@angular/compiler': 20.3.25 + "@angular/compiler": 20.3.25 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 peerDependenciesMeta: - '@angular/compiler': + "@angular/compiler": optional: true zone.js: optional: true - '@angular/forms@20.3.25': - resolution: {integrity: sha512-vGRo1LVPFo2Cu0k+QyDTlsBv5UbN0c3Et2YMS+43oyi1c4keocntBccOjLyM5C0kpMz4+pP81MqqYpAWu2k+TQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/forms@20.3.25": + resolution: + { integrity: sha512-vGRo1LVPFo2Cu0k+QyDTlsBv5UbN0c3Et2YMS+43oyi1c4keocntBccOjLyM5C0kpMz4+pP81MqqYpAWu2k+TQ== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } peerDependencies: - '@angular/common': 20.3.25 - '@angular/core': 20.3.25 - '@angular/platform-browser': 20.3.25 + "@angular/common": 20.3.25 + "@angular/core": 20.3.25 + "@angular/platform-browser": 20.3.25 rxjs: ^6.5.3 || ^7.4.0 - '@angular/language-service@20.3.25': - resolution: {integrity: sha512-3PZUwbDUVQXk9BLSiNUpDxTnRXGR3szwK9QFQaGDt8lhmLYaQLh3VJsY0FHDRghHZYIGR2P2MbVxGQHytF+IPw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/language-service@20.3.25": + resolution: + { integrity: sha512-3PZUwbDUVQXk9BLSiNUpDxTnRXGR3szwK9QFQaGDt8lhmLYaQLh3VJsY0FHDRghHZYIGR2P2MbVxGQHytF+IPw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } - '@angular/material@20.2.14': - resolution: {integrity: sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA==} + "@angular/material@20.2.14": + resolution: + { integrity: sha512-IbAgV6XLsvmHiJzxycVhcNC1PA4M30qi+ERCOir6cT333Bxm8vDV32gsOjfL52uzG5YRARroPC+8s1XqR2oxeA== } peerDependencies: - '@angular/cdk': 20.2.14 - '@angular/common': ^20.0.0 || ^21.0.0 - '@angular/core': ^20.0.0 || ^21.0.0 - '@angular/forms': ^20.0.0 || ^21.0.0 - '@angular/platform-browser': ^20.0.0 || ^21.0.0 + "@angular/cdk": 20.2.14 + "@angular/common": ^20.0.0 || ^21.0.0 + "@angular/core": ^20.0.0 || ^21.0.0 + "@angular/forms": ^20.0.0 || ^21.0.0 + "@angular/platform-browser": ^20.0.0 || ^21.0.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/platform-browser-dynamic@20.3.25': - resolution: {integrity: sha512-3Ku+IsN4tQPVBsw75SoLbLf7TsXAGL0rGPHSsyNYFhG2ZZeQuYNIAi8mc4cwz/qMDnuassHFrCxuLDgN6Yab5w==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - deprecated: '@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead.' - peerDependencies: - '@angular/common': 20.3.25 - '@angular/compiler': 20.3.25 - '@angular/core': 20.3.25 - '@angular/platform-browser': 20.3.25 - - '@angular/platform-browser@20.3.25': - resolution: {integrity: sha512-0k06U/AJRQifGMLkcU3R9uEHWbuKEzkKMuKcGagXTrkeFvCG2Ub4JdsbcjFNWB2bspWgaxIMSceuj7c83U5wOA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@angular/animations': 20.3.25 - '@angular/common': 20.3.25 - '@angular/core': 20.3.25 + "@angular/platform-browser-dynamic@20.3.25": + resolution: + { integrity: sha512-3Ku+IsN4tQPVBsw75SoLbLf7TsXAGL0rGPHSsyNYFhG2ZZeQuYNIAi8mc4cwz/qMDnuassHFrCxuLDgN6Yab5w== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + deprecated: "@angular/platform-browser-dynamic is deprecated. Use `@angular/platform-browser` instead." + peerDependencies: + "@angular/common": 20.3.25 + "@angular/compiler": 20.3.25 + "@angular/core": 20.3.25 + "@angular/platform-browser": 20.3.25 + + "@angular/platform-browser@20.3.25": + resolution: + { integrity: sha512-0k06U/AJRQifGMLkcU3R9uEHWbuKEzkKMuKcGagXTrkeFvCG2Ub4JdsbcjFNWB2bspWgaxIMSceuj7c83U5wOA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + peerDependencies: + "@angular/animations": 20.3.25 + "@angular/common": 20.3.25 + "@angular/core": 20.3.25 peerDependenciesMeta: - '@angular/animations': + "@angular/animations": optional: true - '@angular/pwa@20.3.28': - resolution: {integrity: sha512-LEeHSmlQkNEvamZy+SnLohy/FL5LHs7p59xLfO713J5DuXV6fwYIb406Cw3icsinJV2tikKl7kcKjc+YJefSQg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + "@angular/pwa@20.3.28": + resolution: + { integrity: sha512-LEeHSmlQkNEvamZy+SnLohy/FL5LHs7p59xLfO713J5DuXV6fwYIb406Cw3icsinJV2tikKl7kcKjc+YJefSQg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } peerDependencies: - '@angular/cli': ^20.3.28 + "@angular/cli": ^20.3.28 peerDependenciesMeta: - '@angular/cli': + "@angular/cli": optional: true - '@angular/router@20.3.25': - resolution: {integrity: sha512-YIjLHWAufTaukNj15hEoys29e7XNhnCRsS1/95h/OqR69R3adbB8hV7ut7gO6XdXokriYqb4gtoUjoESxR+xFQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/router@20.3.25": + resolution: + { integrity: sha512-YIjLHWAufTaukNj15hEoys29e7XNhnCRsS1/95h/OqR69R3adbB8hV7ut7gO6XdXokriYqb4gtoUjoESxR+xFQ== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } peerDependencies: - '@angular/common': 20.3.25 - '@angular/core': 20.3.25 - '@angular/platform-browser': 20.3.25 + "@angular/common": 20.3.25 + "@angular/core": 20.3.25 + "@angular/platform-browser": 20.3.25 rxjs: ^6.5.3 || ^7.4.0 - '@angular/service-worker@20.3.25': - resolution: {integrity: sha512-E9fS9/dukaoOaXxaa6l2BNFvOIJS1j+t+h7ZqU2PITbSqB4F8Go4XBA1bvXBKYcJUX6oaByD0Mu2yy3+mznjGQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@angular/service-worker@20.3.25": + resolution: + { integrity: sha512-E9fS9/dukaoOaXxaa6l2BNFvOIJS1j+t+h7ZqU2PITbSqB4F8Go4XBA1bvXBKYcJUX6oaByD0Mu2yy3+mznjGQ== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } hasBin: true peerDependencies: - '@angular/core': 20.3.25 + "@angular/core": 20.3.25 rxjs: ^6.5.3 || ^7.4.0 - '@arr/every@1.0.1': - resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} - engines: {node: '>=4'} - - '@auth0/auth0-auth-js@1.7.0': - resolution: {integrity: sha512-SxF5WcPehbLOPwGrM+mqqVhnwZ3ZHEfM2wI/Yc3h0Kn1MM78seegxj7PrKoEMMRIfslDyHG+UNlOuobY8YOcKg==} - - '@auth0/auth0-spa-js@2.21.1': - resolution: {integrity: sha512-Z4HfUZ/bSJLjobcWvRzh762jsJjXZdqh4Lmu+Ho8qNfldL6B+6RUMw3BJmwRMiWPoeLFvL25eTAMCxaLiULFSQ==} - - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-cognito-identity@3.1068.0': - resolution: {integrity: sha512-by2Qj3f9BI9X4cY0n160R3uzkMpI6k9PmGA8QLAuzr8HzkiNrYFygMEPhIEdqBFHQPD/8AXNUs45HYjEDsQ33g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.974.20': - resolution: {integrity: sha512-7sDi2B2N3mc3nf1nz6FyEx/FCrJ1N1QnBmraHHQNabFaeAh2IaOOLml48/rHOD1bICHgTRkbBgNTvUzEr5Z35g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-cognito-identity@3.972.45': - resolution: {integrity: sha512-4L/REssieLON1hVsTzZucP1p2u5jmPNejyh/9BCGZXr93IalBbhRPCrtKIKwMTu9yRGr/bcKzhrQocByKLSzLQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-env@3.972.46': - resolution: {integrity: sha512-+GPXVS2srMOlH74S+SmC1gVuP2TvUZ0siuC0onKO93q+udP+M72dmY8wJfVQ5CX9z/9X5A1HHwz5yRIGBtskvQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.972.48': - resolution: {integrity: sha512-fA5loSdlocacRxyUXtpoHSMuk5rsIKRDzQYVMnMxjcmFeZshaJlJ8lymy/hYKji6sne/UmNGj5pxuEs6kq/Qcg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-ini@3.972.53': - resolution: {integrity: sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-login@3.972.52': - resolution: {integrity: sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-node@3.972.55': - resolution: {integrity: sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-process@3.972.46': - resolution: {integrity: sha512-VUoNFBIjWrUN8NbFiQiuxQEgFjvziAlBRPK+ddh27aj65gk0BYu6bLZnrdrNZwpW6vAihtSUtEMQ1PUJ32QRPA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-sso@3.972.52': - resolution: {integrity: sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.972.52': - resolution: {integrity: sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-providers@3.1068.0': - resolution: {integrity: sha512-DN7UewD/XKGfNGWXZsTECWRj3IsULkE7aG+fPwqPf13CnX4UmNvj80g1xieJ0lVdMQ2h0L3gZpn2ClIY06+/vQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/nested-clients@3.997.20': - resolution: {integrity: sha512-IYJuLpXp2DEILVQpQOy0PMpkftv0AHEOCn52o0atyOaumA0CdWQ3klPyXdViGYLbNpESsVFMVybvHUeZAuiGxA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.996.34': - resolution: {integrity: sha512-mx1L5qlumSOt/nKM3BFaHE2HVkWwz0i4Bw0pyYO42FfX/FeLlo8YI6csC0gSPprEk6fTIqI+CZN9RwUwKd5krQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/token-providers@3.1066.0': - resolution: {integrity: sha512-UqEUJq7dqa44hneLDUcX7UJy95cg8YqEWyakRpvIPnrNS3Mq+UlQHgCDGu5pvwAPtlIW4qcYbvW6reG6++FyvA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.12': - resolution: {integrity: sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-locate-window@3.965.7': - resolution: {integrity: sha512-M0D6oIpohdNHjc7udzTHEQyot0+0iuA36jc2I9Hps+f/GtKi2HO/pyijQnCnNcwZqLB5+rtn81z3eZK/GyjAmA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/xml-builder@3.972.29': - resolution: {integrity: sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ==} - engines: {node: '>=20.0.0'} - - '@aws/lambda-invoke-store@0.2.4': - resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} - engines: {node: '>=18.0.0'} - - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.3': - resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.6': - resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.29.7': - resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.29.7': - resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.29.7': - resolution: {integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.8': - resolution: {integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.29.7': - resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.29.7': - resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.29.7': - resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.29.7': - resolution: {integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.29.7': - resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': - resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.29.7': - resolution: {integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} - engines: {node: '>=6.0.0'} + "@arr/every@1.0.1": + resolution: + { integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg== } + engines: { node: ">=4" } + + "@auth0/auth0-auth-js@1.7.0": + resolution: + { integrity: sha512-SxF5WcPehbLOPwGrM+mqqVhnwZ3ZHEfM2wI/Yc3h0Kn1MM78seegxj7PrKoEMMRIfslDyHG+UNlOuobY8YOcKg== } + + "@auth0/auth0-spa-js@2.21.1": + resolution: + { integrity: sha512-Z4HfUZ/bSJLjobcWvRzh762jsJjXZdqh4Lmu+Ho8qNfldL6B+6RUMw3BJmwRMiWPoeLFvL25eTAMCxaLiULFSQ== } + + "@aws-crypto/crc32@5.2.0": + resolution: + { integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== } + engines: { node: ">=16.0.0" } + + "@aws-crypto/sha256-browser@5.2.0": + resolution: + { integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== } + + "@aws-crypto/sha256-js@5.2.0": + resolution: + { integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== } + engines: { node: ">=16.0.0" } + + "@aws-crypto/supports-web-crypto@5.2.0": + resolution: + { integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== } + + "@aws-crypto/util@5.2.0": + resolution: + { integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== } + + "@aws-sdk/client-cognito-identity@3.1068.0": + resolution: + { integrity: sha512-by2Qj3f9BI9X4cY0n160R3uzkMpI6k9PmGA8QLAuzr8HzkiNrYFygMEPhIEdqBFHQPD/8AXNUs45HYjEDsQ33g== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/core@3.974.20": + resolution: + { integrity: sha512-7sDi2B2N3mc3nf1nz6FyEx/FCrJ1N1QnBmraHHQNabFaeAh2IaOOLml48/rHOD1bICHgTRkbBgNTvUzEr5Z35g== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-cognito-identity@3.972.45": + resolution: + { integrity: sha512-4L/REssieLON1hVsTzZucP1p2u5jmPNejyh/9BCGZXr93IalBbhRPCrtKIKwMTu9yRGr/bcKzhrQocByKLSzLQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-env@3.972.46": + resolution: + { integrity: sha512-+GPXVS2srMOlH74S+SmC1gVuP2TvUZ0siuC0onKO93q+udP+M72dmY8wJfVQ5CX9z/9X5A1HHwz5yRIGBtskvQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-http@3.972.48": + resolution: + { integrity: sha512-fA5loSdlocacRxyUXtpoHSMuk5rsIKRDzQYVMnMxjcmFeZshaJlJ8lymy/hYKji6sne/UmNGj5pxuEs6kq/Qcg== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-ini@3.972.53": + resolution: + { integrity: sha512-ZfdhIOR41q8TcWEnUac+gCOb+O2LBWdHLmjedXpXz4IEFW2ppNuFcm6p0sMTavpM+zD5TYfpH5Gp7guRyqSgsQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-login@3.972.52": + resolution: + { integrity: sha512-9hu2oR0qH7Fst5Tzdx+UWxm+w5zCXtErTLtOOW5hwwQc170CLwOeniRxyFY6s9mHfGEfC5zFukNBdKBwJR8mhQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-node@3.972.55": + resolution: + { integrity: sha512-zMGLa/dhESVqmCD7mmIFFKSwSFrJGScvCXcjvBZEVOOMauFS5JRQvLTMukFpMEFWiV6dTAlsen2ATDBulLPtbg== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-process@3.972.46": + resolution: + { integrity: sha512-VUoNFBIjWrUN8NbFiQiuxQEgFjvziAlBRPK+ddh27aj65gk0BYu6bLZnrdrNZwpW6vAihtSUtEMQ1PUJ32QRPA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-sso@3.972.52": + resolution: + { integrity: sha512-nb2/n4o/HQf+FVpVbZe9vCTFngmuDoIsltMgLAtjixaKzvzhB4J8WSDFyWgnErgLHk55ctWH+I4PU+LIHhyffg== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-provider-web-identity@3.972.52": + resolution: + { integrity: sha512-lKj6aRSGbqLmpYmM24bY7a1Xmfcq2vkE3hv8CSPYfc1yCu0BPu/XEJ1L4Fm61MsU6ULLNSG8UGsffNoFUBjESA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/credential-providers@3.1068.0": + resolution: + { integrity: sha512-DN7UewD/XKGfNGWXZsTECWRj3IsULkE7aG+fPwqPf13CnX4UmNvj80g1xieJ0lVdMQ2h0L3gZpn2ClIY06+/vQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/nested-clients@3.997.20": + resolution: + { integrity: sha512-IYJuLpXp2DEILVQpQOy0PMpkftv0AHEOCn52o0atyOaumA0CdWQ3klPyXdViGYLbNpESsVFMVybvHUeZAuiGxA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/signature-v4-multi-region@3.996.34": + resolution: + { integrity: sha512-mx1L5qlumSOt/nKM3BFaHE2HVkWwz0i4Bw0pyYO42FfX/FeLlo8YI6csC0gSPprEk6fTIqI+CZN9RwUwKd5krQ== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/token-providers@3.1066.0": + resolution: + { integrity: sha512-UqEUJq7dqa44hneLDUcX7UJy95cg8YqEWyakRpvIPnrNS3Mq+UlQHgCDGu5pvwAPtlIW4qcYbvW6reG6++FyvA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/types@3.973.12": + resolution: + { integrity: sha512-43ajd1NF0RMgX5k0hxCNUyEdrtFUsb2aHT2QvpktSC/2Eyb2Jr/JPVqdp0XIoaHWikZJq5tNWSLO6kB5q2eMCA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/util-locate-window@3.965.7": + resolution: + { integrity: sha512-M0D6oIpohdNHjc7udzTHEQyot0+0iuA36jc2I9Hps+f/GtKi2HO/pyijQnCnNcwZqLB5+rtn81z3eZK/GyjAmA== } + engines: { node: ">=20.0.0" } + + "@aws-sdk/xml-builder@3.972.29": + resolution: + { integrity: sha512-fk0niuGFxfi8yIJuMVM4mhwObkiQSuwZFj3tAPrLVx64Pk3BkrEIpqjzHKY4hKoEBUD6Jg/S74Zj9jy+5F3DnQ== } + engines: { node: ">=20.0.0" } + + "@aws/lambda-invoke-store@0.2.4": + resolution: + { integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ== } + engines: { node: ">=18.0.0" } + + "@babel/code-frame@7.29.7": + resolution: + { integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.29.7": + resolution: + { integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== } + engines: { node: ">=6.9.0" } + + "@babel/core@7.28.3": + resolution: + { integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== } + engines: { node: ">=6.9.0" } + + "@babel/core@7.28.6": + resolution: + { integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw== } + engines: { node: ">=6.9.0" } + + "@babel/core@7.29.7": + resolution: + { integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.28.3": + resolution: + { integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.29.7": + resolution: + { integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ== } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.27.3": + resolution: + { integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.29.7": + resolution: + { integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.29.7": + resolution: + { integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.29.7": + resolution: + { integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-create-regexp-features-plugin@7.29.7": + resolution: + { integrity: sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-define-polyfill-provider@0.6.8": + resolution: + { integrity: sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== } + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + "@babel/helper-globals@7.29.7": + resolution: + { integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== } + engines: { node: ">=6.9.0" } + + "@babel/helper-member-expression-to-functions@7.29.7": + resolution: + { integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.29.7": + resolution: + { integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.29.7": + resolution: + { integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.29.7": + resolution: + { integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.29.7": + resolution: + { integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-remap-async-to-generator@7.29.7": + resolution: + { integrity: sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-replace-supers@7.29.7": + resolution: + { integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-skip-transparent-expression-wrappers@7.29.7": + resolution: + { integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== } + engines: { node: ">=6.9.0" } + + "@babel/helper-split-export-declaration@7.24.7": + resolution: + { integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.29.7": + resolution: + { integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.29.7": + resolution: + { integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.29.7": + resolution: + { integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-wrap-function@7.29.7": + resolution: + { integrity: sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.29.7": + resolution: + { integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.29.7": + resolution: + { integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg== } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7': - resolution: {integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7": + resolution: + { integrity: sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7': - resolution: {integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7": + resolution: + { integrity: sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7': - resolution: {integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7": + resolution: + { integrity: sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7': - resolution: {integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7": + resolution: + { integrity: sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.13.0 + "@babel/core": ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7': - resolution: {integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7": + resolution: + { integrity: sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + resolution: + { integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + "@babel/plugin-syntax-async-generators@7.8.4": + resolution: + { integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + "@babel/plugin-syntax-bigint@7.8.3": + resolution: + { integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + "@babel/plugin-syntax-class-properties@7.12.13": + resolution: + { integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-class-static-block@7.14.5": + resolution: + { integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.29.7': - resolution: {integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-import-assertions@7.29.7": + resolution: + { integrity: sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.29.7': - resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-import-attributes@7.29.7": + resolution: + { integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + "@babel/plugin-syntax-import-meta@7.10.4": + resolution: + { integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + "@babel/plugin-syntax-json-strings@7.8.3": + resolution: + { integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.29.7': - resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-jsx@7.29.7": + resolution: + { integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + "@babel/plugin-syntax-logical-assignment-operators@7.10.4": + resolution: + { integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3": + resolution: + { integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + "@babel/plugin-syntax-numeric-separator@7.10.4": + resolution: + { integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + "@babel/plugin-syntax-object-rest-spread@7.8.3": + resolution: + { integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + "@babel/plugin-syntax-optional-catch-binding@7.8.3": + resolution: + { integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + "@babel/plugin-syntax-optional-chaining@7.8.3": + resolution: + { integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-private-property-in-object@7.14.5": + resolution: + { integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-top-level-await@7.14.5": + resolution: + { integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.29.7': - resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-typescript@7.29.7": + resolution: + { integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-syntax-unicode-sets-regex@7.18.6": + resolution: + { integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.29.7': - resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-arrow-functions@7.29.7": + resolution: + { integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-generator-functions@7.28.0": + resolution: + { integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.29.7': - resolution: {integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-generator-functions@7.29.7": + resolution: + { integrity: sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-to-generator@7.27.1": + resolution: + { integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.29.7': - resolution: {integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-to-generator@7.29.7": + resolution: + { integrity: sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.29.7': - resolution: {integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-block-scoped-functions@7.29.7": + resolution: + { integrity: sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.29.7': - resolution: {integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-block-scoping@7.29.7": + resolution: + { integrity: sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.29.7': - resolution: {integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-class-properties@7.29.7": + resolution: + { integrity: sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.29.7': - resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-class-static-block@7.29.7": + resolution: + { integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.12.0 + "@babel/core": ^7.12.0 - '@babel/plugin-transform-classes@7.29.7': - resolution: {integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-classes@7.29.7": + resolution: + { integrity: sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.29.7': - resolution: {integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-computed-properties@7.29.7": + resolution: + { integrity: sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.29.7': - resolution: {integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-destructuring@7.29.7": + resolution: + { integrity: sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.29.7': - resolution: {integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-dotall-regex@7.29.7": + resolution: + { integrity: sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.29.7': - resolution: {integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-duplicate-keys@7.29.7": + resolution: + { integrity: sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7': - resolution: {integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7": + resolution: + { integrity: sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.29.7': - resolution: {integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-dynamic-import@7.29.7": + resolution: + { integrity: sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.29.7': - resolution: {integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-explicit-resource-management@7.29.7": + resolution: + { integrity: sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.29.7': - resolution: {integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-exponentiation-operator@7.29.7": + resolution: + { integrity: sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.29.7': - resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-export-namespace-from@7.29.7": + resolution: + { integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-for-of@7.29.7': - resolution: {integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-for-of@7.29.7": + resolution: + { integrity: sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-function-name@7.29.7': - resolution: {integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-function-name@7.29.7": + resolution: + { integrity: sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.29.7': - resolution: {integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-json-strings@7.29.7": + resolution: + { integrity: sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-literals@7.29.7': - resolution: {integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-literals@7.29.7": + resolution: + { integrity: sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.29.7': - resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-logical-assignment-operators@7.29.7": + resolution: + { integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.29.7': - resolution: {integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-member-expression-literals@7.29.7": + resolution: + { integrity: sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.29.7': - resolution: {integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-amd@7.29.7": + resolution: + { integrity: sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.29.7': - resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-commonjs@7.29.7": + resolution: + { integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.7': - resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-systemjs@7.29.7": + resolution: + { integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.29.7': - resolution: {integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-umd@7.29.7": + resolution: + { integrity: sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7': - resolution: {integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-named-capturing-groups-regex@7.29.7": + resolution: + { integrity: sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-new-target@7.29.7': - resolution: {integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-new-target@7.29.7": + resolution: + { integrity: sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': - resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-nullish-coalescing-operator@7.29.7": + resolution: + { integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.29.7': - resolution: {integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-numeric-separator@7.29.7": + resolution: + { integrity: sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.29.7': - resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-object-rest-spread@7.29.7": + resolution: + { integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-object-super@7.29.7': - resolution: {integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-object-super@7.29.7": + resolution: + { integrity: sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.29.7': - resolution: {integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-optional-catch-binding@7.29.7": + resolution: + { integrity: sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.29.7': - resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-optional-chaining@7.29.7": + resolution: + { integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-parameters@7.29.7': - resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-parameters@7.29.7": + resolution: + { integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-private-methods@7.28.6": + resolution: + { integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.29.7': - resolution: {integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-private-property-in-object@7.29.7": + resolution: + { integrity: sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.29.7': - resolution: {integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-property-literals@7.29.7": + resolution: + { integrity: sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.7': - resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-regenerator@7.29.7": + resolution: + { integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.29.7': - resolution: {integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-regexp-modifiers@7.29.7": + resolution: + { integrity: sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-reserved-words@7.29.7': - resolution: {integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-reserved-words@7.29.7": + resolution: + { integrity: sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-runtime@7.28.3': - resolution: {integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-runtime@7.28.3": + resolution: + { integrity: sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.29.7': - resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-shorthand-properties@7.29.7": + resolution: + { integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-spread@7.29.7': - resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-spread@7.29.7": + resolution: + { integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.29.7': - resolution: {integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-sticky-regex@7.29.7": + resolution: + { integrity: sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.29.7': - resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-template-literals@7.29.7": + resolution: + { integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.29.7': - resolution: {integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-typeof-symbol@7.29.7": + resolution: + { integrity: sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.29.7': - resolution: {integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-escapes@7.29.7": + resolution: + { integrity: sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.29.7': - resolution: {integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-property-regex@7.29.7": + resolution: + { integrity: sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.29.7': - resolution: {integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-regex@7.29.7": + resolution: + { integrity: sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.29.7': - resolution: {integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-sets-regex@7.29.7": + resolution: + { integrity: sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/preset-env@7.28.3': - resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} - engines: {node: '>=6.9.0'} + "@babel/preset-env@7.28.3": + resolution: + { integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/preset-env@7.28.6': - resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} - engines: {node: '>=6.9.0'} + "@babel/preset-env@7.28.6": + resolution: + { integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + "@babel/preset-modules@0.1.6-no-external-plugins": + resolution: + { integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== } peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.28.3': - resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} - engines: {node: '>=6.9.0'} + "@babel/runtime@7.28.3": + resolution: + { integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== } + engines: { node: ">=6.9.0" } - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} + "@babel/runtime@7.29.7": + resolution: + { integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== } + engines: { node: ">=6.9.0" } - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} + "@babel/template@7.29.7": + resolution: + { integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== } + engines: { node: ">=6.9.0" } - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} - engines: {node: '>=6.9.0'} + "@babel/traverse@7.29.7": + resolution: + { integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw== } + engines: { node: ">=6.9.0" } - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} - engines: {node: '>=6.9.0'} + "@babel/types@7.29.7": + resolution: + { integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA== } + engines: { node: ">=6.9.0" } - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + "@bcoe/v8-coverage@0.2.3": + resolution: + { integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== } - '@biblionexus-foundation/scripture-utilities@0.0.7': - resolution: {integrity: sha512-1PqRGamRokIQ4NeoJMCjahGRtQKQzMssyTwHUn35Ph26oXnANdhwcxk5xiZFnSPoGUfv2J47B8NfOuMQFok94A==} + "@biblionexus-foundation/scripture-utilities@0.0.7": + resolution: + { integrity: sha512-1PqRGamRokIQ4NeoJMCjahGRtQKQzMssyTwHUn35Ph26oXnANdhwcxk5xiZFnSPoGUfv2J47B8NfOuMQFok94A== } - '@bugsnag/browser@7.25.0': - resolution: {integrity: sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==} + "@bugsnag/browser@7.25.0": + resolution: + { integrity: sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA== } - '@bugsnag/core@7.25.0': - resolution: {integrity: sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==} + "@bugsnag/core@7.25.0": + resolution: + { integrity: sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ== } - '@bugsnag/cuid@3.2.2': - resolution: {integrity: sha512-7onuYLTMqMmHE9BBPG0YER4nFsU1rB+me1/YIeMusqcLbVbKKuG9u9+BDVDpje5e0llkkrVNOKYwmzM9DRIo7A==} + "@bugsnag/cuid@3.2.2": + resolution: + { integrity: sha512-7onuYLTMqMmHE9BBPG0YER4nFsU1rB+me1/YIeMusqcLbVbKKuG9u9+BDVDpje5e0llkkrVNOKYwmzM9DRIo7A== } - '@bugsnag/js@7.25.0': - resolution: {integrity: sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==} + "@bugsnag/js@7.25.0": + resolution: + { integrity: sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg== } - '@bugsnag/node@7.25.0': - resolution: {integrity: sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==} + "@bugsnag/node@7.25.0": + resolution: + { integrity: sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA== } - '@bugsnag/safe-json-stringify@6.1.0': - resolution: {integrity: sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A==} + "@bugsnag/safe-json-stringify@6.1.0": + resolution: + { integrity: sha512-ImA35rnM7bGr+J30R979FQ95BhRB4UO1KfJA0J2sVqc8nwnrS9hhE5mkTmQWMs8Vh1Da+hkLKs5jJB4JjNZp4A== } - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} + "@colors/colors@1.5.0": + resolution: + { integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== } + engines: { node: ">=0.1.90" } - '@compodoc/compodoc@1.2.1': - resolution: {integrity: sha512-won7I0OeFM0zSi+cwVilwtLA7VpY9NzsBch6+gGElYQdbM4/01XgA//leF8EsNzhxuQb+kP86MqJ3loZhz+Big==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + "@compodoc/compodoc@1.2.1": + resolution: + { integrity: sha512-won7I0OeFM0zSi+cwVilwtLA7VpY9NzsBch6+gGElYQdbM4/01XgA//leF8EsNzhxuQb+kP86MqJ3loZhz+Big== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } hasBin: true - '@compodoc/live-server@1.2.3': - resolution: {integrity: sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==} - engines: {node: '>=0.10.0'} + "@compodoc/live-server@1.2.3": + resolution: + { integrity: sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow== } + engines: { node: ">=0.10.0" } hasBin: true - '@compodoc/ngd-core@2.1.1': - resolution: {integrity: sha512-Z+wE6wWZYVnudRYg6qunDlyh3Orw39Ib66Gvrz5kX5u7So+iu3tr6sQJdqH6yGS3hAjig5avlfhWLlgsb6/x1Q==} - engines: {node: '>= 10.0.0'} - - '@compodoc/ngd-transformer@2.1.3': - resolution: {integrity: sha512-oWxJza7CpWR8/FeWYfE6j+jgncnGBsTWnZLt5rD2GUpsGSQTuGrsFPnmbbaVLgRS5QIVWBJYke7QFBr/7qVMWg==} - engines: {node: '>= 10.0.0'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} - - '@egjs/hammerjs@2.0.17': - resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} - engines: {node: '>=0.8.0'} - - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - - '@es-joy/jsdoccomment@0.71.0': - resolution: {integrity: sha512-2p9+dXWNQnp5Kq/V0XVWZiVAabzlX6rUW8vXXvtX8Yc1CkKgD93IPDEnv1sYZFkkS6HMvg6H0RMZfob/Co0YXA==} - engines: {node: '>=20.11.0'} - - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} + "@compodoc/ngd-core@2.1.1": + resolution: + { integrity: sha512-Z+wE6wWZYVnudRYg6qunDlyh3Orw39Ib66Gvrz5kX5u7So+iu3tr6sQJdqH6yGS3hAjig5avlfhWLlgsb6/x1Q== } + engines: { node: ">= 10.0.0" } + + "@compodoc/ngd-transformer@2.1.3": + resolution: + { integrity: sha512-oWxJza7CpWR8/FeWYfE6j+jgncnGBsTWnZLt5rD2GUpsGSQTuGrsFPnmbbaVLgRS5QIVWBJYke7QFBr/7qVMWg== } + engines: { node: ">= 10.0.0" } + + "@cspotcode/source-map-support@0.8.1": + resolution: + { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } + engines: { node: ">=12" } + + "@discoveryjs/json-ext@0.5.7": + resolution: + { integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== } + engines: { node: ">=10.0.0" } + + "@discoveryjs/json-ext@0.6.3": + resolution: + { integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== } + engines: { node: ">=14.17.0" } + + "@egjs/hammerjs@2.0.17": + resolution: + { integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A== } + engines: { node: ">=0.8.0" } + + "@emnapi/core@1.10.0": + resolution: + { integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw== } + + "@emnapi/runtime@1.10.0": + resolution: + { integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA== } + + "@emnapi/wasi-threads@1.2.1": + resolution: + { integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w== } + + "@es-joy/jsdoccomment@0.71.0": + resolution: + { integrity: sha512-2p9+dXWNQnp5Kq/V0XVWZiVAabzlX6rUW8vXXvtX8Yc1CkKgD93IPDEnv1sYZFkkS6HMvg6H0RMZfob/Co0YXA== } + engines: { node: ">=20.11.0" } + + "@esbuild/aix-ppc64@0.27.2": + resolution: + { integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw== } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.28.0': - resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} - engines: {node: '>=18'} + "@esbuild/aix-ppc64@0.28.0": + resolution: + { integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA== } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.27.2": + resolution: + { integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA== } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.28.0': - resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.28.0": + resolution: + { integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw== } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.27.2": + resolution: + { integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA== } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.28.0': - resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.28.0": + resolution: + { integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ== } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.27.2": + resolution: + { integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A== } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.28.0': - resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.28.0": + resolution: + { integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA== } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.27.2": + resolution: + { integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg== } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.28.0': - resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.28.0": + resolution: + { integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q== } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.27.2": + resolution: + { integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA== } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.28.0': - resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.28.0": + resolution: + { integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ== } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.27.2": + resolution: + { integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g== } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': - resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.28.0": + resolution: + { integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q== } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.27.2": + resolution: + { integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA== } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': - resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.28.0": + resolution: + { integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw== } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.27.2": + resolution: + { integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw== } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.28.0': - resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.28.0": + resolution: + { integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A== } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.27.2": + resolution: + { integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw== } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.28.0': - resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.28.0": + resolution: + { integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw== } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.27.2": + resolution: + { integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w== } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.28.0': - resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.28.0": + resolution: + { integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ== } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.27.2": + resolution: + { integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg== } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.28.0': - resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.28.0": + resolution: + { integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg== } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.27.2": + resolution: + { integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw== } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.28.0': - resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.28.0": + resolution: + { integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w== } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.27.2": + resolution: + { integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ== } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.28.0': - resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.28.0": + resolution: + { integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg== } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.27.2": + resolution: + { integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA== } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.28.0': - resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.28.0": + resolution: + { integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ== } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.27.2": + resolution: + { integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w== } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.28.0': - resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.28.0": + resolution: + { integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q== } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.27.2": + resolution: + { integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA== } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.28.0': - resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.28.0": + resolution: + { integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ== } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.27.2": + resolution: + { integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw== } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': - resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.28.0": + resolution: + { integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw== } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.27.2": + resolution: + { integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA== } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': - resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.28.0": + resolution: + { integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw== } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.27.2": + resolution: + { integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA== } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': - resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.28.0": + resolution: + { integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g== } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.27.2": + resolution: + { integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg== } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': - resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.28.0": + resolution: + { integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA== } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.27.2": + resolution: + { integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag== } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': - resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.28.0": + resolution: + { integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w== } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.27.2": + resolution: + { integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg== } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.28.0': - resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.28.0": + resolution: + { integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw== } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.27.2": + resolution: + { integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg== } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.28.0': - resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.28.0": + resolution: + { integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA== } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.27.2": + resolution: + { integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ== } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.28.0': - resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.28.0": + resolution: + { integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA== } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.27.2": + resolution: + { integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ== } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.28.0': - resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.28.0": + resolution: + { integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw== } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.9.1": + resolution: + { integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@gar/promise-retry@1.0.3': - resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@gfx/zopfli@1.0.15': - resolution: {integrity: sha512-7mBgpi7UD82fsff5ThQKet0uBTl4BYerQuc+/qA1ELTwWEiIedRTcD3JgiUu9wwZ2kytW8JOb165rSdAt8PfcQ==} - engines: {node: '>= 8'} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@hono/node-server@1.19.15': - resolution: {integrity: sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg==} - engines: {node: '>=18.14.1'} + "@eslint-community/regexpp@4.12.2": + resolution: + { integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.21.2": + resolution: + { integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/config-helpers@0.4.2": + resolution: + { integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/core@0.17.0": + resolution: + { integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.3.5": + resolution: + { integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.39.4": + resolution: + { integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.7": + resolution: + { integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/plugin-kit@0.4.1": + resolution: + { integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@gar/promise-retry@1.0.3": + resolution: + { integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@gfx/zopfli@1.0.15": + resolution: + { integrity: sha512-7mBgpi7UD82fsff5ThQKet0uBTl4BYerQuc+/qA1ELTwWEiIedRTcD3JgiUu9wwZ2kytW8JOb165rSdAt8PfcQ== } + engines: { node: ">= 8" } + + "@hapi/hoek@9.3.0": + resolution: + { integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== } + + "@hapi/topo@5.1.0": + resolution: + { integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== } + + "@hono/node-server@1.19.15": + resolution: + { integrity: sha512-Za2ai6TLdKjUvnur+eenO6nuYYipVAEhyCAdaV8IRvmU9kK8crOZUSYvIXn72E4f8fJqyAbpcJuTsYYmZp9Deg== } + engines: { node: ">=18.14.1" } peerDependencies: hono: ^4 - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} - - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' + "@humanfs/core@0.19.2": + resolution: + { integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.8": + resolution: + { integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== } + engines: { node: ">=18.18.0" } + + "@humanfs/types@0.15.0": + resolution: + { integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: ">=12.22" } + + "@humanwhocodes/retry@0.4.3": + resolution: + { integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== } + engines: { node: ">=18.18" } + + "@inquirer/ansi@1.0.2": + resolution: + { integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== } + engines: { node: ">=18" } + + "@inquirer/checkbox@4.3.2": + resolution: + { integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/confirm@5.1.14': - resolution: {integrity: sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==} - engines: {node: '>=18'} + "@inquirer/confirm@5.1.14": + resolution: + { integrity: sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} + "@inquirer/confirm@5.1.21": + resolution: + { integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + "@inquirer/core@10.3.2": + resolution: + { integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} + "@inquirer/editor@4.2.23": + resolution: + { integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} + "@inquirer/expand@4.0.23": + resolution: + { integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} + "@inquirer/external-editor@1.0.3": + resolution: + { integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + "@inquirer/figures@1.0.15": + resolution: + { integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== } + engines: { node: ">=18" } - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} + "@inquirer/input@4.3.1": + resolution: + { integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} + "@inquirer/number@3.0.23": + resolution: + { integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} + "@inquirer/password@4.0.23": + resolution: + { integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/prompts@7.8.2': - resolution: {integrity: sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==} - engines: {node: '>=18'} + "@inquirer/prompts@7.8.2": + resolution: + { integrity: sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} + "@inquirer/rawlist@4.1.11": + resolution: + { integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} + "@inquirer/search@3.2.2": + resolution: + { integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} + "@inquirer/select@4.4.2": + resolution: + { integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + "@inquirer/type@3.0.10": + resolution: + { integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== } + engines: { node: ">=18" } peerDependencies: - '@types/node': '>=18' + "@types/node": ">=18" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + "@isaacs/cliui@8.0.2": + resolution: + { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: ">=12" } - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} + "@isaacs/fs-minipass@4.0.1": + resolution: + { integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== } + engines: { node: ">=18.0.0" } - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + "@istanbuljs/load-nyc-config@1.1.0": + resolution: + { integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== } + engines: { node: ">=8" } - '@istanbuljs/schema@0.1.6': - resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} - engines: {node: '>=8'} + "@istanbuljs/schema@0.1.6": + resolution: + { integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw== } + engines: { node: ">=8" } - '@jest/console@30.4.1': - resolution: {integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/console@30.4.1": + resolution: + { integrity: sha512-v3bhyxUh9Hgmo5p6hAOXe14/R3ZxZDOsvHleh4B07z3m/x4/ngPUXEm9XwK4sF4u+f+P2ORb0Ge+MgpaqRMVDA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/core@30.4.2': - resolution: {integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/core@30.4.2": + resolution: + { integrity: sha512-TZJA6cPJUFxoWhxaLo8t0VX/MZX2wPWr0uIDvLSHIvN4gu9h02vSzqI2kBADG1ExqQlC+cY09xKMSreivvrChQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/create-cache-key-function@30.4.1': - resolution: {integrity: sha512-R+xGEtzA95NIsvpXJSROG4t01956dDOt17KpamguY4XOnGvdHNFFXE7Er0C1OAsRjOwiIxpKqOvGlznIGZIQlQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/diff-sequences@30.4.0': - resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/environment@30.4.1': - resolution: {integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@30.4.1': - resolution: {integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect@30.4.1': - resolution: {integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/fake-timers@30.4.1': - resolution: {integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/globals@30.4.1': - resolution: {integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/pattern@30.4.0': - resolution: {integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/reporters@30.4.1': - resolution: {integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/create-cache-key-function@30.4.1": + resolution: + { integrity: sha512-R+xGEtzA95NIsvpXJSROG4t01956dDOt17KpamguY4XOnGvdHNFFXE7Er0C1OAsRjOwiIxpKqOvGlznIGZIQlQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/diff-sequences@30.4.0": + resolution: + { integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/environment@30.4.1": + resolution: + { integrity: sha512-AK9yNRqgKxiabqMoe4oW+3/TSSeV8vkdC7BGaxZdU0AFXfOpofTLqdru2GXKZghP3sdgwE9XXpnVwfZ8JnFV4w== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/expect-utils@29.7.0": + resolution: + { integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/expect-utils@30.4.1": + resolution: + { integrity: sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/expect@30.4.1": + resolution: + { integrity: sha512-ginrj6TMgh2GshLUGCjO94Ptx9HhdZA/I6A9iUfyeLKFtdAjnKzHDgzgP9HYQgbxM1lbXScQ2eUBz2lGeVDPWA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/fake-timers@30.4.1": + resolution: + { integrity: sha512-iW5umdmfPeWzehrVhugFQZqCchSCud5S1l2YT0O9ZhjRR0ExclANDZkiSBwzqtnlOn0J1JXvO+HZ6rkuyOVOgQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/get-type@30.1.0": + resolution: + { integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/globals@30.4.1": + resolution: + { integrity: sha512-ZbuY4cmXC8DkxYjfvT2DbcHWL2T6vmsMhXCDcmTB2T0y0gaezBI77ufq5ZAIdcRkYZ7NEQEDg1xFeKbxUJ5v5Q== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/pattern@30.4.0": + resolution: + { integrity: sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/reporters@30.4.1": + resolution: + { integrity: sha512-/SnkPCzEQpUaBH81kjdEdDdo2WZl5hxw+BmLDGWjRkm8o7XlhjwsU36cqwe5PGBE5WYpBvDzRSdXx9rbGuJtNA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + "@jest/schemas@29.6.3": + resolution: + { integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + + "@jest/schemas@30.4.1": + resolution: + { integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/schemas@30.4.1': - resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/snapshot-utils@30.4.1": + resolution: + { integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/source-map@30.0.1": + resolution: + { integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/test-result@30.4.1": + resolution: + { integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/snapshot-utils@30.4.1': - resolution: {integrity: sha512-ObY4ljvQ95mt6iwKtVLetR/4yXiAgl3H4nJxhztr0MTjrN97TwDYrnCp/kF60Ec9HdhkWTHSu+Hg05aXfngpOA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/test-sequencer@30.4.1": + resolution: + { integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/source-map@30.0.1': - resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/transform@30.4.1": + resolution: + { integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/test-result@30.4.1': - resolution: {integrity: sha512-/ZG7pgEiOmmWkN9TplKbOu4id2N5lh7FHwRwlkgBVAzGdRH+OkkQ8wX/kIxg4zmd3ZQvAL1RwL2yWsvNYYECTw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/types@29.6.3": + resolution: + { integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } - '@jest/test-sequencer@30.4.1': - resolution: {integrity: sha512-PeYE+4td5rKjoRPxztObrXU+H8hsjZfxKMXOcmrr34JerSyB/ROOxbbicz8B7A5j9R9VayDnVPvBmedqCsFCdw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jest/types@30.4.1": + resolution: + { integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } - '@jest/transform@30.4.1': - resolution: {integrity: sha512-Wz0LyktlTvRefoymh+n64hQ84KNXsRGcwdoZ8CSa0Ea+fgYcHZlnk+hDP7v2MS7il2bQ5uTEIxf4/NNfhMN4KQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jridgewell/gen-mapping@0.3.13": + resolution: + { integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== } - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + "@jridgewell/remapping@2.3.5": + resolution: + { integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== } - '@jest/types@30.4.1': - resolution: {integrity: sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + "@jridgewell/resolve-uri@3.1.2": + resolution: + { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } + engines: { node: ">=6.0.0" } - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + "@jridgewell/source-map@0.3.11": + resolution: + { integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== } - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== } - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + "@jridgewell/trace-mapping@0.3.31": + resolution: + { integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== } - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + "@jridgewell/trace-mapping@0.3.9": + resolution: + { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} + "@jsonjoy.com/base64@1.1.2": + resolution: + { integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/base64@17.67.0': - resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/base64@17.67.0": + resolution: + { integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} + "@jsonjoy.com/buffers@1.2.1": + resolution: + { integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/buffers@17.67.0': - resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/buffers@17.67.0": + resolution: + { integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} - engines: {node: '>=10.0'} + "@jsonjoy.com/codegen@1.0.0": + resolution: + { integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/codegen@17.67.0': - resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} - engines: {node: '>=10.0'} + "@jsonjoy.com/codegen@17.67.0": + resolution: + { integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-core@4.56.10': - resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-core@4.56.10": + resolution: + { integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-fsa@4.56.10': - resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-fsa@4.56.10": + resolution: + { integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-node-builtins@4.56.10': - resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-node-builtins@4.56.10": + resolution: + { integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-node-to-fsa@4.56.10': - resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-node-to-fsa@4.56.10": + resolution: + { integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-node-utils@4.56.10': - resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-node-utils@4.56.10": + resolution: + { integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-node@4.56.10': - resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-node@4.56.10": + resolution: + { integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-print@4.56.10': - resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-print@4.56.10": + resolution: + { integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/fs-snapshot@4.56.10': - resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} - engines: {node: '>=10.0'} + "@jsonjoy.com/fs-snapshot@4.56.10": + resolution: + { integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/json-pack@1.21.0': - resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} - engines: {node: '>=10.0'} + "@jsonjoy.com/json-pack@1.21.0": + resolution: + { integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/json-pack@17.67.0': - resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} - engines: {node: '>=10.0'} + "@jsonjoy.com/json-pack@17.67.0": + resolution: + { integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} + "@jsonjoy.com/json-pointer@1.0.2": + resolution: + { integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/json-pointer@17.67.0': - resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} - engines: {node: '>=10.0'} + "@jsonjoy.com/json-pointer@17.67.0": + resolution: + { integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} + "@jsonjoy.com/util@1.9.0": + resolution: + { integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@jsonjoy.com/util@17.67.0': - resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} - engines: {node: '>=10.0'} + "@jsonjoy.com/util@17.67.0": + resolution: + { integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + "@leichtgewicht/ip-codec@2.0.5": + resolution: + { integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== } - '@listr2/prompt-adapter-inquirer@3.0.1': - resolution: {integrity: sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==} - engines: {node: '>=20.0.0'} + "@listr2/prompt-adapter-inquirer@3.0.1": + resolution: + { integrity: sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA== } + engines: { node: ">=20.0.0" } peerDependencies: - '@inquirer/prompts': '>= 3 < 8' + "@inquirer/prompts": ">= 3 < 8" listr2: 9.0.1 - '@lmdb/lmdb-darwin-arm64@3.4.2': - resolution: {integrity: sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==} + "@lmdb/lmdb-darwin-arm64@3.4.2": + resolution: + { integrity: sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg== } cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.4.2': - resolution: {integrity: sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==} + "@lmdb/lmdb-darwin-x64@3.4.2": + resolution: + { integrity: sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w== } cpu: [x64] os: [darwin] - '@lmdb/lmdb-linux-arm64@3.4.2': - resolution: {integrity: sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==} + "@lmdb/lmdb-linux-arm64@3.4.2": + resolution: + { integrity: sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg== } cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm@3.4.2': - resolution: {integrity: sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==} + "@lmdb/lmdb-linux-arm@3.4.2": + resolution: + { integrity: sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg== } cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-x64@3.4.2': - resolution: {integrity: sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==} + "@lmdb/lmdb-linux-x64@3.4.2": + resolution: + { integrity: sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g== } cpu: [x64] os: [linux] - '@lmdb/lmdb-win32-arm64@3.4.2': - resolution: {integrity: sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==} + "@lmdb/lmdb-win32-arm64@3.4.2": + resolution: + { integrity: sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw== } cpu: [arm64] os: [win32] - '@lmdb/lmdb-win32-x64@3.4.2': - resolution: {integrity: sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==} + "@lmdb/lmdb-win32-x64@3.4.2": + resolution: + { integrity: sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g== } cpu: [x64] os: [win32] - '@mdx-js/react@3.1.1': - resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + "@mdx-js/react@3.1.1": + resolution: + { integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw== } peerDependencies: - '@types/react': '>=16' - react: '>=16' + "@types/react": ">=16" + react: ">=16" - '@microsoft/signalr@8.0.17': - resolution: {integrity: sha512-5pM6xPtKZNJLO0Tq5nQasVyPFwi/WBY3QB5uc/v3dIPTpS1JXQbaXAQAPxFoQ5rTBFE094w8bbqkp17F9ReQvA==} + "@microsoft/signalr@8.0.17": + resolution: + { integrity: sha512-5pM6xPtKZNJLO0Tq5nQasVyPFwi/WBY3QB5uc/v3dIPTpS1JXQbaXAQAPxFoQ5rTBFE094w8bbqkp17F9ReQvA== } - '@modelcontextprotocol/sdk@1.26.0': - resolution: {integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==} - engines: {node: '>=18'} + "@modelcontextprotocol/sdk@1.26.0": + resolution: + { integrity: sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg== } + engines: { node: ">=18" } peerDependencies: - '@cfworker/json-schema': ^4.1.1 + "@cfworker/json-schema": ^4.1.1 zod: ^3.25 || ^4.0 peerDependenciesMeta: - '@cfworker/json-schema': + "@cfworker/json-schema": optional: true - '@mongodb-js/saslprep@1.4.11': - resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==} + "@mongodb-js/saslprep@1.4.11": + resolution: + { integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA== } - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': - resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4": + resolution: + { integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ== } cpu: [arm64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': - resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} + "@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4": + resolution: + { integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w== } cpu: [x64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': - resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} + "@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4": + resolution: + { integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw== } cpu: [arm64] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': - resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} + "@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4": + resolution: + { integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw== } cpu: [arm] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': - resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} + "@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4": + resolution: + { integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ== } cpu: [x64] os: [linux] - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': - resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} + "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4": + resolution: + { integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ== } cpu: [x64] os: [win32] - '@napi-rs/nice-android-arm-eabi@1.1.1': - resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} - engines: {node: '>= 10'} + "@napi-rs/nice-android-arm-eabi@1.1.1": + resolution: + { integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw== } + engines: { node: ">= 10" } cpu: [arm] os: [android] - '@napi-rs/nice-android-arm64@1.1.1': - resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} - engines: {node: '>= 10'} + "@napi-rs/nice-android-arm64@1.1.1": + resolution: + { integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw== } + engines: { node: ">= 10" } cpu: [arm64] os: [android] - '@napi-rs/nice-darwin-arm64@1.1.1': - resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} - engines: {node: '>= 10'} + "@napi-rs/nice-darwin-arm64@1.1.1": + resolution: + { integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A== } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@napi-rs/nice-darwin-x64@1.1.1': - resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-darwin-x64@1.1.1": + resolution: + { integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ== } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@napi-rs/nice-freebsd-x64@1.1.1': - resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-freebsd-x64@1.1.1": + resolution: + { integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ== } + engines: { node: ">= 10" } cpu: [x64] os: [freebsd] - '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': - resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-arm-gnueabihf@1.1.1": + resolution: + { integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg== } + engines: { node: ">= 10" } cpu: [arm] os: [linux] - '@napi-rs/nice-linux-arm64-gnu@1.1.1': - resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-arm64-gnu@1.1.1": + resolution: + { integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ== } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] libc: [glibc] - '@napi-rs/nice-linux-arm64-musl@1.1.1': - resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-arm64-musl@1.1.1": + resolution: + { integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg== } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] libc: [musl] - '@napi-rs/nice-linux-ppc64-gnu@1.1.1': - resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-ppc64-gnu@1.1.1": + resolution: + { integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg== } + engines: { node: ">= 10" } cpu: [ppc64] os: [linux] libc: [glibc] - '@napi-rs/nice-linux-riscv64-gnu@1.1.1': - resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-riscv64-gnu@1.1.1": + resolution: + { integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw== } + engines: { node: ">= 10" } cpu: [riscv64] os: [linux] libc: [glibc] - '@napi-rs/nice-linux-s390x-gnu@1.1.1': - resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-s390x-gnu@1.1.1": + resolution: + { integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ== } + engines: { node: ">= 10" } cpu: [s390x] os: [linux] libc: [glibc] - '@napi-rs/nice-linux-x64-gnu@1.1.1': - resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-x64-gnu@1.1.1": + resolution: + { integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg== } + engines: { node: ">= 10" } cpu: [x64] os: [linux] libc: [glibc] - '@napi-rs/nice-linux-x64-musl@1.1.1': - resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} - engines: {node: '>= 10'} + "@napi-rs/nice-linux-x64-musl@1.1.1": + resolution: + { integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw== } + engines: { node: ">= 10" } cpu: [x64] os: [linux] libc: [musl] - '@napi-rs/nice-openharmony-arm64@1.1.1': - resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-openharmony-arm64@1.1.1": + resolution: + { integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ== } + engines: { node: ">= 10" } cpu: [arm64] os: [openharmony] - '@napi-rs/nice-win32-arm64-msvc@1.1.1': - resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} - engines: {node: '>= 10'} + "@napi-rs/nice-win32-arm64-msvc@1.1.1": + resolution: + { integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA== } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@napi-rs/nice-win32-ia32-msvc@1.1.1': - resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} - engines: {node: '>= 10'} + "@napi-rs/nice-win32-ia32-msvc@1.1.1": + resolution: + { integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug== } + engines: { node: ">= 10" } cpu: [ia32] os: [win32] - '@napi-rs/nice-win32-x64-msvc@1.1.1': - resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} - engines: {node: '>= 10'} + "@napi-rs/nice-win32-x64-msvc@1.1.1": + resolution: + { integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ== } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@napi-rs/nice@1.1.1': - resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} - engines: {node: '>= 10'} - - '@napi-rs/wasm-runtime@1.1.5': - resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 - - '@ngneat/transloco-locale@4.1.0': - resolution: {integrity: sha512-xtev6RXEPXh3kJ/xR/aq52z3ZVlv2wCGfc2kT+LQhLsW045zT0e5PJPHjO/xGNmp+T/Z8Axu1h08KwRQUW4Jyg==} - deprecated: 'NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco-locale instead.' - peerDependencies: - '@angular/core': '>=13.0.0' - '@ngneat/transloco': '>=4.0.0' - rxjs: '>=6.0.0' - - '@ngneat/transloco-utils@3.0.5': - resolution: {integrity: sha512-Xn9GaLUocXSPMhErNHbUyoloDm9sb+JaYszZJFL9F8em6frPQDSJxcYk9pV0caWpAU8INlksJSYgx1LXAH18mw==} - deprecated: 'NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco-utils instead.' - - '@ngneat/transloco@4.3.0': - resolution: {integrity: sha512-KUhGvp1ki+jvrM2PO27Tgzme1HkFmvDgS+7VyGxHta35wZEyoH6/r/EAXvfurPeYgaP6IaEMhUvAVT1WDgYwUg==} - deprecated: 'NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco instead.' - peerDependencies: - '@angular/core': '>=13.0.0' - fs-extra: '>=9.1.0' - glob: '>=7.1.7' - rxjs: '>=6.0.0' - - '@ngtools/webpack@20.3.28': - resolution: {integrity: sha512-OlLDLDCkj+WNYn4ubgIZyou/hgTOWm3OXM9Q2JOnwBPgaGu88iHkRytUM0hRTlf6vIi2UbO+E1+j2Zy2jifmcA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - '@angular/compiler-cli': ^20.0.0 - typescript: '>=5.8 <6.0' + "@napi-rs/nice@1.1.1": + resolution: + { integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw== } + engines: { node: ">= 10" } + + "@napi-rs/wasm-runtime@1.1.5": + resolution: + { integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q== } + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + + "@ngneat/transloco-locale@4.1.0": + resolution: + { integrity: sha512-xtev6RXEPXh3kJ/xR/aq52z3ZVlv2wCGfc2kT+LQhLsW045zT0e5PJPHjO/xGNmp+T/Z8Axu1h08KwRQUW4Jyg== } + deprecated: "NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco-locale instead." + peerDependencies: + "@angular/core": ">=13.0.0" + "@ngneat/transloco": ">=4.0.0" + rxjs: ">=6.0.0" + + "@ngneat/transloco-utils@3.0.5": + resolution: + { integrity: sha512-Xn9GaLUocXSPMhErNHbUyoloDm9sb+JaYszZJFL9F8em6frPQDSJxcYk9pV0caWpAU8INlksJSYgx1LXAH18mw== } + deprecated: "NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco-utils instead." + + "@ngneat/transloco@4.3.0": + resolution: + { integrity: sha512-KUhGvp1ki+jvrM2PO27Tgzme1HkFmvDgS+7VyGxHta35wZEyoH6/r/EAXvfurPeYgaP6IaEMhUvAVT1WDgYwUg== } + deprecated: "NOTICE: Transloco has moved to a new scope, this package will no longer receive updates. please use @jsverse/transloco instead." + peerDependencies: + "@angular/core": ">=13.0.0" + fs-extra: ">=9.1.0" + glob: ">=7.1.7" + rxjs: ">=6.0.0" + + "@ngtools/webpack@20.3.28": + resolution: + { integrity: sha512-OlLDLDCkj+WNYn4ubgIZyou/hgTOWm3OXM9Q2JOnwBPgaGu88iHkRytUM0hRTlf6vIi2UbO+E1+j2Zy2jifmcA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } + peerDependencies: + "@angular/compiler-cli": ^20.0.0 + typescript: ">=5.8 <6.0" webpack: 5.105.0 - '@nodable/entities@2.2.0': - resolution: {integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/agent@4.0.2': - resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/fs@5.0.0': - resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/git@7.0.2': - resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/installed-package-contents@4.0.0': - resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} - engines: {node: ^20.17.0 || >=22.9.0} + "@nodable/entities@2.2.0": + resolution: + { integrity: sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg== } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: ">= 8" } + + "@npmcli/agent@4.0.2": + resolution: + { integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/fs@5.0.0": + resolution: + { integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/git@7.0.2": + resolution: + { integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/installed-package-contents@4.0.0": + resolution: + { integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true - '@npmcli/node-gyp@5.0.0': - resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/package-json@7.0.5': - resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/promise-spawn@9.0.1': - resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/redact@4.0.0': - resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@npmcli/run-script@10.0.4': - resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@panva/asn1.js@1.0.0': - resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} - engines: {node: '>=10.13.0'} - - '@parcel/watcher-android-arm64@2.5.6': - resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} - engines: {node: '>= 10.0.0'} + "@npmcli/node-gyp@5.0.0": + resolution: + { integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/package-json@7.0.5": + resolution: + { integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/promise-spawn@9.0.1": + resolution: + { integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/redact@4.0.0": + resolution: + { integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/run-script@10.0.4": + resolution: + { integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@panva/asn1.js@1.0.0": + resolution: + { integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw== } + engines: { node: ">=10.13.0" } + + "@parcel/watcher-android-arm64@2.5.6": + resolution: + { integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.6': - resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-arm64@2.5.6": + resolution: + { integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.6': - resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-darwin-x64@2.5.6": + resolution: + { integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.6': - resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-freebsd-x64@2.5.6": + resolution: + { integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.6': - resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm-glibc@2.5.6": + resolution: + { integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ== } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.6': - resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm-musl@2.5.6": + resolution: + { integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg== } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.6': - resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm64-glibc@2.5.6": + resolution: + { integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-arm64-musl@2.5.6": + resolution: + { integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.6': - resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-x64-glibc@2.5.6": + resolution: + { integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-linux-x64-musl@2.5.6": + resolution: + { integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [linux] libc: [musl] - '@parcel/watcher-win32-arm64@2.5.6': - resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-arm64@2.5.6": + resolution: + { integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.6': - resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-ia32@2.5.6": + resolution: + { integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g== } + engines: { node: ">= 10.0.0" } cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.6': - resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} - engines: {node: '>= 10.0.0'} + "@parcel/watcher-win32-x64@2.5.6": + resolution: + { integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [win32] - '@parcel/watcher@2.5.6': - resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.3.6': - resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} - engines: {node: ^14.18.0 || >=16.0.0} - - '@playwright/test@1.60.0': - resolution: {integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==} - engines: {node: '>=18'} + "@parcel/watcher@2.5.6": + resolution: + { integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ== } + engines: { node: ">= 10.0.0" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: ">=14" } + + "@pkgr/core@0.3.6": + resolution: + { integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA== } + engines: { node: ^14.18.0 || >=16.0.0 } + + "@playwright/test@1.60.0": + resolution: + { integrity: sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag== } + engines: { node: ">=18" } hasBin: true - '@polka/send-type@0.5.2': - resolution: {integrity: sha512-jGXalKihnhGQmMQ+xxfxrRfI2cWs38TIZuwgYpnbQDD4r9TkOiU3ocjAS+6CqqMNQNAu9Ul2iHU5YFRDODak2w==} + "@polka/send-type@0.5.2": + resolution: + { integrity: sha512-jGXalKihnhGQmMQ+xxfxrRfI2cWs38TIZuwgYpnbQDD4r9TkOiU3ocjAS+6CqqMNQNAu9Ul2iHU5YFRDODak2w== } - '@polka/url@0.5.0': - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} + "@polka/url@0.5.0": + resolution: + { integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== } - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + "@polka/url@1.0.0-next.29": + resolution: + { integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== } - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + "@rollup/rollup-android-arm-eabi@4.59.0": + resolution: + { integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg== } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + "@rollup/rollup-android-arm64@4.59.0": + resolution: + { integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q== } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + "@rollup/rollup-darwin-arm64@4.59.0": + resolution: + { integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg== } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + "@rollup/rollup-darwin-x64@4.59.0": + resolution: + { integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w== } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + "@rollup/rollup-freebsd-arm64@4.59.0": + resolution: + { integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA== } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + "@rollup/rollup-freebsd-x64@4.59.0": + resolution: + { integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg== } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + "@rollup/rollup-linux-arm-gnueabihf@4.59.0": + resolution: + { integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw== } cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + "@rollup/rollup-linux-arm-musleabihf@4.59.0": + resolution: + { integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA== } cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + "@rollup/rollup-linux-arm64-gnu@4.59.0": + resolution: + { integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA== } cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + "@rollup/rollup-linux-arm64-musl@4.59.0": + resolution: + { integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA== } cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + "@rollup/rollup-linux-loong64-gnu@4.59.0": + resolution: + { integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg== } cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + "@rollup/rollup-linux-loong64-musl@4.59.0": + resolution: + { integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q== } cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + "@rollup/rollup-linux-ppc64-gnu@4.59.0": + resolution: + { integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA== } cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + "@rollup/rollup-linux-ppc64-musl@4.59.0": + resolution: + { integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA== } cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + "@rollup/rollup-linux-riscv64-gnu@4.59.0": + resolution: + { integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg== } cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + "@rollup/rollup-linux-riscv64-musl@4.59.0": + resolution: + { integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg== } cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + "@rollup/rollup-linux-s390x-gnu@4.59.0": + resolution: + { integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w== } cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + "@rollup/rollup-linux-x64-gnu@4.59.0": + resolution: + { integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg== } cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + "@rollup/rollup-linux-x64-musl@4.59.0": + resolution: + { integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg== } cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + "@rollup/rollup-openbsd-x64@4.59.0": + resolution: + { integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ== } cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + "@rollup/rollup-openharmony-arm64@4.59.0": + resolution: + { integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA== } cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + "@rollup/rollup-win32-arm64-msvc@4.59.0": + resolution: + { integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A== } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + "@rollup/rollup-win32-ia32-msvc@4.59.0": + resolution: + { integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA== } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + "@rollup/rollup-win32-x64-gnu@4.59.0": + resolution: + { integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA== } cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + "@rollup/rollup-win32-x64-msvc@4.59.0": + resolution: + { integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA== } cpu: [x64] os: [win32] - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@schematics/angular@20.3.28': - resolution: {integrity: sha512-E9IwxeIHprqOtkxwvzY/OJa4DMvb+z0gPDAGDzAEoscj2qLETi9kmj/p0c/MDtHa5oyeb0GaRxifAkNOLtS/nA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - - '@sigstore/bundle@4.0.0': - resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/core@3.2.1': - resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/protobuf-specs@0.5.1': - resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/sign@4.1.1': - resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/tuf@4.0.2': - resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/verify@3.1.1': - resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sillsdev/lynx-delta@0.2.4': - resolution: {integrity: sha512-gqrkwjL4on8z54JWQlV+CDu+3p7hTaFPkvhFpZczgeDelel6gSrKZ3hEGppISXaN7tIL/x01RSFOuTLSYpM6Xg==} - - '@sillsdev/lynx-punctuation-checker@0.2.0': - resolution: {integrity: sha512-Ia3lgI2HFs9SVMBEubRtT6DAVjhOawqhSaNK412bvnGg5hbQrpf5UEKIxQZnd8/TYxAsMfddJrF3+URDHpao0w==} - - '@sillsdev/lynx@0.3.5': - resolution: {integrity: sha512-gV946mrheOeUlfdNwyFxMA5SMuI6q4+3Bj7tahLKcJPI+SiuydmR24jmPJ3EgcsaV153hsnpMRSPr126XdMfUA==} - - '@sillsdev/machine@2.4.2': - resolution: {integrity: sha512-DDptLxfBuC38MaOIytWozI1DmP/5OjApuGgj73jEMGgn17uETH2pCKMs2i+1yGZx8IpdQwqBAhrsn/xxPUitCA==} - - '@sillsdev/scripture@1.4.1': - resolution: {integrity: sha512-v38aTSdiuIokNPyYbfa0amx690v0VALBrJclX9GQCuJOglAXdkcfHMe9BHnOjBgBzuJEUN1EWZUeX9eTZF+qJw==} - - '@sinclair/typebox@0.27.10': - resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@15.4.0': - resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} - - '@smithy/core@3.24.7': - resolution: {integrity: sha512-KoUi4M1f3BG6kzN1FnCwL7oyFptTbyBJKjR6yhSib+JHRdUmM1o+VwsFtJ66NZCkCzVfJMWRHJNo0R0jznp0Pg==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.3.9': - resolution: {integrity: sha512-ZlfJ/4Fa3jYb+3eaohPfG9utX9HmdhFNcFtpoGAhUhdynAOmGXtmigbi7eEiONKM+ykHw8RwKuDEb85Lx7t7fA==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.4.7': - resolution: {integrity: sha512-NslaM2ir0N2hisDmzXLstPaVINZheh8SokyOC++kzFPloZucL2R7Y7bS57mSzx/1Fc/fqmn7twjkeezTTrV0EA==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/node-http-handler@4.7.8': - resolution: {integrity: sha512-f+DbsWUwSbtMu1a/j8Y93KiU1SRg9nyzfjereqn1BJ33QOTUXxdlYvVXMhAYl1vuR1Kmna5aIJe09KSIfyFNYw==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.4.7': - resolution: {integrity: sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.14.4': - resolution: {integrity: sha512-B2S9+UGm1+/pHkcx3ZoLVX1a+pmSk8rqxRR+ZsNqZaJ5q9FWX9AFGQVM4qG5+OBeQUZVy99HY8HqW8gK/wgXzQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@storybook/addon-docs@10.2.14': - resolution: {integrity: sha512-vUGw+zoodb91GIcDECZetXL8Bo0AJ/lYudcRBqtdw8taLXucss28Ev6u36dXggARYHPT8V0FhBkipzzJxssjUQ==} + "@rtsao/scc@1.1.0": + resolution: + { integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== } + + "@schematics/angular@20.3.28": + resolution: + { integrity: sha512-E9IwxeIHprqOtkxwvzY/OJa4DMvb+z0gPDAGDzAEoscj2qLETi9kmj/p0c/MDtHa5oyeb0GaRxifAkNOLtS/nA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: ">= 1.13.0" } + + "@sideway/address@4.1.5": + resolution: + { integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== } + + "@sideway/formula@3.0.1": + resolution: + { integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== } + + "@sideway/pinpoint@2.0.0": + resolution: + { integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== } + + "@sigstore/bundle@4.0.0": + resolution: + { integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/core@3.2.1": + resolution: + { integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/protobuf-specs@0.5.1": + resolution: + { integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@sigstore/sign@4.1.1": + resolution: + { integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/tuf@4.0.2": + resolution: + { integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/verify@3.1.1": + resolution: + { integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sillsdev/lynx-delta@0.2.4": + resolution: + { integrity: sha512-gqrkwjL4on8z54JWQlV+CDu+3p7hTaFPkvhFpZczgeDelel6gSrKZ3hEGppISXaN7tIL/x01RSFOuTLSYpM6Xg== } + + "@sillsdev/lynx-punctuation-checker@0.2.0": + resolution: + { integrity: sha512-Ia3lgI2HFs9SVMBEubRtT6DAVjhOawqhSaNK412bvnGg5hbQrpf5UEKIxQZnd8/TYxAsMfddJrF3+URDHpao0w== } + + "@sillsdev/lynx@0.3.5": + resolution: + { integrity: sha512-gV946mrheOeUlfdNwyFxMA5SMuI6q4+3Bj7tahLKcJPI+SiuydmR24jmPJ3EgcsaV153hsnpMRSPr126XdMfUA== } + + "@sillsdev/scripture@1.4.1": + resolution: + { integrity: sha512-v38aTSdiuIokNPyYbfa0amx690v0VALBrJclX9GQCuJOglAXdkcfHMe9BHnOjBgBzuJEUN1EWZUeX9eTZF+qJw== } + + "@sinclair/typebox@0.27.10": + resolution: + { integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA== } + + "@sinclair/typebox@0.34.49": + resolution: + { integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A== } + + "@sinonjs/commons@3.0.1": + resolution: + { integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== } + + "@sinonjs/fake-timers@15.4.0": + resolution: + { integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA== } + + "@smithy/core@3.24.7": + resolution: + { integrity: sha512-KoUi4M1f3BG6kzN1FnCwL7oyFptTbyBJKjR6yhSib+JHRdUmM1o+VwsFtJ66NZCkCzVfJMWRHJNo0R0jznp0Pg== } + engines: { node: ">=18.0.0" } + + "@smithy/credential-provider-imds@4.3.9": + resolution: + { integrity: sha512-ZlfJ/4Fa3jYb+3eaohPfG9utX9HmdhFNcFtpoGAhUhdynAOmGXtmigbi7eEiONKM+ykHw8RwKuDEb85Lx7t7fA== } + engines: { node: ">=18.0.0" } + + "@smithy/fetch-http-handler@5.4.7": + resolution: + { integrity: sha512-NslaM2ir0N2hisDmzXLstPaVINZheh8SokyOC++kzFPloZucL2R7Y7bS57mSzx/1Fc/fqmn7twjkeezTTrV0EA== } + engines: { node: ">=18.0.0" } + + "@smithy/is-array-buffer@2.2.0": + resolution: + { integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== } + engines: { node: ">=14.0.0" } + + "@smithy/node-http-handler@4.7.8": + resolution: + { integrity: sha512-f+DbsWUwSbtMu1a/j8Y93KiU1SRg9nyzfjereqn1BJ33QOTUXxdlYvVXMhAYl1vuR1Kmna5aIJe09KSIfyFNYw== } + engines: { node: ">=18.0.0" } + + "@smithy/signature-v4@5.4.7": + resolution: + { integrity: sha512-LwQZazFayImv+IOm0S0enoLeUJwmAlhGC5O6YCcLWezyu08dF46GOxPOq35OpBIHkgd7OvNvBStIFwVNyrvoBw== } + engines: { node: ">=18.0.0" } + + "@smithy/types@4.14.4": + resolution: + { integrity: sha512-B2S9+UGm1+/pHkcx3ZoLVX1a+pmSk8rqxRR+ZsNqZaJ5q9FWX9AFGQVM4qG5+OBeQUZVy99HY8HqW8gK/wgXzQ== } + engines: { node: ">=18.0.0" } + + "@smithy/util-buffer-from@2.2.0": + resolution: + { integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== } + engines: { node: ">=14.0.0" } + + "@smithy/util-utf8@2.3.0": + resolution: + { integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== } + engines: { node: ">=14.0.0" } + + "@socket.io/component-emitter@3.1.2": + resolution: + { integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== } + + "@storybook/addon-docs@10.2.14": + resolution: + { integrity: sha512-vUGw+zoodb91GIcDECZetXL8Bo0AJ/lYudcRBqtdw8taLXucss28Ev6u36dXggARYHPT8V0FhBkipzzJxssjUQ== } peerDependencies: storybook: ^10.2.14 - '@storybook/addon-links@10.2.14': - resolution: {integrity: sha512-cnZ9+s9rYfT9cHjVHTAtyl0+U/qGEbGEuqv89nbXtc69B7SUi/+vfcf9uMjA+ntMVKEiLljOj8vYxuDWxLHFJA==} + "@storybook/addon-links@10.2.14": + resolution: + { integrity: sha512-cnZ9+s9rYfT9cHjVHTAtyl0+U/qGEbGEuqv89nbXtc69B7SUi/+vfcf9uMjA+ntMVKEiLljOj8vYxuDWxLHFJA== } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 storybook: ^10.2.14 @@ -3059,53 +3537,57 @@ packages: react: optional: true - '@storybook/angular@10.2.14': - resolution: {integrity: sha512-F6lgJiiNqRGeb3ZV2LEaeCEheyMiCymRcjo11FSPQ858NblFW8qdM6JS/+xplxpkZ9t0Vvy+W0ybCXWQt8Mfog==} - peerDependencies: - '@angular-devkit/architect': '>=0.1800.0 < 0.2200.0' - '@angular-devkit/build-angular': '>=18.0.0 < 22.0.0' - '@angular-devkit/core': '>=18.0.0 < 22.0.0' - '@angular/animations': '>=18.0.0 < 22.0.0' - '@angular/cli': '>=18.0.0 < 22.0.0' - '@angular/common': '>=18.0.0 < 22.0.0' - '@angular/compiler': '>=18.0.0 < 22.0.0' - '@angular/compiler-cli': '>=18.0.0 < 22.0.0' - '@angular/core': '>=18.0.0 < 22.0.0' - '@angular/platform-browser': '>=18.0.0 < 22.0.0' - '@angular/platform-browser-dynamic': '>=18.0.0 < 22.0.0' + "@storybook/angular@10.2.14": + resolution: + { integrity: sha512-F6lgJiiNqRGeb3ZV2LEaeCEheyMiCymRcjo11FSPQ858NblFW8qdM6JS/+xplxpkZ9t0Vvy+W0ybCXWQt8Mfog== } + peerDependencies: + "@angular-devkit/architect": ">=0.1800.0 < 0.2200.0" + "@angular-devkit/build-angular": ">=18.0.0 < 22.0.0" + "@angular-devkit/core": ">=18.0.0 < 22.0.0" + "@angular/animations": ">=18.0.0 < 22.0.0" + "@angular/cli": ">=18.0.0 < 22.0.0" + "@angular/common": ">=18.0.0 < 22.0.0" + "@angular/compiler": ">=18.0.0 < 22.0.0" + "@angular/compiler-cli": ">=18.0.0 < 22.0.0" + "@angular/core": ">=18.0.0 < 22.0.0" + "@angular/platform-browser": ">=18.0.0 < 22.0.0" + "@angular/platform-browser-dynamic": ">=18.0.0 < 22.0.0" rxjs: ^6.5.3 || ^7.4.0 storybook: ^10.2.14 typescript: ^4.9.0 || ^5.0.0 - zone.js: '>=0.14.0' + zone.js: ">=0.14.0" peerDependenciesMeta: - '@angular/animations': + "@angular/animations": optional: true - '@angular/cli': + "@angular/cli": optional: true zone.js: optional: true - '@storybook/builder-webpack5@10.2.14': - resolution: {integrity: sha512-7HQ46qIWcCo+Q0QQ4avYsiJ8qcFFckJyz/AJ1WY4ELOVWmJdH+NmmQbmL4YDxVdUrtlDr5I+8JjkLxq6YU+1Tg==} + "@storybook/builder-webpack5@10.2.14": + resolution: + { integrity: sha512-7HQ46qIWcCo+Q0QQ4avYsiJ8qcFFckJyz/AJ1WY4ELOVWmJdH+NmmQbmL4YDxVdUrtlDr5I+8JjkLxq6YU+1Tg== } peerDependencies: storybook: ^10.2.14 - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@storybook/core-webpack@10.2.14': - resolution: {integrity: sha512-jZCrGSNOWVTwF5u5T/DPCAuzQj/BdxflX35aHgzJYF365DFdzhockJSzB87IGjpl8NbaB6lutQIQesip9HGzBQ==} + "@storybook/core-webpack@10.2.14": + resolution: + { integrity: sha512-jZCrGSNOWVTwF5u5T/DPCAuzQj/BdxflX35aHgzJYF365DFdzhockJSzB87IGjpl8NbaB6lutQIQesip9HGzBQ== } peerDependencies: storybook: ^10.2.14 - '@storybook/csf-plugin@10.2.14': - resolution: {integrity: sha512-N4frSzhig3pkhaWdN0kAnhgEi9IGEy6rJnpuNAocS6d70fSahGQk958TMml2JCG3LLiVamuXySyUrVtFiHrxvg==} + "@storybook/csf-plugin@10.2.14": + resolution: + { integrity: sha512-N4frSzhig3pkhaWdN0kAnhgEi9IGEy6rJnpuNAocS6d70fSahGQk958TMml2JCG3LLiVamuXySyUrVtFiHrxvg== } peerDependencies: - esbuild: '*' - rollup: '*' + esbuild: "*" + rollup: "*" storybook: ^10.2.14 - vite: '*' + vite: "*" webpack: 5.105.0 peerDependenciesMeta: esbuild: @@ -3117,683 +3599,850 @@ packages: webpack: optional: true - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + "@storybook/global@5.0.0": + resolution: + { integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== } - '@storybook/icons@2.0.2': - resolution: {integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==} + "@storybook/icons@2.0.2": + resolution: + { integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw== } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@storybook/react-dom-shim@10.2.14': - resolution: {integrity: sha512-hO/Yzhf3fX/HhB5MDc/ERM5QLA1+yLgnyt0a4NGDqeWeXQ90YSjEski1RppdAI9oNGyhNwWllZPUrozrL7ECyg==} + "@storybook/react-dom-shim@10.2.14": + resolution: + { integrity: sha512-hO/Yzhf3fX/HhB5MDc/ERM5QLA1+yLgnyt0a4NGDqeWeXQ90YSjEski1RppdAI9oNGyhNwWllZPUrozrL7ECyg== } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 storybook: ^10.2.14 - '@storybook/test-runner@0.24.4': - resolution: {integrity: sha512-xm04bba5N7QyHHc+wD4xmPZx0vKK/PIpmTFypy445HrWOj0nFK4pYg5dE6H4ppqMt7qZAnb5GfHTvBwJtywJ4A==} - engines: {node: '>=20.0.0'} + "@storybook/test-runner@0.24.4": + resolution: + { integrity: sha512-xm04bba5N7QyHHc+wD4xmPZx0vKK/PIpmTFypy445HrWOj0nFK4pYg5dE6H4ppqMt7qZAnb5GfHTvBwJtywJ4A== } + engines: { node: ">=20.0.0" } hasBin: true peerDependencies: storybook: ^0.0.0-0 || ^10.0.0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0 || ^10.4.0-0 || ^10.5.0-0 || ^10.6.0-0 - '@swc/core-darwin-arm64@1.15.41': - resolution: {integrity: sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw==} - engines: {node: '>=10'} + "@swc/core-darwin-arm64@1.15.41": + resolution: + { integrity: sha512-kREh6J5paQFvP3i7f/4FbqRNOJREutVFVOkder4GVyCBQ39YmER55cW/y1NNjwrchzFqgYswFn0mMDCqbqKzrw== } + engines: { node: ">=10" } cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.41': - resolution: {integrity: sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA==} - engines: {node: '>=10'} + "@swc/core-darwin-x64@1.15.41": + resolution: + { integrity: sha512-N8B56ESFazZAWZyIkecADSPCwlLEinW7QLMEeotCpv4J7VXwfH+OLkmRL8o96UZ+1355fwHxDTS6/wK7yucvkA== } + engines: { node: ">=10" } cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.41': - resolution: {integrity: sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg==} - engines: {node: '>=10'} + "@swc/core-linux-arm-gnueabihf@1.15.41": + resolution: + { integrity: sha512-6XrId2fyle0mS5xxON8rU84mPd2Cq1kDJRj+4BnQKTd7u+2kSA6Ww+JkOP0iTNqOqt9OXhPOEAjBHAuonWcdCg== } + engines: { node: ">=10" } cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.41': - resolution: {integrity: sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-gnu@1.15.41": + resolution: + { integrity: sha512-ynLIarxlkVnqHn1D0fKOVht6mNU5ks6lrH+MY3kkS+XFaGGgDxFZVjWKJlkYTKm3RCvBTfA8Ng5fLufXheMRKQ== } + engines: { node: ">=10" } cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.41': - resolution: {integrity: sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-musl@1.15.41": + resolution: + { integrity: sha512-dXu/5vd4gh8symyhRF+4G7gOPkjmb4pONhh7sl+6GSiW0LOKZlfu5kXmyFbTz9smOT7jgr002qY9b1nujjXt2A== } + engines: { node: ">=10" } cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-ppc64-gnu@1.15.41': - resolution: {integrity: sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ==} - engines: {node: '>=10'} + "@swc/core-linux-ppc64-gnu@1.15.41": + resolution: + { integrity: sha512-XGO6zVPXoPE0gf/XnI4jBbafNT13AYgoh6ns0JCSdOetI/kqVf0vhpz7NuNgAzZrMVCsmieqjPoTwViDgh4mOQ== } + engines: { node: ">=10" } cpu: [ppc64] os: [linux] libc: [glibc] - '@swc/core-linux-s390x-gnu@1.15.41': - resolution: {integrity: sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA==} - engines: {node: '>=10'} + "@swc/core-linux-s390x-gnu@1.15.41": + resolution: + { integrity: sha512-0WUglRwyZtW+iMi7J3iFdrCxreZZIKf4egTwEQfIYRsqFax69A0OrFj+NIoFSE03xBT/IFRrg+S8K6f9Ky+4hA== } + engines: { node: ">=10" } cpu: [s390x] os: [linux] libc: [glibc] - '@swc/core-linux-x64-gnu@1.15.41': - resolution: {integrity: sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA==} - engines: {node: '>=10'} + "@swc/core-linux-x64-gnu@1.15.41": + resolution: + { integrity: sha512-VxkuQK59c0tHm6uJZCUrS3cyA2JhGGfdU6e41SZz0x/JS+4Sm7C1mIc97In14vkZJopEt7yXA2TouCqZDSygEA== } + engines: { node: ">=10" } cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.41': - resolution: {integrity: sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ==} - engines: {node: '>=10'} + "@swc/core-linux-x64-musl@1.15.41": + resolution: + { integrity: sha512-/0qXIu1ZxggLuovLb22vFfKHq2AA4n6Whw5UwmVCHk4pkw7KWnPIQpMCEqUMPsNkFJig7PPp/TSYFu8ZEb2rtQ== } + engines: { node: ">=10" } cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.41': - resolution: {integrity: sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg==} - engines: {node: '>=10'} + "@swc/core-win32-arm64-msvc@1.15.41": + resolution: + { integrity: sha512-Y481sMNZM6rECh9VO4+y26N1lWEDAyxnBZskUf37fl90uHE946VHfmiVQWT0uMFOhyJJFovGTRuF4W82dwewUg== } + engines: { node: ">=10" } cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.41': - resolution: {integrity: sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw==} - engines: {node: '>=10'} + "@swc/core-win32-ia32-msvc@1.15.41": + resolution: + { integrity: sha512-BAchBD5qeUzy3hiPSLJtaaoSm4blCLyYffOF1bGE4ETcV+OisqjUAwDQMJj++4bTpvMCDzwC+Bj3PmQyBCtscw== } + engines: { node: ">=10" } cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.41': - resolution: {integrity: sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw==} - engines: {node: '>=10'} + "@swc/core-win32-x64-msvc@1.15.41": + resolution: + { integrity: sha512-WOkA+fJ/ViVBQDsSV9JC52NACTe5PhlurA6viASDZGb7HR3KS01ZG7RZ+Bg6SVQFIoq3gSbTsskQVe6EbHFAYw== } + engines: { node: ">=10" } cpu: [x64] os: [win32] - '@swc/core@1.15.41': - resolution: {integrity: sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ==} - engines: {node: '>=10'} + "@swc/core@1.15.41": + resolution: + { integrity: sha512-03nQq/082QRJJiOvp3FGbgxTGyyxMxohPTjhk/W9bD2J0tk4ukITI7goOhOO2WbaHn/lsPmo/zf8+DIXhwpgYQ== } + engines: { node: ">=10" } peerDependencies: - '@swc/helpers': '>=0.5.17' + "@swc/helpers": ">=0.5.17" peerDependenciesMeta: - '@swc/helpers': + "@swc/helpers": optional: true - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/jest@0.2.39': - resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} - engines: {npm: '>= 7.0.0'} + "@swc/counter@0.1.3": + resolution: + { integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== } + + "@swc/jest@0.2.39": + resolution: + { integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA== } + engines: { npm: ">= 7.0.0" } peerDependencies: - '@swc/core': '*' - - '@swc/types@0.1.26': - resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.9.1': - resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + "@swc/core": "*" + + "@swc/types@0.1.26": + resolution: + { integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw== } + + "@testing-library/dom@10.4.1": + resolution: + { integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg== } + engines: { node: ">=18" } + + "@testing-library/jest-dom@6.9.1": + resolution: + { integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== } + engines: { node: ">=14", npm: ">=6", yarn: ">=1" } - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} + "@testing-library/user-event@14.6.1": + resolution: + { integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw== } + engines: { node: ">=12", npm: ">=6" } peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@thednp/event-listener@2.0.15': - resolution: {integrity: sha512-X1B+Yuvb30a/0rGdXnTLMfqvzCQ4D/1Kns7B78ON3BoFNFazJyFQ4ypuErY1jQLZSFDN4c3zTAIrdrtuIa/fFg==} - engines: {node: '>=16', pnpm: '>=8.6.0'} - - '@thednp/position-observer@1.1.3': - resolution: {integrity: sha512-5I3rdcZGTd6xJrDG0uRgME6O4jeYHlt2bedXz2yTkkCttYHhDuhtkTh3a2+NzMv2yNPXpXz0HykkeEm3RgQDDw==} - engines: {node: '>=16', pnpm: '>=8.6.0'} - - '@thednp/shorty@2.0.14': - resolution: {integrity: sha512-jCxbkyQryQjovIzK5ko683RNq1pZRAKiscJfhtF71yGxneEzFR9IQgzayw/WRjQ5KDD/5UVqTwgtfQ7pJpmIYA==} - engines: {node: '>=16', pnpm: '>=8.6.0'} - - '@ts-morph/common@0.28.1': - resolution: {integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==} - - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@tufjs/canonical-json@2.0.0': - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} + "@testing-library/dom": ">=7.21.4" + + "@thednp/event-listener@2.0.15": + resolution: + { integrity: sha512-X1B+Yuvb30a/0rGdXnTLMfqvzCQ4D/1Kns7B78ON3BoFNFazJyFQ4ypuErY1jQLZSFDN4c3zTAIrdrtuIa/fFg== } + engines: { node: ">=16", pnpm: ">=8.6.0" } - '@tufjs/models@4.1.0': - resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} - engines: {node: ^20.17.0 || >=22.9.0} + "@thednp/position-observer@1.1.3": + resolution: + { integrity: sha512-5I3rdcZGTd6xJrDG0uRgME6O4jeYHlt2bedXz2yTkkCttYHhDuhtkTh3a2+NzMv2yNPXpXz0HykkeEm3RgQDDw== } + engines: { node: ">=16", pnpm: ">=8.6.0" } - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + "@thednp/shorty@2.0.14": + resolution: + { integrity: sha512-jCxbkyQryQjovIzK5ko683RNq1pZRAKiscJfhtF71yGxneEzFR9IQgzayw/WRjQ5KDD/5UVqTwgtfQ7pJpmIYA== } + engines: { node: ">=16", pnpm: ">=8.6.0" } + + "@ts-morph/common@0.28.1": + resolution: + { integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g== } + + "@tsconfig/node10@1.0.12": + resolution: + { integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== } + + "@tsconfig/node12@1.0.11": + resolution: + { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + + "@tsconfig/node14@1.0.3": + resolution: + { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + + "@tsconfig/node16@1.0.4": + resolution: + { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + + "@tufjs/canonical-json@2.0.0": + resolution: + { integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== } + engines: { node: ^16.14.0 || >=18.0.0 } + + "@tufjs/models@4.1.0": + resolution: + { integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww== } + engines: { node: ^20.17.0 || >=22.9.0 } - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + "@tybys/wasm-util@0.10.2": + resolution: + { integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg== } - '@types/auth0-js@9.21.6': - resolution: {integrity: sha512-wsvfk03WzQDXCbMdX8lQZH2Thh5AQk9SKQcxrBN1EdRkIOgkw9aIixxBpzsTHu/gj0I514BGQv7t5EyZSgVRmQ==} + "@types/aria-query@5.0.4": + resolution: + { integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== } - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + "@types/auth0-js@9.21.6": + resolution: + { integrity: sha512-wsvfk03WzQDXCbMdX8lQZH2Thh5AQk9SKQcxrBN1EdRkIOgkw9aIixxBpzsTHu/gj0I514BGQv7t5EyZSgVRmQ== } - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + "@types/babel__core@7.20.5": + resolution: + { integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== } - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + "@types/babel__generator@7.27.0": + resolution: + { integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== } - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + "@types/babel__template@7.4.4": + resolution: + { integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== } + + "@types/babel__traverse@7.28.0": + resolution: + { integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== } + + "@types/body-parser@1.19.6": + resolution: + { integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== } - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + "@types/bonjour@3.5.13": + resolution: + { integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== } + + "@types/chai@5.2.3": + resolution: + { integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== } + + "@types/connect-history-api-fallback@1.5.4": + resolution: + { integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== } + + "@types/connect@3.4.38": + resolution: + { integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== } - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + "@types/cors@2.8.19": + resolution: + { integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== } - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + "@types/deep-eql@4.0.2": + resolution: + { integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== } + + "@types/eslint-scope@3.7.7": + resolution: + { integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== } - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + "@types/eslint@9.6.1": + resolution: + { integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== } - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + "@types/esrecurse@4.3.1": + resolution: + { integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== } - '@types/cors@2.8.19': - resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + "@types/estree@1.0.8": + resolution: + { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + "@types/estree@1.0.9": + resolution: + { integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== } - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + "@types/events@3.0.3": + resolution: + { integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g== } - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + "@types/express-serve-static-core@4.19.7": + resolution: + { integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg== } - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + "@types/express@4.17.25": + resolution: + { integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== } - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + "@types/file-saver@2.0.7": + resolution: + { integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A== } - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + "@types/hammerjs@2.0.46": + resolution: + { integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw== } - '@types/events@3.0.3': - resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + "@types/html-minifier-terser@6.1.0": + resolution: + { integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== } - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + "@types/http-errors@2.0.5": + resolution: + { integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== } - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + "@types/http-proxy@1.17.17": + resolution: + { integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== } - '@types/file-saver@2.0.7': - resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} + "@types/istanbul-lib-coverage@2.0.6": + resolution: + { integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== } - '@types/hammerjs@2.0.46': - resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + "@types/istanbul-lib-report@3.0.3": + resolution: + { integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== } - '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + "@types/istanbul-reports@3.0.4": + resolution: + { integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== } - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + "@types/jasmine@3.10.19": + resolution: + { integrity: sha512-Bz6P2XoeIN13AhvVe0nS7+m2RfxVllETDjFQ/s6lyEwEfIVpPCc1Q8vPdFopFAOU5mzrU1zypXJ1xGDl5EVU9Q== } - '@types/http-proxy@1.17.17': - resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + "@types/jasminewd2@2.0.13": + resolution: + { integrity: sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg== } - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + "@types/jest@29.5.14": + resolution: + { integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== } - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + "@types/json-schema@7.0.15": + resolution: + { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + "@types/json5@0.0.29": + resolution: + { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } - '@types/jasmine@3.10.19': - resolution: {integrity: sha512-Bz6P2XoeIN13AhvVe0nS7+m2RfxVllETDjFQ/s6lyEwEfIVpPCc1Q8vPdFopFAOU5mzrU1zypXJ1xGDl5EVU9Q==} + "@types/jsonwebtoken@8.5.9": + resolution: + { integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg== } - '@types/jasminewd2@2.0.13': - resolution: {integrity: sha512-aJ3wj8tXMpBrzQ5ghIaqMisD8C3FIrcO6sDKHqFbuqAsI7yOxj0fA7MrRCPLZHIVUjERIwsMmGn/vB0UQ9u0Hg==} + "@types/lodash-es@4.17.12": + resolution: + { integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== } - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + "@types/lodash@4.17.24": + resolution: + { integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ== } - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + "@types/mdx@2.0.14": + resolution: + { integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg== } - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + "@types/mime@1.3.5": + resolution: + { integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== } - '@types/jsonwebtoken@8.5.9': - resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + "@types/node-forge@1.3.14": + resolution: + { integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== } - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + "@types/node@22.19.21": + resolution: + { integrity: sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA== } - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + "@types/papaparse@5.5.2": + resolution: + { integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA== } - '@types/mdx@2.0.14': - resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + "@types/qs@6.14.0": + resolution: + { integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== } - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + "@types/range-parser@1.2.7": + resolution: + { integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== } - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - - '@types/node@22.19.21': - resolution: {integrity: sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA==} - - '@types/papaparse@5.5.2': - resolution: {integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + "@types/react-dom@19.2.3": + resolution: + { integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== } peerDependencies: - '@types/react': ^19.2.0 + "@types/react": ^19.2.0 - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + "@types/react@19.2.17": + resolution: + { integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw== } - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + "@types/retry@0.12.2": + resolution: + { integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== } - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + "@types/send@0.17.6": + resolution: + { integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== } - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + "@types/serve-index@1.9.4": + resolution: + { integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== } - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + "@types/serve-static@1.15.10": + resolution: + { integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== } - '@types/sharedb@1.0.24': - resolution: {integrity: sha512-lsE7RuMxwuUOXf7ey79bVyE4ORztM8EZcUp7Tve6YbacgkGSO1SjwluZsjCyLWU77aDlVI5Iu0QG2KykRW6IRw==} + "@types/sharedb@1.0.24": + resolution: + { integrity: sha512-lsE7RuMxwuUOXf7ey79bVyE4ORztM8EZcUp7Tve6YbacgkGSO1SjwluZsjCyLWU77aDlVI5Iu0QG2KykRW6IRw== } - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + "@types/sockjs@0.3.36": + resolution: + { integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== } - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + "@types/stack-utils@2.0.3": + resolution: + { integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== } - '@types/tinycolor2@1.4.6': - resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + "@types/tinycolor2@1.4.6": + resolution: + { integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw== } - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + "@types/uuid@8.3.4": + resolution: + { integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== } - '@types/wait-on@5.3.4': - resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} + "@types/wait-on@5.3.4": + resolution: + { integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw== } - '@types/webidl-conversions@7.0.3': - resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + "@types/webidl-conversions@7.0.3": + resolution: + { integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== } - '@types/whatwg-url@8.2.2': - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + "@types/whatwg-url@8.2.2": + resolution: + { integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== } - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + "@types/ws@8.18.1": + resolution: + { integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== } - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + "@types/yargs-parser@21.0.3": + resolution: + { integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== } - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + "@types/yargs@17.0.35": + resolution: + { integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== } - '@typescript-eslint/eslint-plugin@8.61.0': - resolution: {integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/eslint-plugin@8.61.0": + resolution: + { integrity: sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - '@typescript-eslint/parser': ^8.61.0 + "@typescript-eslint/parser": ^8.61.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/parser@8.61.0': - resolution: {integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/parser@8.61.0": + resolution: + { integrity: sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/project-service@8.61.0': - resolution: {integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/project-service@8.61.0": + resolution: + { integrity: sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/scope-manager@8.61.0': - resolution: {integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/scope-manager@8.61.0": + resolution: + { integrity: sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/tsconfig-utils@8.61.0': - resolution: {integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/tsconfig-utils@8.61.0": + resolution: + { integrity: sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/type-utils@8.61.0': - resolution: {integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/type-utils@8.61.0": + resolution: + { integrity: sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/types@8.61.0': - resolution: {integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/types@8.61.0": + resolution: + { integrity: sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/typescript-estree@8.61.0': - resolution: {integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/typescript-estree@8.61.0": + resolution: + { integrity: sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/utils@8.61.0': - resolution: {integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/utils@8.61.0": + resolution: + { integrity: sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' + typescript: ">=4.8.4 <6.1.0" - '@typescript-eslint/visitor-keys@8.61.0': - resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + "@typescript-eslint/visitor-keys@8.61.0": + resolution: + { integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + "@ungap/structured-clone@1.3.1": + resolution: + { integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ== } - '@unrs/resolver-binding-android-arm-eabi@1.12.2': - resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + "@unrs/resolver-binding-android-arm-eabi@1.12.2": + resolution: + { integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w== } cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.12.2': - resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + "@unrs/resolver-binding-android-arm64@1.12.2": + resolution: + { integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ== } cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.12.2': - resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + "@unrs/resolver-binding-darwin-arm64@1.12.2": + resolution: + { integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w== } cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.12.2': - resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + "@unrs/resolver-binding-darwin-x64@1.12.2": + resolution: + { integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA== } cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.12.2': - resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + "@unrs/resolver-binding-freebsd-x64@1.12.2": + resolution: + { integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg== } cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': - resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + "@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": + resolution: + { integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A== } cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': - resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + "@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": + resolution: + { integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g== } cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': - resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + "@unrs/resolver-binding-linux-arm64-gnu@1.12.2": + resolution: + { integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg== } cpu: [arm64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-arm64-musl@1.12.2': - resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + "@unrs/resolver-binding-linux-arm64-musl@1.12.2": + resolution: + { integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA== } cpu: [arm64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': - resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + "@unrs/resolver-binding-linux-loong64-gnu@1.12.2": + resolution: + { integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q== } cpu: [loong64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-loong64-musl@1.12.2': - resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + "@unrs/resolver-binding-linux-loong64-musl@1.12.2": + resolution: + { integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew== } cpu: [loong64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': - resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + "@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": + resolution: + { integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg== } cpu: [ppc64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': - resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + "@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": + resolution: + { integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A== } cpu: [riscv64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': - resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + "@unrs/resolver-binding-linux-riscv64-musl@1.12.2": + resolution: + { integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w== } cpu: [riscv64] os: [linux] libc: [musl] - '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': - resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + "@unrs/resolver-binding-linux-s390x-gnu@1.12.2": + resolution: + { integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw== } cpu: [s390x] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-gnu@1.12.2': - resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + "@unrs/resolver-binding-linux-x64-gnu@1.12.2": + resolution: + { integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ== } cpu: [x64] os: [linux] libc: [glibc] - '@unrs/resolver-binding-linux-x64-musl@1.12.2': - resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + "@unrs/resolver-binding-linux-x64-musl@1.12.2": + resolution: + { integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A== } cpu: [x64] os: [linux] libc: [musl] - '@unrs/resolver-binding-openharmony-arm64@1.12.2': - resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + "@unrs/resolver-binding-openharmony-arm64@1.12.2": + resolution: + { integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ== } cpu: [arm64] os: [openharmony] - '@unrs/resolver-binding-wasm32-wasi@1.12.2': - resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} - engines: {node: '>=14.0.0'} + "@unrs/resolver-binding-wasm32-wasi@1.12.2": + resolution: + { integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A== } + engines: { node: ">=14.0.0" } cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': - resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + "@unrs/resolver-binding-win32-arm64-msvc@1.12.2": + resolution: + { integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g== } cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': - resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + "@unrs/resolver-binding-win32-ia32-msvc@1.12.2": + resolution: + { integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g== } cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.12.2': - resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + "@unrs/resolver-binding-win32-x64-msvc@1.12.2": + resolution: + { integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA== } cpu: [x64] os: [win32] - '@vitejs/plugin-basic-ssl@2.1.0': - resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + "@vitejs/plugin-basic-ssl@2.1.0": + resolution: + { integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } peerDependencies: vite: ^6.0.0 || ^7.0.0 - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + "@vitest/expect@3.2.4": + resolution: + { integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== } - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + "@vitest/pretty-format@3.2.4": + resolution: + { integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== } - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + "@vitest/spy@3.2.4": + resolution: + { integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== } - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + "@vitest/utils@3.2.4": + resolution: + { integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== } - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + "@webassemblyjs/ast@1.14.1": + resolution: + { integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== } - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + "@webassemblyjs/floating-point-hex-parser@1.13.2": + resolution: + { integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== } - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + "@webassemblyjs/helper-api-error@1.13.2": + resolution: + { integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== } - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + "@webassemblyjs/helper-buffer@1.14.1": + resolution: + { integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== } - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + "@webassemblyjs/helper-numbers@1.13.2": + resolution: + { integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== } - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + "@webassemblyjs/helper-wasm-bytecode@1.13.2": + resolution: + { integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== } - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + "@webassemblyjs/helper-wasm-section@1.14.1": + resolution: + { integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== } - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + "@webassemblyjs/ieee754@1.13.2": + resolution: + { integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== } - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + "@webassemblyjs/leb128@1.13.2": + resolution: + { integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== } - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + "@webassemblyjs/utf8@1.13.2": + resolution: + { integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== } - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + "@webassemblyjs/wasm-edit@1.14.1": + resolution: + { integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== } - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + "@webassemblyjs/wasm-gen@1.14.1": + resolution: + { integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== } - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + "@webassemblyjs/wasm-opt@1.14.1": + resolution: + { integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== } - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + "@webassemblyjs/wasm-parser@1.14.1": + resolution: + { integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== } - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + "@webassemblyjs/wast-printer@1.14.1": + resolution: + { integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== } - '@xmldom/xmldom@0.9.10': - resolution: {integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==} - engines: {node: '>=14.6'} + "@xmldom/xmldom@0.9.10": + resolution: + { integrity: sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw== } + engines: { node: ">=14.6" } - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + "@xtuc/ieee754@1.2.0": + resolution: + { integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== } - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + "@xtuc/long@4.2.2": + resolution: + { integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== } - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + "@yarnpkg/lockfile@1.1.0": + resolution: + { integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== } abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + resolution: + { integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== } abbrev@4.0.0: - resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA== } + engines: { node: ^20.17.0 || >=22.9.0 } abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + resolution: + { integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== } + engines: { node: ">=6.5" } accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== } + engines: { node: ">= 0.6" } accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== } + engines: { node: ">= 0.6" } acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== } + engines: { node: ">=10.13.0" } peerDependencies: acorn: ^8.14.0 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== } + engines: { node: ">=0.4.0" } acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg== } + engines: { node: ">=0.4.0" } hasBin: true adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} + resolution: + { integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== } + engines: { node: ">=8.9" } agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + resolution: + { integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== } + engines: { node: ">= 6.0.0" } agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== } + engines: { node: ">= 14" } aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== } + engines: { node: ">=8" } ajv-bsontype@1.0.7: - resolution: {integrity: sha512-9dnPihZV22Eqwn55V5VstmE641GDcFwG18BrBhsXTNrf52ASON8sAjomWd/KosAh4w+N7mKU8LB10TBp/cMQVQ==} + resolution: + { integrity: sha512-9dnPihZV22Eqwn55V5VstmE641GDcFwG18BrBhsXTNrf52ASON8sAjomWd/KosAh4w+N7mKU8LB10TBp/cMQVQ== } ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -3801,7 +4450,8 @@ packages: optional: true ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + resolution: + { integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -3809,835 +4459,1043 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + resolution: + { integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== } peerDependencies: ajv: ^6.9.1 ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + resolution: + { integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== } peerDependencies: ajv: ^8.8.2 ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + resolution: + { integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== } ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + resolution: + { integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== } ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + resolution: + { integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A== } ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + resolution: + { integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== } algoliasearch@5.35.0: - resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==} - engines: {node: '>= 14.0.0'} + resolution: + { integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg== } + engines: { node: ">= 14.0.0" } amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} + resolution: + { integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== } + engines: { node: ">=0.4.2" } angular-file@4.0.2: - resolution: {integrity: sha512-br2vXkn1adg/PIUC9T1lQhlW6fiVjP19IKjulhwM90NivU6hnC8OIR1Ae/qpDgbFhd2S1bjHF7QhLEt9GOaCLw==} + resolution: + { integrity: sha512-br2vXkn1adg/PIUC9T1lQhlW6fiVjP19IKjulhwM90NivU6hnC8OIR1Ae/qpDgbFhd2S1bjHF7QhLEt9GOaCLw== } angular-split@16.2.1: - resolution: {integrity: sha512-Yqf9sit9qDELM95EottO7cgY++AzD8XH7e6c1fTnC+s39TRY/LUOVT0k9ysEp1yH5wz7GHwcm+uZMSDBAjuODA==} + resolution: + { integrity: sha512-Yqf9sit9qDELM95EottO7cgY++AzD8XH7e6c1fTnC+s39TRY/LUOVT0k9ysEp1yH5wz7GHwcm+uZMSDBAjuODA== } deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: - '@angular/common': '>=16.0.0' - '@angular/core': '>=16.0.0' - rxjs: '>=7.0.0' + "@angular/common": ">=16.0.0" + "@angular/core": ">=16.0.0" + rxjs: ">=7.0.0" ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } + engines: { node: ">=6" } ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== } + engines: { node: ">=8" } ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg== } + engines: { node: ">=18" } ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} + resolution: + { integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== } + engines: { "0": node >= 0.8.0 } hasBin: true ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== } + engines: { node: ">=4" } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: ">=8" } ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== } + engines: { node: ">=12" } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } + engines: { node: ">=4" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: ">=8" } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } + engines: { node: ">=10" } ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== } + engines: { node: ">=12" } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } + engines: { node: ">= 8" } anynum@1.0.0: - resolution: {integrity: sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==} + resolution: + { integrity: sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA== } apache-crypt@1.2.6: - resolution: {integrity: sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA== } + engines: { node: ">=8" } apache-md5@1.1.8: - resolution: {integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA== } + engines: { node: ">=8" } append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== } + engines: { node: ">=8" } archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + resolution: + { integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== } are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== } + engines: { node: ">=14" } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + resolution: + { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== } + engines: { node: ">= 0.4" } array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== } + engines: { node: ">= 0.4" } array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== } array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== } + engines: { node: ">= 0.4" } array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== } + engines: { node: ">= 0.4" } array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== } + engines: { node: ">= 0.4" } array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== } + engines: { node: ">= 0.4" } arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== } + engines: { node: ">= 0.4" } arraydiff@0.1.3: - resolution: {integrity: sha512-t0OgO06uolEcMUvV8+yHc9Pc9pazh8wi/Dtyok/sQwvcr8iFV+P86IfAzK7upUDhI4oavhVREMY7iSWtm38LeA==} + resolution: + { integrity: sha512-t0OgO06uolEcMUvV8+yHc9Pc9pazh8wi/Dtyok/sQwvcr8iFV+P86IfAzK7upUDhI4oavhVREMY7iSWtm38LeA== } assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== } + engines: { node: ">=12" } ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== } + engines: { node: ">=4" } async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== } + engines: { node: ">= 0.4" } async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + resolution: + { integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== } async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + resolution: + { integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } + engines: { node: ">= 0.4" } axios@1.18.0: - resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} + resolution: + { integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw== } axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== } + engines: { node: ">= 0.4" } babel-jest@30.4.1: - resolution: {integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-fATAbM8piYxkiXQp3RBXmZHxZVNJZAVXXfyeyCN2Tida3+qJ8ea9UxhiJ2y4fLO90ZImKt6k9FlcH2+rLkJGhw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-0 + "@babel/core": ^7.11.0 || ^8.0.0-0 babel-loader@10.0.0: - resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} - engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} + resolution: + { integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== } + engines: { node: ^18.20.0 || ^20.10.0 || >=22.0.0 } peerDependencies: - '@babel/core': ^7.12.0 + "@babel/core": ^7.12.0 webpack: 5.105.0 babel-loader@8.4.1: - resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} - engines: {node: '>= 8.9'} + resolution: + { integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== } + engines: { node: ">= 8.9" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 webpack: 5.105.0 babel-plugin-istanbul@7.0.1: - resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA== } + engines: { node: ">=12" } babel-plugin-jest-hoist@30.4.0: - resolution: {integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-9EdtWM/sSfXLOGLwSn+GS6pIXyBnL07/8gyJlwFXjWy4DxMOyItqyUT29d4lQiS380EZwYlX7/At4PgBS+m2aA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } babel-plugin-polyfill-corejs2@0.4.17: - resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} + resolution: + { integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + resolution: + { integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-regenerator@0.6.8: - resolution: {integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==} + resolution: + { integrity: sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 babel-preset-current-node-syntax@1.2.0: - resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} + resolution: + { integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== } peerDependencies: - '@babel/core': ^7.0.0 || ^8.0.0-0 + "@babel/core": ^7.0.0 || ^8.0.0-0 babel-preset-jest@30.4.0: - resolution: {integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-lBY4jxsNmCnSiu7kquw8ZC9F4+XLMOKypT3RnNHPvU2Kpd4W0xaPuLr5ZkRyOsvLYAY4yaW1ZwTW4xB7NIiZzg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } peerDependencies: - '@babel/core': ^7.11.0 || ^8.0.0-beta.1 + "@babel/core": ^7.11.0 || ^8.0.0-beta.1 balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } balanced-match@4.0.4: - resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} - engines: {node: 18 || 20 || >=22} + resolution: + { integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== } + engines: { node: 18 || 20 || >=22 } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} + resolution: + { integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== } + engines: { node: ^4.5.0 || >= 5.9 } baseline-browser-mapping@2.10.37: - resolution: {integrity: sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig== } + engines: { node: ">=6.0.0" } hasBin: true basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== } + engines: { node: ">= 0.8" } batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + resolution: + { integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== } bcryptjs@2.4.3: - resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} + resolution: + { integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== } beasties@0.3.5: - resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A== } + engines: { node: ">=14.0.0" } big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + resolution: + { integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== } + engines: { node: ">=8" } bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + resolution: + { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== } body-parser@1.20.6: - resolution: {integrity: sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { integrity: sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g== } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } body-parser@2.3.0: - resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw== } + engines: { node: ">=18" } bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + resolution: + { integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== } bootstrap.native@5.1.10: - resolution: {integrity: sha512-JwJnMWx/zJirvwEPuvmKve4JoSh6upA5qNWdWj78nJmBCmVhBGXdYHxQIldkIRIReZjCiXntZBLFd3TYoGfgxw==} - engines: {node: '>=16', pnpm: '>=8.6.0'} + resolution: + { integrity: sha512-JwJnMWx/zJirvwEPuvmKve4JoSh6upA5qNWdWj78nJmBCmVhBGXdYHxQIldkIRIReZjCiXntZBLFd3TYoGfgxw== } + engines: { node: ">=16", pnpm: ">=8.6.0" } bowser@2.14.1: - resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + resolution: + { integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg== } brace-expansion@1.1.16: - resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + resolution: + { integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw== } brace-expansion@2.1.2: - resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} + resolution: + { integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA== } brace-expansion@5.0.8: - resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg== } + engines: { node: 20 || >=22 } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: ">=8" } browser-tabs-lock@1.3.0: - resolution: {integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==} + resolution: + { integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw== } browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + resolution: + { integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== } bson-objectid@2.0.4: - resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} + resolution: + { integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ== } bson@4.7.2: - resolution: {integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ== } + engines: { node: ">=6.9.0" } buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + resolution: + { integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== } + engines: { node: ">=18" } byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== } + engines: { node: ">=0.10.0" } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== } + engines: { node: ">= 0.8" } cacache@20.0.4: - resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA== } + engines: { node: ^20.17.0 || >=22.9.0 } caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== } + engines: { node: ">=8" } call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } + engines: { node: ">= 0.4" } call-bind@1.0.9: - resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== } + engines: { node: ">= 0.4" } call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== } + engines: { node: ">= 0.4" } callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + resolution: + { integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ== } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: ">=6" } camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + resolution: + { integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } + engines: { node: ">=6" } camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== } + engines: { node: ">=10" } caniuse-lite@1.0.30001799: - resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==} + resolution: + { integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw== } case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== } + engines: { node: ">=4" } chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== } + engines: { node: ">=18" } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } + engines: { node: ">=4" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: ">=10" } chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== } + engines: { node: ">=10" } chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + resolution: + { integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== } check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} + resolution: + { integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== } + engines: { node: ">= 16" } cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + resolution: + { integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== } cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} - engines: {node: '>=20.18.1'} + resolution: + { integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg== } + engines: { node: ">=20.18.1" } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== } + engines: { node: ">= 8.10.0" } chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} + resolution: + { integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== } + engines: { node: ">= 14.16.0" } chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} + resolution: + { integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw== } + engines: { node: ">= 20.19.0" } chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== } + engines: { node: ">=18" } chromatic@6.24.1: - resolution: {integrity: sha512-XbpdWWHvFpEHtcq1Km71UcuQ07effB+8q8L47E1Y7HJmJ4ZCoKCuPd8liNrbnvwEAxqfBZvTcONYU/3BPz2i5w==} + resolution: + { integrity: sha512-XbpdWWHvFpEHtcq1Km71UcuQ07effB+8q8L47E1Y7HJmJ4ZCoKCuPd8liNrbnvwEAxqfBZvTcONYU/3BPz2i5w== } hasBin: true chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== } + engines: { node: ">=6.0" } ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== } + engines: { node: ">=8" } ci-info@4.4.0: - resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg== } + engines: { node: ">=8" } cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + resolution: + { integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== } cjs-module-lexer@2.2.0: - resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + resolution: + { integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ== } clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + resolution: + { integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== } + engines: { node: ">= 10.0" } clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== } + engines: { node: ">=6" } cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } + engines: { node: ">=8" } cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== } + engines: { node: ">=18" } cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== } + engines: { node: ">=6" } cli-spinners@3.4.0: - resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} - engines: {node: '>=18.20'} + resolution: + { integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw== } + engines: { node: ">=18.20" } cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== } + engines: { node: ">=18" } cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== } + engines: { node: ">= 12" } cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + resolution: + { integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: ">=12" } cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== } + engines: { node: ">=20" } clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== } + engines: { node: ">=6" } clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } + engines: { node: ">=0.8" } co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + resolution: + { integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== } + engines: { iojs: ">= 1.0.0", node: ">= 0.12.0" } code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + resolution: + { integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg== } collect-v8-coverage@1.0.3: - resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} + resolution: + { integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw== } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: ">=7.0.0" } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + resolution: + { integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== } hasBin: true colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + resolution: + { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} + resolution: + { integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== } + engines: { node: ">=0.1.90" } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: ">= 0.8" } comlink@4.4.2: - resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==} + resolution: + { integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g== } commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== } + engines: { node: ">=18" } commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== } + engines: { node: ">=18" } commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw== } + engines: { node: ">=20" } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== } commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + resolution: + { integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== } + engines: { node: ">= 10" } commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== } + engines: { node: ">= 12" } comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== } + engines: { node: ">= 12.0.0" } commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + resolution: + { integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== } component-emitter@2.0.0: - resolution: {integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-4m5s3Me2xxlVKG9PkZpQqHQR7bgpnN7joDMJ4yvVkVXngjoITG76IaZmzmywSeRTeTpc6N6r3H3+KyUurV8OYw== } + engines: { node: ">=18" } compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== } + engines: { node: ">= 0.6" } compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== } + engines: { node: ">= 0.8.0" } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== } + engines: { node: ">=0.8" } connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} + resolution: + { integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== } + engines: { node: ">= 0.10.0" } content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== } + engines: { node: ">= 0.6" } content-disposition@1.1.0: - resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g== } + engines: { node: ">=18" } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== } + engines: { node: ">= 0.6" } content-type@2.0.0: - resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ== } + engines: { node: ">=18" } convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + resolution: + { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== } convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + resolution: + { integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== } cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} + resolution: + { integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== } + engines: { node: ">=6.6.0" } cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== } + engines: { node: ">= 0.6" } copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + resolution: + { integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== } copy-webpack-plugin@14.0.0: - resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==} - engines: {node: '>= 20.9.0'} + resolution: + { integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA== } + engines: { node: ">= 20.9.0" } peerDependencies: webpack: 5.105.0 core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + resolution: + { integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA== } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== } cors@2.8.6: - resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw== } + engines: { node: ">= 0.10" } cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== } + engines: { node: ">=14" } peerDependencies: - typescript: '>=4.9.5' + typescript: ">=4.9.5" peerDependenciesMeta: typescript: optional: true cosmiconfig@9.0.2: - resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg== } + engines: { node: ">=14" } peerDependencies: - typescript: '>=4.9.5' + typescript: ">=4.9.5" peerDependenciesMeta: typescript: optional: true crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== } + engines: { node: ">=0.8" } hasBin: true create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } + engines: { node: ">= 8" } css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true css-loader@7.1.4: - resolution: {integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw== } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || ^1.0.0 || ^2.0.0-0 + "@rspack/core": 0.x || ^1.0.0 || ^2.0.0-0 webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + resolution: + { integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== } css-select@5.2.2: - resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + resolution: + { integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw== } css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + resolution: + { integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw== } css-what@6.2.2: - resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== } + engines: { node: ">= 6" } css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ== } + engines: { node: ">= 6" } css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + resolution: + { integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } + engines: { node: ">=4" } hasBin: true csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + resolution: + { integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== } custom-event@1.0.1: - resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} + resolution: + { integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== } cwd@0.10.0: - resolution: {integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== } + engines: { node: ">=0.8" } data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== } + engines: { node: ">= 0.4" } data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== } + engines: { node: ">= 0.4" } data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== } + engines: { node: ">= 0.4" } date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== } + engines: { node: ">=4.0" } debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + resolution: + { integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== } debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decache@4.6.2: - resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} + resolution: + { integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw== } decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== } + engines: { node: ">=0.10.0" } dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + resolution: + { integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA== } peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4645,377 +5503,478 @@ packages: optional: true deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== } + engines: { node: ">=6" } deep-equal@1.1.2: - resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== } + engines: { node: ">= 0.4" } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== } + engines: { node: ">=0.10.0" } default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== } + engines: { node: ">=18" } default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== } + engines: { node: ">=18" } default-require-extensions@3.0.1: - resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== } + engines: { node: ">=8" } defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: + { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== } + engines: { node: ">= 0.4" } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== } + engines: { node: ">=8" } define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== } + engines: { node: ">=12" } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } + engines: { node: ">= 0.4" } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: ">=0.4.0" } depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== } + engines: { node: ">= 0.6" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== } + engines: { node: ">= 0.8" } dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } + engines: { node: ">=6" } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== } + engines: { node: ">=8" } detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== } + engines: { node: ">=8" } detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + resolution: + { integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== } di@0.0.1: - resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} + resolution: + { integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA== } diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} + resolution: + { integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== } + engines: { node: ">=0.3.1" } diffable-html@4.1.0: - resolution: {integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g==} + resolution: + { integrity: sha512-++kyNek+YBLH8cLXS+iTj/Hiy2s5qkRJEJ8kgu/WHbFrVY2vz9xPFUT+fii2zGF0m1CaojDlQJjkfrCt7YWM1g== } dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== } + engines: { node: ">=6" } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } + engines: { node: ">=0.10.0" } dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + resolution: + { integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== } dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + resolution: + { integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== } dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + resolution: + { integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== } dom-serialize@2.2.1: - resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + resolution: + { integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ== } dom-serializer@0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + resolution: + { integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== } dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + resolution: + { integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== } dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== } domelementtype@1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + resolution: + { integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== } domhandler@2.4.2: - resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + resolution: + { integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== } domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== } + engines: { node: ">= 4" } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== } + engines: { node: ">= 4" } domutils@1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + resolution: + { integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== } domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + resolution: + { integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== } domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + resolution: + { integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== } dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + resolution: + { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } dot@2.0.0-beta.1: - resolution: {integrity: sha512-kxM7fSnNQTXOmaeGuBSXM8O3fEsBb7XSDBllkGbRwa0lJSJTxxDE/4eSNGLKZUmlFw0f1vJ5qSV2BljrgQtgIA==} + resolution: + { integrity: sha512-kxM7fSnNQTXOmaeGuBSXM8O3fEsBb7XSDBllkGbRwa0lJSJTxxDE/4eSNGLKZUmlFw0f1vJ5qSV2BljrgQtgIA== } dpop@2.1.1: - resolution: {integrity: sha512-J0Of2JTiM4h5si0tlbPQ/lkqfZ5wAEVkKYBhkwyyANnPJfWH4VsR5uIkZ+T+OSPIwDYUg1fbd5Mmodd25HjY1w==} + resolution: + { integrity: sha512-J0Of2JTiM4h5si0tlbPQ/lkqfZ5wAEVkKYBhkwyyANnPJfWH4VsR5uIkZ+T+OSPIwDYUg1fbd5Mmodd25HjY1w== } dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } + engines: { node: ">= 0.4" } duplex-maker@1.0.0: - resolution: {integrity: sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA==} + resolution: + { integrity: sha512-KoHuzggxg7f+vvjqOHfXxaQYI1POzBm+ah0eec7YDssZmbt6QFBI8d1nl5GQwAgR2f+VQCPvyvZtmWWqWuFtlA== } duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + resolution: + { integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== } duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + resolution: + { integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + resolution: + { integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== } electron-to-chromium@1.5.372: - resolution: {integrity: sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==} + resolution: + { integrity: sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA== } emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== } + engines: { node: ">=12" } emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + resolution: + { integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== } + engines: { node: ">= 4" } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== } + engines: { node: ">= 0.8" } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== } + engines: { node: ">= 0.8" } encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + resolution: + { integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw== } end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + resolution: + { integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== } engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== } + engines: { node: ">=10.0.0" } engine.io@6.6.8: - resolution: {integrity: sha512-2agL3ueZhqxoVrfmntO8yuVj+uNSlIOnhykYHk3Cq0ShYPdUjjUiSJrQvXjq01I9jAuI0Zl2YO8Evv5Mqytm5g==} - engines: {node: '>=10.2.0'} + resolution: + { integrity: sha512-2agL3ueZhqxoVrfmntO8yuVj+uNSlIOnhykYHk3Cq0ShYPdUjjUiSJrQvXjq01I9jAuI0Zl2YO8Evv5Mqytm5g== } + engines: { node: ">=10.2.0" } enhanced-resolve@5.24.0: - resolution: {integrity: sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ== } + engines: { node: ">=10.13.0" } ent@2.2.2: - resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw== } + engines: { node: ">= 0.4" } entities@1.1.2: - resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + resolution: + { integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== } entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + resolution: + { integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: ">=0.12" } entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== } + engines: { node: ">=0.12" } entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA== } + engines: { node: ">=0.12" } entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} + resolution: + { integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA== } + engines: { node: ">=20.19.0" } env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } + engines: { node: ">=6" } environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== } + engines: { node: ">=18" } err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + resolution: + { integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== } errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + resolution: + { integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== } hasBin: true error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + resolution: + { integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ== } error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + resolution: + { integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== } es-abstract@1.24.2: - resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== } + engines: { node: ">= 0.4" } es-cookie@1.3.2: - resolution: {integrity: sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==} + resolution: + { integrity: sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q== } es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } + engines: { node: ">= 0.4" } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== } es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + resolution: + { integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ== } es-object-atoms@1.1.2: - resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== } + engines: { node: ">= 0.4" } es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== } + engines: { node: ">= 0.4" } es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== } + engines: { node: ">= 0.4" } es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== } + engines: { node: ">= 0.4" } es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + resolution: + { integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== } es6-shim@0.35.8: - resolution: {integrity: sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==} + resolution: + { integrity: sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg== } esbuild-wasm@0.28.0: - resolution: {integrity: sha512-5TRVKExcEmeMkccIZMzUq+Az6X2RoMAJyfl6SMMO1dMVhmvt0I2mx7gAb6zYi42n4d1ETcatFXazGKzA+aW7fg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-5TRVKExcEmeMkccIZMzUq+Az6X2RoMAJyfl6SMMO1dMVhmvt0I2mx7gAb6zYi42n4d1ETcatFXazGKzA+aW7fg== } + engines: { node: ">=18" } hasBin: true esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw== } + engines: { node: ">=18" } hasBin: true esbuild@0.28.0: - resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw== } + engines: { node: ">=18" } hasBin: true escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } + engines: { node: ">=0.8.0" } escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== } + engines: { node: ">=8" } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: ">=10" } escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== } + engines: { node: ">=0.12.0" } hasBin: true eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + resolution: + { integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== } hasBin: true peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-import-resolver-node@0.3.10: - resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + resolution: + { integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ== } eslint-module-utils@2.13.0: - resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + resolution: + { integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ== } + engines: { node: ">=4" } + peerDependencies: + "@typescript-eslint/parser": "*" + eslint: "*" + eslint-import-resolver-node: "*" + eslint-import-resolver-typescript: "*" + eslint-import-resolver-webpack: "*" peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true eslint: optional: true @@ -5027,248 +5986,305 @@ packages: optional: true eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== } + engines: { node: ">=4" } peerDependencies: - '@typescript-eslint/parser': '*' + "@typescript-eslint/parser": "*" eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true eslint-plugin-jsdoc@60.8.3: - resolution: {integrity: sha512-4191bTMvnd5WUtopCdzNhQchvv/MxtPD86ZGl3vem8Ibm22xJhKuIyClmgSxw+YERtorVc/NhG+bGjfFVa6+VQ==} - engines: {node: '>=20.11.0'} + resolution: + { integrity: sha512-4191bTMvnd5WUtopCdzNhQchvv/MxtPD86ZGl3vem8Ibm22xJhKuIyClmgSxw+YERtorVc/NhG+bGjfFVa6+VQ== } + engines: { node: ">=20.11.0" } peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-plugin-prettier@5.5.6: - resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' + resolution: + { integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ== } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" + prettier: ">=3.0.0" peerDependenciesMeta: - '@types/eslint': + "@types/eslint": optional: true eslint-config-prettier: optional: true eslint-plugin-storybook@10.2.14: - resolution: {integrity: sha512-iFHN+hs2DQsY0KZssb9Dse5MVFT22E/f6BK9bShGq21TXv/z2+ix72NfIFTWg3sLFoEXr18uGWZiM5e3jt1EqQ==} + resolution: + { integrity: sha512-iFHN+hs2DQsY0KZssb9Dse5MVFT22E/f6BK9bShGq21TXv/z2+ix72NfIFTWg3sLFoEXr18uGWZiM5e3jt1EqQ== } peerDependencies: - eslint: '>=8' + eslint: ">=8" storybook: ^10.2.14 eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== } + engines: { node: ">=8.0.0" } eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + resolution: + { integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== } + engines: { node: ^20.19.0 || ^22.13.0 || >=24 } eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: - jiti: '*' + jiti: "*" peerDependenciesMeta: jiti: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== } + engines: { node: ">=0.10.0" } hasBin: true esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: ">=4" } hasBin: true esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== } + engines: { node: ">=0.10" } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: ">=4.0" } estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== } + engines: { node: ">=0.10.0" } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: ">=4.0" } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: ">=0.10.0" } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== } + engines: { node: ">= 0.6" } event-stream@4.0.1: - resolution: {integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==} + resolution: + { integrity: sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA== } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== } + engines: { node: ">=6" } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== } eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + resolution: + { integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw== } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== } + engines: { node: ">=0.8.x" } eventsource-parser@3.1.0: - resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg== } + engines: { node: ">=18.0.0" } eventsource@2.0.2: - resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== } + engines: { node: ">=12.0.0" } eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== } + engines: { node: ">=18.0.0" } execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== } + engines: { node: ">=10" } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== } + engines: { node: ">=10" } execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + resolution: + { integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== } + engines: { node: ">=16.17" } exit-x@0.2.2: - resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ== } + engines: { node: ">= 0.8.0" } exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== } + engines: { node: ">= 0.8.0" } expand-tilde@1.2.2: - resolution: {integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== } + engines: { node: ">=0.10.0" } expect-playwright@0.8.0: - resolution: {integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg==} + resolution: + { integrity: sha512-+kn8561vHAY+dt+0gMqqj1oY+g5xWrsuGMk4QGxotT2WS545nVqqjs37z6hrYfIuucwqthzwJfCJUEYqixyljg== } deprecated: ⚠️ The 'expect-playwright' package is deprecated. The Playwright core assertions (via @playwright/test) now cover the same functionality. Please migrate to built-in expect. See https://playwright.dev/docs/test-assertions for migration. expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } expect@30.4.1: - resolution: {integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + resolution: + { integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA== } express-rate-limit@8.5.2: - resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==} - engines: {node: '>= 16'} + resolution: + { integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A== } + engines: { node: ">= 16" } peerDependencies: - express: '>= 4.11' + express: ">= 4.11" express@4.22.2: - resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} - engines: {node: '>= 0.10.0'} + resolution: + { integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q== } + engines: { node: ">= 0.10.0" } express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== } + engines: { node: ">= 18" } extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + resolution: + { integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== } fancy-log@2.0.0: - resolution: {integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA== } + engines: { node: ">=10.13.0" } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + resolution: + { integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + resolution: + { integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } fast-uri@3.1.4: - resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + resolution: + { integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw== } fast-xml-builder@1.2.0: - resolution: {integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==} + resolution: + { integrity: sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q== } fast-xml-parser@5.7.3: - resolution: {integrity: sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg==} + resolution: + { integrity: sha512-C0AaNuC+mscy6vrAQKAc/rMq+zAPHodfHGZu4sGVehvAQt/JLG1O5zEcYcXSY5zSqr4YVgxsB+pHXTq0i7eDlg== } hasBin: true fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + resolution: + { integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== } faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== } + engines: { node: ">=0.8.0" } fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + resolution: + { integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== } fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5276,456 +6292,568 @@ packages: optional: true fetch-cookie@2.2.0: - resolution: {integrity: sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==} + resolution: + { integrity: sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ== } file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } + engines: { node: ">=16.0.0" } file-saver@2.0.5: - resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} + resolution: + { integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: ">=8" } finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== } + engines: { node: ">= 0.8" } finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== } + engines: { node: ">= 0.8" } finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} + resolution: + { integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== } + engines: { node: ">= 18.0.0" } find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== } + engines: { node: ">=8" } find-file-up@0.1.3: - resolution: {integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== } + engines: { node: ">=0.10.0" } find-pkg@0.1.2: - resolution: {integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== } + engines: { node: ">=0.10.0" } find-process@1.4.11: - resolution: {integrity: sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA==} + resolution: + { integrity: sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA== } hasBin: true find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } + engines: { node: ">=8" } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: ">=10" } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } + engines: { node: ">=16" } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== } hasBin: true flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + resolution: + { integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== } follow-redirects@1.16.0: - resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== } + engines: { node: ">=4.0" } peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== } + engines: { node: ">= 0.4" } foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== } + engines: { node: ">=8.0.0" } foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== } + engines: { node: ">=14" } fork-ts-checker-webpack-plugin@9.1.0: - resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} - engines: {node: '>=14.21.3'} + resolution: + { integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q== } + engines: { node: ">=14.21.3" } peerDependencies: - typescript: '>3.6.0' + typescript: ">3.6.0" webpack: 5.105.0 form-data@4.0.6: - resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== } + engines: { node: ">= 6" } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== } + engines: { node: ">= 0.6" } fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== } fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== } + engines: { node: ">= 0.6" } fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== } + engines: { node: ">= 0.8" } from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + resolution: + { integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== } fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + resolution: + { integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== } fs-exists-sync@0.1.0: - resolution: {integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== } + engines: { node: ">=0.10.0" } fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== } + engines: { node: ">=12" } fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} - engines: {node: '>=14.14'} + resolution: + { integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg== } + engines: { node: ">=14.14" } fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== } + engines: { node: ">=6 <7 || >=8" } fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } fs-monkey@1.1.0: - resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + resolution: + { integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } function.prototype.name@1.2.0: - resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew== } + engines: { node: ">= 0.4" } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== } + engines: { node: ">= 0.4" } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } + engines: { node: ">=6.9.0" } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } get-east-asian-width@1.6.0: - resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA== } + engines: { node: ">=18" } get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== } + engines: { node: ">= 0.4" } get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== } + engines: { node: ">=8.0.0" } get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } + engines: { node: ">= 0.4" } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } + engines: { node: ">=8" } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: ">=10" } get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== } + engines: { node: ">=16" } get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== } + engines: { node: ">= 0.4" } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: ">= 6" } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: ">=10.13.0" } glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} + resolution: + { integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== } glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + resolution: + { integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== } deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.6: - resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} - engines: {node: 18 || 20 || >=22} + resolution: + { integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== } + engines: { node: 18 || 20 || >=22 } glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + resolution: + { integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== } deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-modules@0.2.3: - resolution: {integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== } + engines: { node: ">=0.10.0" } global-prefix@0.1.5: - resolution: {integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== } + engines: { node: ">=0.10.0" } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } + engines: { node: ">=18" } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== } + engines: { node: ">= 0.4" } gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== } + engines: { node: ">= 0.4" } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== } + engines: { node: ">=10" } gzipper@8.2.1: - resolution: {integrity: sha512-Vp2vDpwU4xKtWxTaLPfNTR4euqHJamB6aKCfSEbSd/CrgqihwNxrjihJcWJG1+3Ku1ROsfF6fPXRoytTFLhFlw==} - engines: {node: '>=20.11.0'} + resolution: + { integrity: sha512-Vp2vDpwU4xKtWxTaLPfNTR4euqHJamB6aKCfSEbSd/CrgqihwNxrjihJcWJG1+3Ku1ROsfF6fPXRoytTFLhFlw== } + engines: { node: ">=20.11.0" } hasBin: true handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + resolution: + { integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== } handlebars@4.7.9: - resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} - engines: {node: '>=0.4.7'} + resolution: + { integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ== } + engines: { node: ">=0.4.7" } hasBin: true has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== } + engines: { node: ">= 0.4" } has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== } + engines: { node: ">=0.10.0" } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } + engines: { node: ">=4" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: ">=8" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== } + engines: { node: ">= 0.4" } has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== } + engines: { node: ">= 0.4" } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } + engines: { node: ">= 0.4" } hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== } + engines: { node: ">=8" } hasown@2.0.4: - resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== } + engines: { node: ">= 0.4" } hat@0.0.3: - resolution: {integrity: sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug==} + resolution: + { integrity: sha512-zpImx2GoKXy42fVDSEad2BPKuSQdLcqsCYa48K3zHSzM/ugWuYjLDr8IXxpVuL7uCLHw56eaiLxCRthhOzf5ug== } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== } hasBin: true homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== } + engines: { node: ">=0.10.0" } hono@4.12.30: - resolution: {integrity: sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog==} - engines: {node: '>=16.9.0'} + resolution: + { integrity: sha512-emn+JoJjrN9YTpRDS5it/UI2SO9BAE37T6I3d963RxcZ81G9A4pr2SZTEiiaiKbzx+NKRg5BZ89fCL7gCJCUog== } + engines: { node: ">=16.9.0" } hosted-git-info@9.0.3: - resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg== } + engines: { node: ^20.17.0 || >=22.9.0 } hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + resolution: + { integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== } html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + resolution: + { integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== } + engines: { node: ">=12" } hasBin: true html-webpack-plugin@5.6.7: - resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw== } + engines: { node: ">=10.13.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + resolution: + { integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ== } htmlparser2@3.10.1: - resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + resolution: + { integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== } htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + resolution: + { integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== } http-auth-connect@1.0.6: - resolution: {integrity: sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw== } + engines: { node: ">=8" } http-auth@4.1.9: - resolution: {integrity: sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ== } + engines: { node: ">=8" } http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + resolution: + { integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== } http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + resolution: + { integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== } http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== } + engines: { node: ">= 0.6" } http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== } + engines: { node: ">= 0.8" } http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + resolution: + { integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== } http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } + engines: { node: ">= 14" } http-proxy-middleware@2.0.10: - resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== } + engines: { node: ">=12.0.0" } peerDependencies: - '@types/express': ^4.17.13 + "@types/express": ^4.17.13 peerDependenciesMeta: - '@types/express': + "@types/express": optional: true http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== } + engines: { node: ">=8.0.0" } https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== } + engines: { node: ">= 6" } https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== } + engines: { node: ">= 14" } human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} + resolution: + { integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== } + engines: { node: ">=8.12.0" } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } + engines: { node: ">=10.17.0" } human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + resolution: + { integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== } + engines: { node: ">=16.17.0" } husky@7.0.4: - resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== } + engines: { node: ">=12" } hasBin: true hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} + resolution: + { integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== } + engines: { node: ">=10.18" } i18next@23.16.8: - resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==} + resolution: + { integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg== } i18next@25.7.4: - resolution: {integrity: sha512-hRkpEblXXcXSNbw8mBNq9042OEetgyB/ahc/X17uV/khPwzV+uB8RHceHh3qavyrkPJvmXFKXME2Sy1E0KjAfw==} + resolution: + { integrity: sha512-hRkpEblXXcXSNbw8mBNq9042OEetgyB/ahc/X17uV/khPwzV+uB8RHceHh3qavyrkPJvmXFKXME2Sy1E0KjAfw== } peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -5733,388 +6861,486 @@ packages: optional: true iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== } + engines: { node: ">=0.10.0" } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } + engines: { node: ">=0.10.0" } iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw== } + engines: { node: ">=0.10.0" } icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } ignore-walk@8.0.0: - resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A== } + engines: { node: ^20.17.0 || >=22.9.0 } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } + engines: { node: ">= 4" } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== } + engines: { node: ">= 4" } image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== } + engines: { node: ">=0.10.0" } hasBin: true immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + resolution: + { integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== } immutable@5.1.9: - resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} + resolution: + { integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg== } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== } + engines: { node: ">=6" } import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== } + engines: { node: ">=8" } hasBin: true imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: ">=0.8.19" } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } + engines: { node: ">=8" } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== } ini@5.0.0: - resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw== } + engines: { node: ^18.17.0 || >=20.5.0 } ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ== } + engines: { node: ^20.17.0 || >=22.9.0 } internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== } + engines: { node: ">= 0.4" } ip-address@10.2.0: - resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA== } + engines: { node: ">= 12" } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== } + engines: { node: ">= 0.10" } ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg== } + engines: { node: ">= 10" } is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== } + engines: { node: ">= 0.4" } is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== } + engines: { node: ">= 0.4" } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== } + engines: { node: ">= 0.4" } is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== } + engines: { node: ">= 0.4" } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } + engines: { node: ">=8" } is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== } + engines: { node: ">= 0.4" } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } + engines: { node: ">= 0.4" } is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== } + engines: { node: ">= 0.4" } is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== } + engines: { node: ">= 0.4" } is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== } + engines: { node: ">= 0.4" } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== } + engines: { node: ">=8" } hasBin: true is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } hasBin: true is-document.all@1.0.0: - resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g== } + engines: { node: ">= 0.4" } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: ">=0.10.0" } is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== } + engines: { node: ">= 0.4" } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: ">=8" } is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== } + engines: { node: ">=12" } is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ== } + engines: { node: ">=18" } is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== } + engines: { node: ">=6" } is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== } + engines: { node: ">= 0.4" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: ">=0.10.0" } is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== } + engines: { node: ">=14.16" } hasBin: true is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== } + engines: { node: ">=8" } is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== } + engines: { node: ">=12" } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== } + engines: { node: ">= 0.4" } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== } + engines: { node: ">= 0.4" } is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw== } + engines: { node: ">=16" } is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== } + engines: { node: ">= 0.4" } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: ">=0.12.0" } is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== } + engines: { node: ">=10" } is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== } + engines: { node: ">=0.10.0" } is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== } + engines: { node: ">=0.10.0" } is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + resolution: + { integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== } is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== } + engines: { node: ">= 0.4" } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== } + engines: { node: ">= 0.4" } is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== } + engines: { node: ">= 0.4" } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } + engines: { node: ">=8" } is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== } + engines: { node: ">= 0.4" } is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== } + engines: { node: ">= 0.4" } is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== } + engines: { node: ">= 0.4" } is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + resolution: + { integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== } is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== } + engines: { node: ">=10" } is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== } + engines: { node: ">=12" } is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ== } + engines: { node: ">=18" } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== } + engines: { node: ">= 0.4" } is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== } + engines: { node: ">= 0.4" } is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== } + engines: { node: ">= 0.4" } is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + resolution: + { integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== } is-windows@0.2.0: - resolution: {integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== } + engines: { node: ">=0.10.0" } is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== } + engines: { node: ">=0.10.0" } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== } + engines: { node: ">=8" } is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== } + engines: { node: ">=16" } is-zst@1.0.0: - resolution: {integrity: sha512-ZA5lvshKAl8z30dX7saXLpVhpsq3d2EHK9uf7qtUjnOtdw4XBpAoWb2RvZ5kyoaebdoidnGI0g2hn9Z7ObPbww==} + resolution: + { integrity: sha512-ZA5lvshKAl8z30dX7saXLpVhpsq3d2EHK9uf7qtUjnOtdw4XBpAoWb2RvZ5kyoaebdoidnGI0g2hn9Z7ObPbww== } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} + resolution: + { integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== } + engines: { node: ">= 8.0.0" } iserror@0.0.2: - resolution: {integrity: sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==} + resolution: + { integrity: sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw== } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } isexe@4.0.0: - resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw== } + engines: { node: ">=20" } isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== } + engines: { node: ">=0.10.0" } istanbul-lib-coverage@2.0.5: - resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== } + engines: { node: ">=6" } istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== } + engines: { node: ">=8" } istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== } + engines: { node: ">=8" } istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== } + engines: { node: ">=8" } istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== } + engines: { node: ">=10" } istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== } + engines: { node: ">=8" } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== } + engines: { node: ">=10" } istanbul-lib-source-maps@3.0.6: - resolution: {integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== } + engines: { node: ">=6" } istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== } + engines: { node: ">=10" } istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== } + engines: { node: ">=10" } istanbul-reports@3.2.0: - resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== } + engines: { node: ">=8" } istanbul@0.4.5: - resolution: {integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==} + resolution: + { integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg== } deprecated: |- This module is no longer maintained, try this instead: npm i nyc @@ -6122,22 +7348,27 @@ packages: hasBin: true jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== } jasmine-core@3.9.0: - resolution: {integrity: sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ==} + resolution: + { integrity: sha512-Tv3kVbPCGVrjsnHBZ38NsPU3sDOtNa0XmbG2baiyJqdb5/SPpDO6GVwJYtUryl6KB4q1Ssckwg612ES9Z0dreQ== } jest-changed-files@30.4.1: - resolution: {integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-IuctmYrxi21iOSOaIXpJWalHyPAsVv0GeBHKDn8C1CA4W5htHn7INL+wdnL4Bo0+olEndvAFkmb++tIQJG+vvg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-circus@30.4.2: - resolution: {integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-rvHH7VlY6LgbJXJTQ87GW62g1FntOtbhh0zT+v04kC+pgL6aBKyYINXxWukCpj3dcIBMw5/XUbtDS9dU9JTXeQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-cli@30.4.2: - resolution: {integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-jfA2ocvVHMXS2QijrJ0d31ektP+d/W0T5RpcTX2Pq+3sVqHlsXVCM2+FmwpL+bdY8OfHpIg9xMxLF17Zg0U49Q== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -6146,14 +7377,15 @@ packages: optional: true jest-config@30.4.2: - resolution: {integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-rNHAShJQqQwFNoL0hbf3BphSBOWnpOUAKvidLS/AjNVLPfoj5mSf4jQMfW3cYOs6hXeZC7nF7mDHaBnbxELOzg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' + "@types/node": "*" + esbuild-register: ">=3.4.0" + ts-node: ">=9.0.0" peerDependenciesMeta: - '@types/node': + "@types/node": optional: true esbuild-register: optional: true @@ -6161,134 +7393,165 @@ packages: optional: true jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-diff@30.4.1: - resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-docblock@30.4.0: - resolution: {integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-ZPMabUZCx5MpbZ2eBYSvZ0J8fvo3dR9oM+eeUpb3aKNQFuS2tu3Duw1TNlMoP8k3WQgKGJuhcMFvwcVuq6T7oA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-each@30.4.1: - resolution: {integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-/8MJbH6fuj48TstjrMf+u/pd06Qezz5xOXvZA6442heNOWr8bdeoGZX2d9fCn028CoMgYmroH9//zky5GfyYmA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-environment-node@30.4.1: - resolution: {integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-4FZYVOk85hz2AyT6BbarKy9u37g6DbrDyCdFhsnDdXqyrueYQvB+0zO4f/kqLCRD0BsPRXPMNJeQwihKZV8naw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-haste-map@30.4.1: - resolution: {integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-rFrcONd8jeFsyw+Z9CrScJgglRf2+NFmNam8dKu7n+SoHqNYT47mn0DdEcVUZJpvh7Iz6/si7f7yUH7GJHVgnw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-junit@16.0.0: - resolution: {integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==} - engines: {node: '>=10.12.0'} + resolution: + { integrity: sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ== } + engines: { node: ">=10.12.0" } jest-leak-detector@30.4.1: - resolution: {integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-IpmyiioeHxiWDhesHnUFmOxcTzwCwKpgACgWajtAP+nYQXiY7DakTxB6Bx9JFiRMljr0AX1PvnQdaU1KFoz6NQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-matcher-utils@30.4.1: - resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-message-util@30.4.1: - resolution: {integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-mock@30.4.1: - resolution: {integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== } + engines: { node: ">=6" } peerDependencies: - jest-resolve: '*' + jest-resolve: "*" peerDependenciesMeta: jest-resolve: optional: true jest-process-manager@0.4.0: - resolution: {integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw==} + resolution: + { integrity: sha512-80Y6snDyb0p8GG83pDxGI/kQzwVTkCxc7ep5FPe/F6JYdvRDhwr6RzRmPSP7SEwuLhxo80lBS/NqOdUIbHIfhw== } deprecated: ⚠️ The 'jest-process-manager' package is deprecated. Please migrate to Playwright's built-in test runner (@playwright/test) which now includes full Jest-style features and parallel testing. See https://playwright.dev/docs/intro for details. jest-regex-util@30.4.0: - resolution: {integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-resolve-dependencies@30.4.2: - resolution: {integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-gDiVh1I+GxYzz9oXlyw+1wv6VOYX1WYxMOfjsA3iGKePV2oxmbHhwxfkALxNxYy1ciw6APWwkW2zZONwP97aEQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-resolve@30.4.1: - resolution: {integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-Zry8Yq/yJcNAZ7dJ5F2heic8AheXvbFZ7XI5V+h28nrYZ7Qoyy4dItq8OodjnYD270mvX+ZudmrNV9cysqhW5Q== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-runner@30.4.2: - resolution: {integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-2dw0PslVYXxffXGpLo+Ejad+KcI1Qkjn7f4X4619gf21oCUmL+SPfjqIa/losUem3yEOvfNZe/F1HWUcNpODcg== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-runtime@30.4.2: - resolution: {integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-3/5e8iPz2k/VLqlr8DgTftYyLUv8Su3FkCAO2/Od81UsUTpSxOrS6O5x5KkoQwyUjmpYyDJKeyAvg2T2nvpNkQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-serializer-html@7.1.0: - resolution: {integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA==} + resolution: + { integrity: sha512-xYL2qC7kmoYHJo8MYqJkzrl/Fdlx+fat4U1AqYg+kafqwcKPiMkOcjWHPKhueuNEgr+uemhGc+jqXYiwCyRyLA== } jest-snapshot@30.4.1: - resolution: {integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-tEOkkfOMppUyeiHwjZswOQ3lcnoTnws/q5FnGIaeIh/jmoU0ZlgMYRR8sTlTj+nNGCoJ0RDq6SfxGxCsyMTPmw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } jest-util@30.4.1: - resolution: {integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-validate@30.4.1: - resolution: {integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-PDWi4SOwLnwqNDfHZjOcsEFyZ4fc/2W2gVL3DEoyqnB6jCQMLRtfBong8s6omIw3lI0HWOus12xfnFmQtjW3fw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-watch-typeahead@3.0.1: - resolution: {integrity: sha512-SFmHcvdueTswZlVhPCWfLXMazvwZlA2UZTrcE7MC3NwEVeWvEcOx6HUe+igMbnmA6qowuBSW4in8iC6J2EYsgQ==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-SFmHcvdueTswZlVhPCWfLXMazvwZlA2UZTrcE7MC3NwEVeWvEcOx6HUe+igMbnmA6qowuBSW4in8iC6J2EYsgQ== } + engines: { node: ">=18.0.0" } peerDependencies: jest: ^30.0.0 jest-watcher@30.4.1: - resolution: {integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-/l9UonmvCwjHH7d2h3iAwIloLc1H0S8mJZ/LNK3i86hqwPAz8otUJjP9MfYtz9Tt77Su5FD2xGjZn8d31IZHlw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== } + engines: { node: ">= 10.13.0" } jest-worker@30.4.1: - resolution: {integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-SHynN/q/QD++iNyvMdy+WMmbCGk8jIsNcRxycXbWubSOhvo6T+j2afcfUSl+3hYsiBebOTo0cT7c2H7CXugu1g== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest@30.4.2: - resolution: {integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-Yi1jqNC/Oq0N4hBgNH/YvBpP1P57QqundgytzYqy3yqAa7NZPNjSoi4SGbRAXDMdBzNE6xBCi5U7RgfrvMEUVQ== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -6297,718 +7560,896 @@ packages: optional: true jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + resolution: + { integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== } hasBin: true joi@17.13.4: - resolution: {integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==} + resolution: + { integrity: sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ== } jose@2.0.7: - resolution: {integrity: sha512-5hFWIigKqC+e/lRyQhfnirrAqUdIPMB7SJRqflJaO29dW7q5DFvH1XCSTmv6PQ6pb++0k6MJlLRoS0Wv4s38Wg==} - engines: {node: '>=10.13.0 < 13 || >=13.7.0'} + resolution: + { integrity: sha512-5hFWIigKqC+e/lRyQhfnirrAqUdIPMB7SJRqflJaO29dW7q5DFvH1XCSTmv6PQ6pb++0k6MJlLRoS0Wv4s38Wg== } + engines: { node: ">=10.13.0 < 13 || >=13.7.0" } jose@6.2.3: - resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + resolution: + { integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw== } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } js-yaml@3.15.0: - resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==} + resolution: + { integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog== } hasBin: true js-yaml@4.3.0: - resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + resolution: + { integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q== } hasBin: true jsdoc-type-pratt-parser@6.6.0: - resolution: {integrity: sha512-3hSD14nXx66Rspx1RMnz1Pj4JacrMBAsC0CrF9lZYO/Qsp5/oIr6KqujVUNhQu94B6mMip2ukki8MpEWZwyhKA==} - engines: {node: '>=20.0.0'} + resolution: + { integrity: sha512-3hSD14nXx66Rspx1RMnz1Pj4JacrMBAsC0CrF9lZYO/Qsp5/oIr6KqujVUNhQu94B6mMip2ukki8MpEWZwyhKA== } + engines: { node: ">=20.0.0" } jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== } + engines: { node: ">=6" } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } json-parse-even-better-errors@5.0.0: - resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ== } + engines: { node: ^20.17.0 || >=22.9.0 } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + resolution: + { integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA== } json-sizeof@1.5.0: - resolution: {integrity: sha512-Uy5izXj/FC6pPxgWszvb7HZVVE6KRU8Tt4ZEQvq4aYjkpsSrAGjYTupZWCVZAaQtEcrkQnsgcnV2OvCdOvVVlw==} + resolution: + { integrity: sha512-Uy5izXj/FC6pPxgWszvb7HZVVE6KRU8Tt4ZEQvq4aYjkpsSrAGjYTupZWCVZAaQtEcrkQnsgcnV2OvCdOvVVlw== } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } json0-ot-diff@1.1.2: - resolution: {integrity: sha512-je6cDbmPc+BkbfyvKo7y1jgQLTrX81L8fkKEIPXRUGFSxK4HTSF6u44ELR35i12tEIWh5+8KfIJH2aJgzKrFww==} + resolution: + { integrity: sha512-je6cDbmPc+BkbfyvKo7y1jgQLTrX81L8fkKEIPXRUGFSxK4HTSF6u44ELR35i12tEIWh5+8KfIJH2aJgzKrFww== } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } hasBin: true json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } + engines: { node: ">=6" } hasBin: true jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + resolution: + { integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== } jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + resolution: + { integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== } jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + resolution: + { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== } + engines: { "0": node >= 0.2.0 } jsonwebtoken@9.0.3: - resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} - engines: {node: '>=12', npm: '>=6'} + resolution: + { integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g== } + engines: { node: ">=12", npm: ">=6" } jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + resolution: + { integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== } jwa@2.0.1: - resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + resolution: + { integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== } jwks-rsa@2.1.5: - resolution: {integrity: sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==} - engines: {node: '>=10 < 13 || >=14'} + resolution: + { integrity: sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA== } + engines: { node: ">=10 < 13 || >=14" } jws@4.0.1: - resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + resolution: + { integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA== } jwt-decode@3.1.2: - resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} + resolution: + { integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== } karma-chrome-launcher@3.1.1: - resolution: {integrity: sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==} + resolution: + { integrity: sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== } karma-coverage-istanbul-reporter@3.0.3: - resolution: {integrity: sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==} + resolution: + { integrity: sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== } karma-firefox-launcher@2.1.3: - resolution: {integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==} + resolution: + { integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw== } karma-jasmine-html-reporter@1.7.0: - resolution: {integrity: sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==} + resolution: + { integrity: sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== } peerDependencies: - jasmine-core: '>=3.8' - karma: '>=0.9' - karma-jasmine: '>=1.1' + jasmine-core: ">=3.8" + karma: ">=0.9" + karma-jasmine: ">=1.1" karma-jasmine@4.0.2: - resolution: {integrity: sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-ggi84RMNQffSDmWSyyt4zxzh2CQGwsxvYYsprgyR1j8ikzIduEdOlcLvXjZGwXG/0j41KUXOWsUCBfbEHPWP9g== } + engines: { node: ">= 10" } peerDependencies: - karma: '*' + karma: "*" karma-junit-reporter@2.0.1: - resolution: {integrity: sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw== } + engines: { node: ">= 8" } peerDependencies: - karma: '>=0.9' + karma: ">=0.9" karma-mocha-reporter@2.2.5: - resolution: {integrity: sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==} + resolution: + { integrity: sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w== } peerDependencies: - karma: '>=0.13' + karma: ">=0.13" karma-parallel@0.3.1: - resolution: {integrity: sha512-64jxNYamYi/9Y67h4+FfViSYhwDgod3rLuq+ZdZ0c3XeZFp/3q3v3HVkd8b5Czp3hCB+LLF8DIv4zlR4xFqbRw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-64jxNYamYi/9Y67h4+FfViSYhwDgod3rLuq+ZdZ0c3XeZFp/3q3v3HVkd8b5Czp3hCB+LLF8DIv4zlR4xFqbRw== } + engines: { node: ">=6" } peerDependencies: - karma: '>= 1.0.0' + karma: ">= 1.0.0" karma-safari-launcher@1.0.0: - resolution: {integrity: sha512-qmypLWd6F2qrDJfAETvXDfxHvKDk+nyIjpH9xIeI3/hENr0U3nuqkxaftq73PfXZ4aOuOChA6SnLW4m4AxfRjQ==} + resolution: + { integrity: sha512-qmypLWd6F2qrDJfAETvXDfxHvKDk+nyIjpH9xIeI3/hENr0U3nuqkxaftq73PfXZ4aOuOChA6SnLW4m4AxfRjQ== } peerDependencies: - karma: '>=0.9' + karma: ">=0.9" karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + resolution: + { integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== } karma-teamcity-reporter@1.1.0: - resolution: {integrity: sha512-Ca1uhHGtNqUuzsnW3I+QykNuS/jF9vdxnIrkbLCVJRunCc6yWJq+ai1UobQT13j0e3JVUOf0mKo3QHZ6A6mG9Q==} + resolution: + { integrity: sha512-Ca1uhHGtNqUuzsnW3I+QykNuS/jF9vdxnIrkbLCVJRunCc6yWJq+ai1UobQT13j0e3JVUOf0mKo3QHZ6A6mG9Q== } peerDependencies: - karma: '>=0.9' + karma: ">=0.9" karma@6.4.4: - resolution: {integrity: sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w== } + engines: { node: ">= 10" } hasBin: true keycharm@0.4.0: - resolution: {integrity: sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ==} + resolution: + { integrity: sha512-TyQTtsabOVv3MeOpR92sIKk/br9wxS+zGj4BG7CR8YbK4jM3tyIBaF0zhzeBUMx36/Q/iQLOKKOT+3jOQtemRQ== } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== } + engines: { node: ">=0.10.0" } kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } + engines: { node: ">=6" } launch-editor@2.14.1: - resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} + resolution: + { integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== } less-loader@12.3.0: - resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw== } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x less: ^3.5.0 || ^4.0.0 webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true less@4.4.0: - resolution: {integrity: sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-kdTwsyRuncDfjEs0DlRILWNvxhDG/Zij4YLO4TMJgDLW+8OzpfkdPnRgrsRuY1o+oaxJGWsps5f/RVBgGmmN0w== } + engines: { node: ">=14" } hasBin: true leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== } + engines: { node: ">=6" } levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== } + engines: { node: ">= 0.8.0" } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: ">= 0.8.0" } license-webpack-plugin@4.0.2: - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} + resolution: + { integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw== } peerDependencies: - webpack: '*' + webpack: "*" peerDependenciesMeta: webpack: optional: true lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + resolution: + { integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== } lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== } + engines: { node: ">=14" } limiter@1.1.5: - resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + resolution: + { integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } lint-staged@15.5.2: - resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} - engines: {node: '>=18.12.0'} + resolution: + { integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w== } + engines: { node: ">=18.12.0" } hasBin: true listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== } + engines: { node: ">=18.0.0" } listr2@9.0.1: - resolution: {integrity: sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==} - engines: {node: '>=20.0.0'} + resolution: + { integrity: sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g== } + engines: { node: ">=20.0.0" } lmdb@3.4.2: - resolution: {integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==} + resolution: + { integrity: sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg== } hasBin: true loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} + resolution: + { integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w== } + engines: { node: ">=6.11.5" } loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + resolution: + { integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== } + engines: { node: ">=8.9.0" } loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} + resolution: + { integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== } + engines: { node: ">= 12.13.0" } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } + engines: { node: ">=8" } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: ">=10" } lodash-es@4.18.1: - resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + resolution: + { integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== } lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + resolution: + { integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== } lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + resolution: + { integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== } lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + resolution: + { integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== } lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + resolution: + { integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== } lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + resolution: + { integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== } lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + resolution: + { integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== } deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + resolution: + { integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== } lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + resolution: + { integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== } lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== } lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + resolution: + { integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== } lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + resolution: + { integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + resolution: + { integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== } lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + resolution: + { integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== } log-symbols@2.2.0: - resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== } + engines: { node: ">=4" } log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } + engines: { node: ">=10" } log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== } + engines: { node: ">=18" } log-symbols@7.0.1: - resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg== } + engines: { node: ">=18" } log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== } + engines: { node: ">=18" } log4js@6.9.1: - resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g== } + engines: { node: ">=8.0" } loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} + resolution: + { integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== } loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} + resolution: + { integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg== } + engines: { node: ">= 0.6.0" } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } hasBin: true loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + resolution: + { integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== } lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + resolution: + { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== } lru-cache@11.5.1: - resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A== } + engines: { node: 20 || >=22 } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: ">=10" } lru-memoizer@2.3.0: - resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + resolution: + { integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug== } lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + resolution: + { integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== } lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + resolution: + { integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== } hasBin: true macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A== } + engines: { node: ">=6" } magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== } magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + resolution: + { integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== } make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== } + engines: { node: ">=6" } make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== } + engines: { node: ">=8" } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== } + engines: { node: ">=10" } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } make-fetch-happen@15.0.6: - resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw== } + engines: { node: ^20.17.0 || >=22.9.0 } makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + resolution: + { integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== } map-stream@0.0.7: - resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} + resolution: + { integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ== } marked@7.0.3: - resolution: {integrity: sha512-ev2uM40p0zQ/GbvqotfKcSWEa59fJwluGZj5dcaUOwDRrB1F3dncdXy8NWUApk4fi8atU3kTBOwjyjZ0ud0dxw==} - engines: {node: '>= 16'} + resolution: + { integrity: sha512-ev2uM40p0zQ/GbvqotfKcSWEa59fJwluGZj5dcaUOwDRrB1F3dncdXy8NWUApk4fi8atU3kTBOwjyjZ0ud0dxw== } + engines: { node: ">= 16" } hasBin: true matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA== } + engines: { node: ">=6" } math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== } + engines: { node: ">= 0.4" } media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== } + engines: { node: ">= 0.6" } media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== } + engines: { node: ">= 0.8" } memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== } + engines: { node: ">= 4.0.0" } memfs@4.56.10: - resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} + resolution: + { integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w== } peerDependencies: - tslib: '2' + tslib: "2" memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + resolution: + { integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== } merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + resolution: + { integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== } merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== } + engines: { node: ">=18" } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: ">= 8" } methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== } + engines: { node: ">= 0.6" } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== } + engines: { node: ">=8.6" } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: ">= 0.6" } mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== } + engines: { node: ">= 0.6" } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: ">= 0.6" } mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== } + engines: { node: ">=18" } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== } + engines: { node: ">=4" } hasBin: true mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} + resolution: + { integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== } + engines: { node: ">=4.0.0" } hasBin: true mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: ">=6" } mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } + engines: { node: ">=12" } mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== } + engines: { node: ">=18" } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } + engines: { node: ">=4" } mingo@4.4.1: - resolution: {integrity: sha512-aig/3anjeJ8VcXLqDQmB/iO8Z8BVzln2BeWcyeI5NtOiLMAQ5xX00QHX9piy8OBAC9pSDYWErY8MHoh8nlCHig==} + resolution: + { integrity: sha512-aig/3anjeJ8VcXLqDQmB/iO8Z8BVzln2BeWcyeI5NtOiLMAQ5xX00QHX9piy8OBAC9pSDYWErY8MHoh8nlCHig== } mini-css-extract-plugin@2.9.4: - resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} - engines: {node: '>= 12.13.0'} + resolution: + { integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ== } + engines: { node: ">= 12.13.0" } peerDependencies: webpack: 5.105.0 minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== } minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} - engines: {node: 18 || 20 || >=22} + resolution: + { integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg== } + engines: { node: 18 || 20 || >=22 } minimatch@3.1.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + resolution: + { integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== } minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== } + engines: { node: ">=16 || 14 >=14.17" } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== } + engines: { node: ">=16 || 14 >=14.17" } minipass-fetch@5.0.2: - resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ== } + engines: { node: ^20.17.0 || >=22.9.0 } minipass-flush@1.0.7: - resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA== } + engines: { node: ">= 8" } minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== } + engines: { node: ">=8" } minipass-sized@2.0.0: - resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA== } + engines: { node: ">=8" } minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } + engines: { node: ">=8" } minipass@7.1.3: - resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== } + engines: { node: ">=16 || 14 >=14.17" } minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== } + engines: { node: ">= 18" } mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + resolution: + { integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== } hasBin: true mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: ">=10" } hasBin: true - mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + resolution: + { integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== } mongodb@4.17.2: - resolution: {integrity: sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg==} - engines: {node: '>=12.9.0'} + resolution: + { integrity: sha512-mLV7SEiov2LHleRJPMPrK2PMyhXFZt2UQLC4VD4pnth3jMjYKHhtqfwwkkvS/NXuo/Fp3vbhaNcXrIDaLRb9Tg== } + engines: { node: ">=12.9.0" } morgan@1.11.0: - resolution: {integrity: sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-zSkVu3t18r39pw4ixfBKvfZi3y2UOqr7d4WYwcj3m8nXpEQK4rPO6GLzs/CExoRgmX3y9EjmmcXqv6jq0SK46g== } + engines: { node: ">= 0.8.0" } mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== } + engines: { node: ">=10" } ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } msgpackr-extract@3.0.4: - resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} + resolution: + { integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw== } hasBin: true msgpackr@1.12.1: - resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} + resolution: + { integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ== } multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + resolution: + { integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== } hasBin: true mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== } + engines: { node: ^18.17.0 || >=20.5.0 } nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true napi-postinstall@0.3.4: - resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ== } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} + resolution: + { integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== } + engines: { node: ">= 4.4.x" } hasBin: true negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== } + engines: { node: ">= 0.6" } negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== } + engines: { node: ">= 0.6" } negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== } + engines: { node: ">= 0.6" } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== } neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA== } + engines: { node: ">= 10" } ng-circle-progress@1.7.1: - resolution: {integrity: sha512-XAsd/FRWC4lqO7pUakwniO1c+ew3zr+Un/pZ58aqdE1aq3iS7kquxDmzOOCZ2XoUhU/6vC31e/DSYHvlHhITkA==} + resolution: + { integrity: sha512-XAsd/FRWC4lqO7pUakwniO1c+ew3zr+Un/pZ58aqdE1aq3iS7kquxDmzOOCZ2XoUhU/6vC31e/DSYHvlHhITkA== } peerDependencies: - '@angular/common': '>=14.0.0' - '@angular/core': '>=14.0.0' - rxjs: '>=6.4.0' + "@angular/common": ">=14.0.0" + "@angular/core": ">=14.0.0" + rxjs: ">=6.4.0" ngx-cookie-service@20.1.1: - resolution: {integrity: sha512-jGjjIqu+Kt8De6YjDqTQOaUHKB7gYs0eaDuLyXfNhfKnA78lA7D7oWcaIzjkmXhRqTnh2/ex1UHmZHN9MX0yoQ==} + resolution: + { integrity: sha512-jGjjIqu+Kt8De6YjDqTQOaUHKB7gYs0eaDuLyXfNhfKnA78lA7D7oWcaIzjkmXhRqTnh2/ex1UHmZHN9MX0yoQ== } peerDependencies: - '@angular/common': ^20.0.0 - '@angular/core': ^20.0.0 + "@angular/common": ^20.0.0 + "@angular/core": ^20.0.0 ngx-quill@28.0.2: - resolution: {integrity: sha512-NL7YzZNoT8G5qWZKXHCIMQff2uVoi8cK3VwFM8RCpFXkc8nMp2moIDMJrF5k9e/xTkQkAQtGgfvbCxRc7su7EA==} - engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0} + resolution: + { integrity: sha512-NL7YzZNoT8G5qWZKXHCIMQff2uVoi8cK3VwFM8RCpFXkc8nMp2moIDMJrF5k9e/xTkQkAQtGgfvbCxRc7su7EA== } + engines: { node: ^18.19.1 || ^20.11.1 || >=22.0.0 } peerDependencies: - '@angular/core': ^20.0.0 + "@angular/core": ^20.0.0 quill: ^2.0.0 rxjs: ^7.0.0 ngx-transloco-markup-router-link@4.0.0: - resolution: {integrity: sha512-a/w5j9nM+7NKT9peUClQUVrYVR5ckxiGRHFO0hVF1JfcEj4RjUwozK5KYvRiPpdzqJlrdXMs9S7hBpaVhwimCQ==} + resolution: + { integrity: sha512-a/w5j9nM+7NKT9peUClQUVrYVR5ckxiGRHFO0hVF1JfcEj4RjUwozK5KYvRiPpdzqJlrdXMs9S7hBpaVhwimCQ== } peerDependencies: - '@angular/common': '>=14.0.0' - '@angular/core': '>=14.0.0' - '@angular/router': '>=14.0.0' + "@angular/common": ">=14.0.0" + "@angular/core": ">=14.0.0" + "@angular/router": ">=14.0.0" ngx-transloco-markup: ^4.0.0 ngx-transloco-markup@4.0.0: - resolution: {integrity: sha512-swcedVIBk1wO25BKrjwK90e11f6tpnUCb0aF7+DY7KmgNYwxLUyLggBM8HYr1tzIBtbfeDgCI7j66Ay3Xk6bOw==} + resolution: + { integrity: sha512-swcedVIBk1wO25BKrjwK90e11f6tpnUCb0aF7+DY7KmgNYwxLUyLggBM8HYr1tzIBtbfeDgCI7j66Ay3Xk6bOw== } peerDependencies: - '@angular/common': '>=14.0.0' - '@angular/core': '>=14.0.0' - '@ngneat/transloco': ^4 + "@angular/common": ">=14.0.0" + "@angular/core": ">=14.0.0" + "@ngneat/transloco": ^4 rxjs: ^6 || ^7 no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + resolution: + { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + resolution: + { integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== } node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + resolution: + { integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== } node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + resolution: + { integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== } node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw== } + engines: { node: ">= 0.4" } node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} + resolution: + { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -7016,98 +8457,118 @@ packages: optional: true node-forge@1.4.0: - resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} - engines: {node: '>= 6.13.0'} + resolution: + { integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ== } + engines: { node: ">= 6.13.0" } node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + resolution: + { integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== } hasBin: true node-gyp@12.4.0: - resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + resolution: + { integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== } node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== } + engines: { node: ">=8" } node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og== } + engines: { node: ">=18" } nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + resolution: + { integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== } hasBin: true nopt@9.0.0: - resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: ">=0.10.0" } normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } + engines: { node: ">=0.10.0" } npm-bundled@5.0.0: - resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-install-checks@8.0.0: - resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-normalize-package-bin@5.0.0: - resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-package-arg@13.0.0: - resolution: {integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-packlist@10.0.4: - resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-pick-manifest@11.0.3: - resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-registry-fetch@19.1.1: - resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } + engines: { node: ">=8" } npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } npm@11.17.0: - resolution: {integrity: sha512-PurxiZexEHDTE4SSaLI3ZrnbAGiZfeyUcQcxcP5D+hfytNAze/D1IzDuInTn9XVLIbAQUnQuSPXJx02LHjLvQw==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-PurxiZexEHDTE4SSaLI3ZrnbAGiZfeyUcQcxcP5D+hfytNAze/D1IzDuInTn9XVLIbAQUnQuSPXJx02LHjLvQw== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true bundledDependencies: - - '@isaacs/string-locale-compare' - - '@npmcli/arborist' - - '@npmcli/config' - - '@npmcli/fs' - - '@npmcli/map-workspaces' - - '@npmcli/metavuln-calculator' - - '@npmcli/package-json' - - '@npmcli/promise-spawn' - - '@npmcli/redact' - - '@npmcli/run-script' - - '@sigstore/tuf' + - "@isaacs/string-locale-compare" + - "@npmcli/arborist" + - "@npmcli/config" + - "@npmcli/fs" + - "@npmcli/map-workspaces" + - "@npmcli/metavuln-calculator" + - "@npmcli/package-json" + - "@npmcli/promise-spawn" + - "@npmcli/redact" + - "@npmcli/run-script" + - "@sigstore/tuf" - abbrev - archy - cacache @@ -7164,802 +8625,1007 @@ packages: - which nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== } nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} + resolution: + { integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== } + engines: { node: ">=8.9" } hasBin: true oauth4webapi@3.8.6: - resolution: {integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ==} + resolution: + { integrity: sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ== } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } + engines: { node: ">=0.10.0" } object-deep-merge@1.0.5: - resolution: {integrity: sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg==} + resolution: + { integrity: sha512-3DioFgOzetbxbeUq8pB2NunXo8V0n4EvqsWM/cJoI6IA9zghd7cl/2pBOuWRf4dlvA+fcg5ugFMZaN2/RuoaGg== } object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== } + engines: { node: ">= 0.4" } object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== } + engines: { node: ">= 0.4" } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } + engines: { node: ">= 0.4" } object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== } + engines: { node: ">= 0.4" } object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== } + engines: { node: ">= 0.4" } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== } + engines: { node: ">= 0.4" } object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== } + engines: { node: ">= 0.4" } object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== } + engines: { node: ">= 0.4" } obliterator@2.0.5: - resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + resolution: + { integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== } obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + resolution: + { integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== } on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== } + engines: { node: ">= 0.8" } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== } + engines: { node: ">= 0.8" } on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: ">=6" } onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } + engines: { node: ">=12" } onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== } + engines: { node: ">=18" } open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== } + engines: { node: ">=18" } open@8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== } + engines: { node: ">=12" } opencollective-postinstall@2.0.3: - resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} + resolution: + { integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== } hasBin: true opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + resolution: + { integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== } hasBin: true openid-client@6.8.4: - resolution: {integrity: sha512-QSw0BA08piujetEwfZsHoTrDpMEha7GDZDicQqVwX4u0ChCjefvjDB++TZ8BTg76UpwhzIQgdvvfgfl3HpCSAw==} + resolution: + { integrity: sha512-QSw0BA08piujetEwfZsHoTrDpMEha7GDZDicQqVwX4u0ChCjefvjDB++TZ8BTg76UpwhzIQgdvvfgfl3HpCSAw== } optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== } + engines: { node: ">= 0.8.0" } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } + engines: { node: ">= 0.8.0" } ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } + engines: { node: ">=10" } ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw== } + engines: { node: ">=18" } ora@9.0.0: - resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A== } + engines: { node: ">=20" } ordered-binary@1.6.1: - resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} + resolution: + { integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w== } os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== } + engines: { node: ">=0.10.0" } os-name@4.0.1: - resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw== } + engines: { node: ">=10" } ot-json0@1.1.0: - resolution: {integrity: sha512-wf5fci7GGpMYRDnbbdIFQymvhsbFACMHtxjivQo5KgvAHlxekyfJ9aPsRr6YfFQthQkk4bmsl5yESrZwC/oMYQ==} + resolution: + { integrity: sha512-wf5fci7GGpMYRDnbbdIFQymvhsbFACMHtxjivQo5KgvAHlxekyfJ9aPsRr6YfFQthQkk4bmsl5yESrZwC/oMYQ== } own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== } + engines: { node: ">= 0.4" } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } + engines: { node: ">=6" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: ">=10" } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } + engines: { node: ">=8" } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: ">=10" } p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== } + engines: { node: ">=8" } p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ== } + engines: { node: ">=18" } p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} + resolution: + { integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== } + engines: { node: ">=16.17" } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } + engines: { node: ">=6" } package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== } + engines: { node: ">=8" } package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + resolution: + { integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== } pacote@21.0.4: - resolution: {integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + resolution: + { integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== } papaparse@5.5.3: - resolution: {integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==} + resolution: + { integrity: sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A== } param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + resolution: + { integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== } parchment@3.0.0: - resolution: {integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==} + resolution: + { integrity: sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A== } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: ">=6" } parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + resolution: + { integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ== } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } + engines: { node: ">=8" } parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== } + engines: { node: ">= 0.10" } parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== } + engines: { node: ">=0.10.0" } parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + resolution: + { integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA== } parse5-html-rewriting-stream@8.0.0: - resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} + resolution: + { integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw== } parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + resolution: + { integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== } parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + resolution: + { integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== } parse5-sax-parser@8.0.0: - resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} + resolution: + { integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw== } parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + resolution: + { integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw== } parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + resolution: + { integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw== } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== } + engines: { node: ">= 0.8" } pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + resolution: + { integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== } path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + resolution: + { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: ">=8" } path-expression-matcher@1.5.0: - resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ== } + engines: { node: ">=14.0.0" } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } + engines: { node: ">=0.10.0" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: ">=8" } path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } + engines: { node: ">=12" } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== } + engines: { node: ">=16 || 14 >=14.18" } path-scurry@2.0.2: - resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} - engines: {node: 18 || 20 || >=22} + resolution: + { integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== } + engines: { node: 18 || 20 || >=22 } path-to-regexp@0.1.13: - resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + resolution: + { integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== } path-to-regexp@8.4.2: - resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + resolution: + { integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA== } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: ">=8" } pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + resolution: + { integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== } + engines: { node: ">= 14.16" } pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + resolution: + { integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== } peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + resolution: + { integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA== } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== } + engines: { node: ">=8.6" } picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== } + engines: { node: ">=12" } picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== } + engines: { node: ">=12" } pidtree@0.6.1: - resolution: {integrity: sha512-e0F9AOF1JMrCfBsyJOwU9lNvQ0WtXTq0j/4jk0BQ5JSI9VAybPXmDpPRw/2FQ3e5d3ZFN1mLh7jW99m/jjaptw==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-e0F9AOF1JMrCfBsyJOwU9lNvQ0WtXTq0j/4jk0BQ5JSI9VAybPXmDpPRw/2FQ3e5d3ZFN1mLh7jW99m/jjaptw== } + engines: { node: ">=0.10" } hasBin: true pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== } + engines: { node: ">=6" } pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== } + engines: { node: ">= 6" } piscina@5.1.3: - resolution: {integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==} - engines: {node: '>=20.x'} + resolution: + { integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g== } + engines: { node: ">=20.x" } pixelmatch@7.2.0: - resolution: {integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg==} + resolution: + { integrity: sha512-xhcb4yHu9sM/G7foGzoLtXYcC0zHEaOXXjRKhGup0fw78Nf2Tkiapv4EQyMzrbcmQPsllAI7DbFY2UT7PlI9Pg== } hasBin: true pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} + resolution: + { integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ== } + engines: { node: ">=16.20.0" } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } + engines: { node: ">=8" } playwright-core@1.60.0: - resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA== } + engines: { node: ">=18" } hasBin: true playwright@1.60.0: - resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA== } + engines: { node: ">=18" } hasBin: true pngjs@7.0.0: - resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} - engines: {node: '>=14.19.0'} + resolution: + { integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== } + engines: { node: ">=14.19.0" } polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + resolution: + { integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw== } possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== } + engines: { node: ">= 0.4" } postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ== } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x postcss: ^7.0.0 || ^8.0.1 webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true postcss-media-query-parser@0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + resolution: + { integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== } postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== } + engines: { node: ">=4" } postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== } postcss@8.5.12: - resolution: {integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA== } + engines: { node: ^10 || ^12 || >=14 } postcss@8.5.20: - resolution: {integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug== } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== } + engines: { node: ">= 0.8.0" } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: ">= 0.8.0" } prettier-linter-helpers@1.0.1: - resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== } + engines: { node: ">=6.0.0" } prettier@3.8.4: - resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q== } + engines: { node: ">=14" } hasBin: true pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + resolution: + { integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== } pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + resolution: + { integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== } + engines: { node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0 } pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== } + engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } pretty-format@30.4.1: - resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + resolution: + { integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== } + engines: { node: ">=6" } proc-log@5.0.0: - resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== } + engines: { node: ^18.17.0 || >=20.5.0 } proc-log@6.1.0: - resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ== } + engines: { node: ^20.17.0 || >=22.9.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== } process-on-spawn@1.1.0: - resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== } + engines: { node: ">=8" } process-streams@1.0.3: - resolution: {integrity: sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA==} + resolution: + { integrity: sha512-xkIaM5vYnyekB88WyET78YEqXiaJRy0xcvIdE22n+myhvBT7LlLmX6iAtq7jDvVH8CUx2rqQsd32JdRyJMV3NA== } process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} + resolution: + { integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== } + engines: { node: ">= 0.6.0" } promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== } + engines: { node: ">=10" } prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } + engines: { node: ">= 6" } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== } + engines: { node: ">= 0.10" } proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== } + engines: { node: ">=10" } proxy-middleware@0.15.0: - resolution: {integrity: sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q== } + engines: { node: ">=0.8.0" } prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + resolution: + { integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== } psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + resolution: + { integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== } pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + resolution: + { integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== } punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + resolution: + { integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: ">=6" } pure-rand@7.0.1: - resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + resolution: + { integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ== } qjobs@1.2.0: - resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} - engines: {node: '>=0.9'} + resolution: + { integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== } + engines: { node: ">=0.9" } qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} - engines: {node: '>=0.6'} + resolution: + { integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw== } + engines: { node: ">=0.6" } querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolution: + { integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } quill-cursors@4.3.0: - resolution: {integrity: sha512-fHG6Ryon9KwD05L3gO14d8gqdapdVr2G/Rszl4g7T0X7ZQfG1j+/wAPx8JjhzZz+uWAekA9U0RjstfIt9M35IA==} + resolution: + { integrity: sha512-fHG6Ryon9KwD05L3gO14d8gqdapdVr2G/Rszl4g7T0X7ZQfG1j+/wAPx8JjhzZz+uWAekA9U0RjstfIt9M35IA== } quill-delta@4.2.2: - resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==} + resolution: + { integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg== } quill-delta@5.1.0: - resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA== } + engines: { node: ">= 12.0.0" } quill@2.0.3: - resolution: {integrity: sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==} - engines: {npm: '>=8.2.3'} + resolution: + { integrity: sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw== } + engines: { npm: ">=8.2.3" } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== } + engines: { node: ">= 0.6" } range-parser@1.3.0: - resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== } + engines: { node: ">= 0.6" } raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== } + engines: { node: ">= 0.8" } raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== } + engines: { node: ">= 0.10" } react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== } peerDependencies: react: ^18.3.1 react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + resolution: + { integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== } react-is@19.2.8: - resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + resolution: + { integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ== } react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== } + engines: { node: ">=0.10.0" } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== } + engines: { node: ">= 6" } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } + engines: { node: ">=8.10.0" } readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + resolution: + { integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== } + engines: { node: ">= 14.18.0" } readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} + resolution: + { integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ== } + engines: { node: ">= 20.19.0" } realtime-server@file:../../RealtimeServer: - resolution: {directory: ../../RealtimeServer, type: directory} + resolution: { directory: ../../RealtimeServer, type: directory } recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA== } + engines: { node: ">= 4" } reconnecting-websocket@4.4.0: - resolution: {integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==} + resolution: + { integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== } + engines: { node: ">=8" } reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + resolution: + { integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== } reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== } + engines: { node: ">= 0.4" } regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== } + engines: { node: ">=4" } regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + resolution: + { integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== } regex-parser@2.3.1: - resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + resolution: + { integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ== } regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== } + engines: { node: ">= 0.4" } regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== } + engines: { node: ">=4" } regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + resolution: + { integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== } regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + resolution: + { integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== } hasBin: true relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== } + engines: { node: ">= 0.10" } release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== } + engines: { node: ">=4" } renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + resolution: + { integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== } replace-in-file@6.3.5: - resolution: {integrity: sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg== } + engines: { node: ">=10" } hasBin: true require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: ">=0.10.0" } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } + engines: { node: ">=0.10.0" } require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolution: + { integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== } resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } + engines: { node: ">=8" } resolve-dir@0.1.1: - resolution: {integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== } + engines: { node: ">=0.10.0" } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: ">=4" } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } + engines: { node: ">=8" } resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== } + engines: { node: ">=12" } resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolution: + { integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== } resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== } + engines: { node: ">= 0.4" } hasBin: true resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== } + engines: { node: ">= 0.4" } hasBin: true resolve@2.0.0-next.7: - resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== } + engines: { node: ">= 0.4" } hasBin: true restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } + engines: { node: ">=8" } restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== } + engines: { node: ">=18" } retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== } + engines: { node: ">= 4" } retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== } + engines: { node: ">= 4" } reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + resolution: + { integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== } rich-text@4.1.0: - resolution: {integrity: sha512-zQg80us6AfopS7s2YPsU+jfLX1RJaOdd6w26Jz4Al1G73AMzqDLTIZSnr0I7HTdCIU1gcGSMDlhq2v4IfoKfbg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-zQg80us6AfopS7s2YPsU+jfLX1RJaOdd6w26Jz4Al1G73AMzqDLTIZSnr0I7HTdCIU1gcGSMDlhq2v4IfoKfbg== } + engines: { node: ">=0.10" } rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + resolution: + { integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg== } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== } + engines: { node: ">= 18" } run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== } + engines: { node: ">=18" } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + resolution: + { integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== } safe-array-concat@1.1.4: - resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} - engines: {node: '>=0.4'} + resolution: + { integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg== } + engines: { node: ">=0.4" } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== } + engines: { node: ">= 0.4" } safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== } + engines: { node: ">= 0.4" } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } sass-loader@16.0.5: - resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw== } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 - sass-embedded: '*' + sass-embedded: "*" webpack: 5.105.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true node-sass: optional: true @@ -7971,309 +9637,391 @@ packages: optional: true sass@1.90.0: - resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q== } + engines: { node: ">=14.0.0" } hasBin: true sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + resolution: + { integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ== } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== } schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} + resolution: + { integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== } + engines: { node: ">= 8.9.0" } schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== } + engines: { node: ">= 10.13.0" } schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== } + engines: { node: ">= 10.13.0" } select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + resolution: + { integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== } selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== } + engines: { node: ">=10" } semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } hasBin: true semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== } + engines: { node: ">=10" } hasBin: true semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== } + engines: { node: ">=10" } hasBin: true semver@7.8.4: - resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA== } + engines: { node: ">=10" } hasBin: true send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== } + engines: { node: ">= 0.8.0" } send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== } + engines: { node: ">= 18" } serialize-javascript@7.0.5: - resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} - engines: {node: '>=20.0.0'} + resolution: + { integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw== } + engines: { node: ">=20.0.0" } serve-index@1.9.2: - resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ== } + engines: { node: ">= 0.8.0" } serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== } + engines: { node: ">= 0.8.0" } serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== } + engines: { node: ">= 18" } set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== } set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + resolution: + { integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== } + engines: { node: ">= 0.4" } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } + engines: { node: ">= 0.4" } set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== } + engines: { node: ">= 0.4" } setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + resolution: + { integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== } shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== } + engines: { node: ">=8" } sharedb-access@5.0.0: - resolution: {integrity: sha512-qXMZp/gA8ANLeWA4ChSwIv7DSJt9JLXX8lQWEFXFINT0/D+anX1s6U7+BR1DU1DWg5wy3mtgfFLGLIcZhNzsVw==} + resolution: + { integrity: sha512-qXMZp/gA8ANLeWA4ChSwIv7DSJt9JLXX8lQWEFXFINT0/D+anX1s6U7+BR1DU1DWg5wy3mtgfFLGLIcZhNzsVw== } sharedb-milestone-mongo@2.1.0: - resolution: {integrity: sha512-M/iY0PDPSljL3ehKihpC1p6ezgf/RJtxwDmedZkTHfpm8sxl8URbJ7DiEd9ekuAAhlS1U8HnMpBHraLNMuuT2g==} + resolution: + { integrity: sha512-M/iY0PDPSljL3ehKihpC1p6ezgf/RJtxwDmedZkTHfpm8sxl8URbJ7DiEd9ekuAAhlS1U8HnMpBHraLNMuuT2g== } sharedb-mongo@5.1.0: - resolution: {integrity: sha512-ppxHizFRg5ZbTWOXMMi0gsXUsSq00s9e7gzEhMYOK6pT4xVse2dsJodWwwTnWUVq92p+28qXrJRjufl2DTkhLw==} + resolution: + { integrity: sha512-ppxHizFRg5ZbTWOXMMi0gsXUsSq00s9e7gzEhMYOK6pT4xVse2dsJodWwwTnWUVq92p+28qXrJRjufl2DTkhLw== } sharedb@5.2.2: - resolution: {integrity: sha512-F9zf+OsQZLM13Vu1Jw6om4MB1jgPqCGdIR92qkPaeiEnimR9Ig3j7dVsvXEbJnkTrljlkb2aMDNRVEU/dlGGtg==} + resolution: + { integrity: sha512-F9zf+OsQZLM13Vu1Jw6om4MB1jgPqCGdIR92qkPaeiEnimR9Ig3j7dVsvXEbJnkTrljlkb2aMDNRVEU/dlGGtg== } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: ">=8" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: ">=8" } shell-quote@1.10.0: - resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== } + engines: { node: ">= 0.4" } side-channel-list@1.0.1: - resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== } + engines: { node: ">= 0.4" } side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== } + engines: { node: ">= 0.4" } side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== } + engines: { node: ">= 0.4" } side-channel@1.1.1: - resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== } + engines: { node: ">= 0.4" } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: ">=14" } sigstore@4.1.1: - resolution: {integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w== } + engines: { node: ^20.17.0 || >=22.9.0 } simple-zstd@1.4.2: - resolution: {integrity: sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A==} + resolution: + { integrity: sha512-kGYEvT33M5XfyQvvW4wxl3eKcWbdbCc1V7OZzuElnaXft0qbVzoIIXHXiCm3JCUki+MZKKmvjl8p2VGLJc5Y/A== } sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== } + engines: { node: ">= 10" } sirv@3.0.2: - resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== } + engines: { node: ">=18" } sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: ">=8" } slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== } + engines: { node: ">=14.16" } slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== } + engines: { node: ">=12" } slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w== } + engines: { node: ">=18" } smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + resolution: + { integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== } + engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } socket.io-adapter@2.5.7: - resolution: {integrity: sha512-e0LyK91f3cUxTmv95/KzoLg47+zF+s/sbxRGDNsyG4dmIP8ZSX8ax6byOxfJXeNNtS/8AZlfD+uP7gBeR7DLlg==} + resolution: + { integrity: sha512-e0LyK91f3cUxTmv95/KzoLg47+zF+s/sbxRGDNsyG4dmIP8ZSX8ax6byOxfJXeNNtS/8AZlfD+uP7gBeR7DLlg== } socket.io-parser@4.2.6: - resolution: {integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg== } + engines: { node: ">=10.0.0" } socket.io@4.8.3: - resolution: {integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==} - engines: {node: '>=10.2.0'} + resolution: + { integrity: sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A== } + engines: { node: ">=10.2.0" } sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + resolution: + { integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== } socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== } + engines: { node: ">= 14" } socks@2.8.9: - resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + resolution: + { integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw== } + engines: { node: ">= 10.0.0", npm: ">= 3.0.0" } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } + engines: { node: ">=0.10.0" } source-map-loader@5.0.0: - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: 5.105.0 source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + resolution: + { integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== } source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== } source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== } + engines: { node: ">=0.8.0" } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: ">=0.10.0" } source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== } + engines: { node: ">= 12" } sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + resolution: + { integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== } spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== } + engines: { node: ">=8" } spawnd@5.0.0: - resolution: {integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==} + resolution: + { integrity: sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA== } spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + resolution: + { integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== } spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + resolution: + { integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== } spdx-license-ids@3.0.23: - resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + resolution: + { integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw== } spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + resolution: + { integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== } spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== } + engines: { node: ">=6.0.0" } split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + resolution: + { integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } ssri@13.0.1: - resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ== } + engines: { node: ^20.17.0 || >=22.9.0 } stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + resolution: + { integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== } stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== } + engines: { node: ">=10" } stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + resolution: + { integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== } statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== } + engines: { node: ">= 0.6" } statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== } + engines: { node: ">= 0.8" } stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== } + engines: { node: ">=18" } stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== } + engines: { node: ">= 0.4" } storybook@10.2.14: - resolution: {integrity: sha512-HGAgLbDAAbLOgjERsBXPpHUMxynHumYgoCRNBnAH57HfKuHL9LA3nKvKpbhFbYb/8PSG5X3hiKukki0R6Op7Aw==} + resolution: + { integrity: sha512-HGAgLbDAAbLOgjERsBXPpHUMxynHumYgoCRNBnAH57HfKuHL9LA3nKvKpbhFbYb/8PSG5X3hiKukki0R6Op7Aw== } hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -8282,173 +10030,211 @@ packages: optional: true stream-combiner@0.2.2: - resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} + resolution: + { integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ== } stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + resolution: + { integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== } streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw== } + engines: { node: ">=8.0" } string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} + resolution: + { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } + engines: { node: ">=0.6.19" } string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== } + engines: { node: ">=10" } string-length@6.0.0: - resolution: {integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg== } + engines: { node: ">=16" } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: ">=8" } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: ">=12" } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== } + engines: { node: ">=18" } string-width@8.2.1: - resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA== } + engines: { node: ">=20" } string.prototype.trim@1.2.11: - resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w== } + engines: { node: ">= 0.4" } string.prototype.trimend@1.0.10: - resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw== } + engines: { node: ">= 0.4" } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== } + engines: { node: ">= 0.4" } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== } + engines: { node: ">=4" } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: ">=8" } strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== } + engines: { node: ">=12" } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: ">=4" } strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } + engines: { node: ">=8" } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } + engines: { node: ">=6" } strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } + engines: { node: ">=12" } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } + engines: { node: ">=8" } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: ">=8" } strnum@2.4.0: - resolution: {integrity: sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==} + resolution: + { integrity: sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg== } style-loader@4.0.0: - resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: 5.105.0 supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== } + engines: { node: ">=0.8.0" } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } + engines: { node: ">=4" } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: ">=8" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } + engines: { node: ">=10" } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: ">= 0.4" } svg-pan-zoom@3.6.2: - resolution: {integrity: sha512-JwnvRWfVKw/Xzfe6jriFyfey/lWJLq4bUh2jwoR5ChWQuQoOH8FEh1l/bEp46iHHKHEJWIyFJETbazraxNWECg==} + resolution: + { integrity: sha512-JwnvRWfVKw/Xzfe6jriFyfey/lWJLq4bUh2jwoR5ChWQuQoOH8FEh1l/bEp46iHHKHEJWIyFJETbazraxNWECg== } synckit@0.11.13: - resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg== } + engines: { node: ^14.18.0 || >=16.0.0 } tablesort@5.7.1: - resolution: {integrity: sha512-wm+xSponmlN1spiuwGlrvNGoG8fEso+y86OOjS+Pl0Qsje/cOVSfUvELcXILWc8/sgEdY/NGMPo0qhFGyYKnwQ==} - engines: {node: '>= 22', npm: '>= 10'} + resolution: + { integrity: sha512-wm+xSponmlN1spiuwGlrvNGoG8fEso+y86OOjS+Pl0Qsje/cOVSfUvELcXILWc8/sgEdY/NGMPo0qhFGyYKnwQ== } + engines: { node: ">= 22", npm: ">= 10" } tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== } + engines: { node: ">=6" } tar@7.5.21: - resolution: {integrity: sha512-XdhtCvlMywwxpCW8YEq3lOXBJpUPTR2OHHcwLPO3HwsJqOHa2Ok/oJ7ruGzp+JrKoRPVCzJwAdEjqLW/vNRPHA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-XdhtCvlMywwxpCW8YEq3lOXBJpUPTR2OHHcwLPO3HwsJqOHa2Ok/oJ7ruGzp+JrKoRPVCzJwAdEjqLW/vNRPHA== } + engines: { node: ">=18" } telejson@8.0.0: - resolution: {integrity: sha512-8mCI1dHX80nchOkIEgvyWlGLgeh/SxO7JZPOud0DxvfFdI6MgwxRL8ff7rVdj6436uHhpWaxLQjU74Jb2I0u9g==} + resolution: + { integrity: sha512-8mCI1dHX80nchOkIEgvyWlGLgeh/SxO7JZPOud0DxvfFdI6MgwxRL8ff7rVdj6436uHhpWaxLQjU74Jb2I0u9g== } terser-webpack-plugin@5.6.1: - resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@minify-html/node': '*' - '@swc/core': '*' - '@swc/css': '*' - '@swc/html': '*' - clean-css: '*' - cssnano: '*' - csso: '*' - esbuild: '*' - html-minifier-terser: '*' - lightningcss: '*' - postcss: '*' - uglify-js: '*' + resolution: + { integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== } + engines: { node: ">= 10.13.0" } + peerDependencies: + "@minify-html/node": "*" + "@swc/core": "*" + "@swc/css": "*" + "@swc/html": "*" + clean-css: "*" + cssnano: "*" + csso: "*" + esbuild: "*" + html-minifier-terser: "*" + lightningcss: "*" + postcss: "*" + uglify-js: "*" webpack: 5.105.0 peerDependenciesMeta: - '@minify-html/node': + "@minify-html/node": optional: true - '@swc/core': + "@swc/core": optional: true - '@swc/css': + "@swc/css": optional: true - '@swc/html': + "@swc/html": optional: true clean-css: optional: true @@ -8468,376 +10254,462 @@ packages: optional: true terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== } + engines: { node: ">=10" } hasBin: true terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q== } + engines: { node: ">=10" } hasBin: true test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== } + engines: { node: ">=8" } thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} + resolution: + { integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw== } + engines: { node: ">=10.18" } peerDependencies: tslib: ^2 through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + resolution: + { integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== } through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + resolution: + { integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== } through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== } thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + resolution: + { integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== } tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + resolution: + { integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== } tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + resolution: + { integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== } tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== } + engines: { node: ">=12.0.0" } tinyglobby@0.2.17: - resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== } + engines: { node: ">=12.0.0" } tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== } + engines: { node: ">=14.0.0" } tinyspy@4.0.4: - resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== } + engines: { node: ">=14.0.0" } tmp@0.2.7: - resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} - engines: {node: '>=14.14'} + resolution: + { integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw== } + engines: { node: ">=14.14" } tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + resolution: + { integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: ">=8.0" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== } + engines: { node: ">=0.6" } totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== } + engines: { node: ">=6" } tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== } + engines: { node: ">=6" } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== } + engines: { node: ">=12" } tree-dump@1.1.0: - resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} - engines: {node: '>=10.0'} + resolution: + { integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== } + engines: { node: ">=10.0" } peerDependencies: - tslib: '2' + tslib: "2" tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + resolution: + { integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== } hasBin: true trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ== } + engines: { node: ">=6" } ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} + resolution: + { integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== } + engines: { node: ">=18.12" } peerDependencies: - typescript: '>=4.8.4' + typescript: ">=4.8.4" ts-dedent@2.3.0: - resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==} - engines: {node: '>=6.10'} + resolution: + { integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg== } + engines: { node: ">=6.10" } ts-mockito@2.6.1: - resolution: {integrity: sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw==} + resolution: + { integrity: sha512-qU9m/oEBQrKq5hwfbJ7MgmVN5Gu6lFnIGWvpxSjrqq6YYEVv+RwVFWySbZMBgazsWqv6ctAyVBpo9TmAxnOEKw== } ts-morph@27.0.2: - resolution: {integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==} + resolution: + { integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w== } ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + resolution: + { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } hasBin: true peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true - '@swc/wasm': + "@swc/wasm": optional: true ts-object-path@0.1.2: - resolution: {integrity: sha512-YLX9omkbe2spFv7DDo1fC5BiRfMtu/LgYuGSXnuIT5EkhedzCEShT7YrsQV3pjjT7doY2RHfoxJrra16KJlf7w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-YLX9omkbe2spFv7DDo1fC5BiRfMtu/LgYuGSXnuIT5EkhedzCEShT7YrsQV3pjjT7doY2RHfoxJrra16KJlf7w== } + engines: { node: ">=6.0.0" } tsconfig-paths-webpack-plugin@4.2.0: - resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA== } + engines: { node: ">=10.13.0" } tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== } tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== } + engines: { node: ">=6" } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } tuf-js@4.1.0: - resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ== } + engines: { node: ^20.17.0 || >=22.9.0 } type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== } + engines: { node: ">= 0.8.0" } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: ">= 0.8.0" } type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } + engines: { node: ">=4" } type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== } + engines: { node: ">=10" } type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== } + engines: { node: ">=8" } type-fest@4.2.0: - resolution: {integrity: sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-5zknd7Dss75pMSED270A1RQS3KloqRJA9XbXLe0eCxyw7xXFb3rd+9B0UQ/0E+LQT6lnrLviEolYORlRWamn4w== } + engines: { node: ">=16" } type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== } + engines: { node: ">= 0.6" } type-is@2.1.0: - resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA== } + engines: { node: ">= 18" } typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== } + engines: { node: ">= 0.4" } typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== } + engines: { node: ">= 0.4" } typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== } + engines: { node: ">= 0.4" } typed-array-length@1.0.8: - resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g== } + engines: { node: ">= 0.4" } typed-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + resolution: + { integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== } typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + resolution: + { integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== } typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== } + engines: { node: ">=14.17" } hasBin: true ua-parser-js@0.7.41: - resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} + resolution: + { integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg== } hasBin: true uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== } + engines: { node: ">=0.8.0" } hasBin: true unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== } + engines: { node: ">= 0.4" } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== } undici@6.27.0: - resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} - engines: {node: '>=18.17'} + resolution: + { integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg== } + engines: { node: ">=18.17" } undici@7.28.0: - resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} - engines: {node: '>=20.18.1'} + resolution: + { integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA== } + engines: { node: ">=20.18.1" } unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== } + engines: { node: ">=4" } unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== } + engines: { node: ">=4" } unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== } + engines: { node: ">=4" } unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== } + engines: { node: ">=4" } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== } + engines: { node: ">= 4.0.0" } universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== } + engines: { node: ">= 4.0.0" } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } + engines: { node: ">= 10.0.0" } unix-crypt-td-js@1.1.4: - resolution: {integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==} + resolution: + { integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw== } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== } + engines: { node: ">= 0.8" } unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} + resolution: + { integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww== } + engines: { node: ">=18.12.0" } unrs-resolver@1.12.2: - resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + resolution: + { integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ== } update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + resolution: + { integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + resolution: + { integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== } use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + resolution: + { integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + resolution: + { integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== } utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== } + engines: { node: ">= 0.4.0" } uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + resolution: + { integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== } hasBin: true uuid@11.1.1: - resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} + resolution: + { integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== } hasBin: true uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== } deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} + resolution: + { integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== } + engines: { node: ">=10.12.0" } validate-npm-package-name@6.0.2: - resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} - engines: {node: ^18.17.0 || >=20.5.0} + resolution: + { integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ== } + engines: { node: ^18.17.0 || >=20.5.0 } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== } + engines: { node: ">= 0.8" } vis-data@8.0.4: - resolution: {integrity: sha512-TsN0sMHqIRpdfg6TNPtfdINpkgxtnQP6JNWCaiSwvou5seXqKiP5eERkaBg+Y56wyJ4FZTeOEs/dEmWEPrpltQ==} + resolution: + { integrity: sha512-TsN0sMHqIRpdfg6TNPtfdINpkgxtnQP6JNWCaiSwvou5seXqKiP5eERkaBg+Y56wyJ4FZTeOEs/dEmWEPrpltQ== } peerDependencies: uuid: ^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^13.0.0 || ^14.0.0 - vis-util: '>=6.0.0' + vis-util: ">=6.0.0" vis-network@10.1.0: - resolution: {integrity: sha512-D7b5p/C6SwWv1BlH9EDdtP0Tje/PJzSBWKef9qy2DyTC14QB7KBcnAZxIyW2m7mFYyfoeR+k5GF747zDcIhaKA==} + resolution: + { integrity: sha512-D7b5p/C6SwWv1BlH9EDdtP0Tje/PJzSBWKef9qy2DyTC14QB7KBcnAZxIyW2m7mFYyfoeR+k5GF747zDcIhaKA== } peerDependencies: - '@egjs/hammerjs': ^2.0.0 + "@egjs/hammerjs": ^2.0.0 component-emitter: ^1.3.0 || ^2.0.0 keycharm: ^0.2.0 || ^0.3.0 || ^0.4.0 uuid: ^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^13.0.0 || ^14.0.0 - vis-data: '>=8.0.0' - vis-util: '>=6.0.0' + vis-data: ">=8.0.0" + vis-util: ">=6.0.0" vis-util@6.0.0: - resolution: {integrity: sha512-qtpts3HRma0zPe4bO7t9A2uejkRNj8Z2Tb6do6lN85iPNWExFkUiVhdAq5uLGIUqBFduyYeqWJKv/jMkxX0R5g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qtpts3HRma0zPe4bO7t9A2uejkRNj8Z2Tb6do6lN85iPNWExFkUiVhdAq5uLGIUqBFduyYeqWJKv/jMkxX0R5g== } + engines: { node: ">=8" } peerDependencies: - '@egjs/hammerjs': ^2.0.0 + "@egjs/hammerjs": ^2.0.0 component-emitter: ^1.3.0 || ^2.0.0 vite@7.3.2: - resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg== } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" less: ^4.0.0 lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: '>=0.54.8' + stylus: ">=0.54.8" sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true jiti: optional: true @@ -8861,54 +10733,67 @@ packages: optional: true void-elements@2.0.1: - resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== } + engines: { node: ">=0.10.0" } wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== } + engines: { node: ">=12.0.0" } hasBin: true wait-port@0.2.14: - resolution: {integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kIzjWcr6ykl7WFbZd0TMae8xovwqcqbx6FM9l+7agOgUByhzdjfzZBPK2CPufldTOMxbUivss//Sh9MFawmPRQ== } + engines: { node: ">=8" } hasBin: true walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + resolution: + { integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== } watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== } + engines: { node: ">=10.13.0" } watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg== } + engines: { node: ">=10.13.0" } wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + resolution: + { integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== } wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: + { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + resolution: + { integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw== } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + resolution: + { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== } + engines: { node: ">=12" } webpack-bundle-analyzer@4.10.2: - resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== } + engines: { node: ">= 10.13.0" } hasBin: true webpack-dev-middleware@6.1.3: - resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} - engines: {node: '>= 14.15.0'} + resolution: + { integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw== } + engines: { node: ">= 14.15.0" } peerDependencies: webpack: 5.105.0 peerDependenciesMeta: @@ -8916,8 +10801,9 @@ packages: optional: true webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA== } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: 5.105.0 peerDependenciesMeta: @@ -8925,8 +10811,9 @@ packages: optional: true webpack-dev-middleware@7.4.5: - resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA== } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: 5.105.0 peerDependenciesMeta: @@ -8934,12 +10821,13 @@ packages: optional: true webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} - engines: {node: '>= 18.12.0'} + resolution: + { integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== } + engines: { node: ">= 18.12.0" } hasBin: true peerDependencies: webpack: 5.105.0 - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack: optional: true @@ -8947,147 +10835,181 @@ packages: optional: true webpack-hot-middleware@2.26.1: - resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} + resolution: + { integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A== } webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== } + engines: { node: ">=18.0.0" } webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ== } + engines: { node: ">=10.13.0" } webpack-subresource-integrity@5.1.0: - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} + resolution: + { integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== } + engines: { node: ">= 12" } peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + html-webpack-plugin: ">= 5.0.0-beta.1 < 6" webpack: 5.105.0 peerDependenciesMeta: html-webpack-plugin: optional: true webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + resolution: + { integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ== } webpack@5.105.0: - resolution: {integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw== } + engines: { node: ">=10.13.0" } hasBin: true peerDependencies: - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack-cli: optional: true websocket-driver@0.7.5: - resolution: {integrity: sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== } + engines: { node: ">=0.8.0" } websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== } + engines: { node: ">=0.8.0" } websocket-json-stream@0.0.3: - resolution: {integrity: sha512-QX++vQMcP/efvHoqHPcua/ET6I02EumuvEuhUPkk6E0XiDdSrnZtyxSlmQUeOJii7XSyHQ1oYlYfd9adRSm7zQ==} + resolution: + { integrity: sha512-QX++vQMcP/efvHoqHPcua/ET6I02EumuvEuhUPkk6E0XiDdSrnZtyxSlmQUeOJii7XSyHQ1oYlYfd9adRSm7zQ== } whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== } + engines: { node: ">=18" } deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== } + engines: { node: ">=18" } whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== } + engines: { node: ">=12" } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== } + engines: { node: ">= 0.4" } which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== } + engines: { node: ">= 0.4" } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== } + engines: { node: ">= 0.4" } which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + resolution: + { integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== } which-typed-array@1.1.22: - resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw== } + engines: { node: ">= 0.4" } which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + resolution: + { integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== } hasBin: true which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: ">= 8" } hasBin: true which@3.0.1: - resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } hasBin: true which@6.0.1: - resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} - engines: {node: ^20.17.0 || >=22.9.0} + resolution: + { integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + resolution: + { integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== } windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== } + engines: { node: ">=10" } word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } + engines: { node: ">=0.10.0" } wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + { integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== } wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== } + engines: { node: ">=8" } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: ">=10" } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: ">=12" } wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww== } + engines: { node: ">=18" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + resolution: + { integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== } write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } ws@7.5.11: - resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} - engines: {node: '>=8.3.0'} + resolution: + { integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA== } + engines: { node: ">=8.3.0" } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -9098,11 +11020,12 @@ packages: optional: true ws@8.20.1: - resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w== } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -9110,11 +11033,12 @@ packages: optional: true ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g== } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -9122,233 +11046,258 @@ packages: optional: true wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== } + engines: { node: ">=18" } xml-naming@0.1.0: - resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw== } + engines: { node: ">=16.0.0" } xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} + resolution: + { integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== } xmlbuilder@12.0.0: - resolution: {integrity: sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ== } + engines: { node: ">=6.0" } xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== } + engines: { node: ">=0.4" } y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + resolution: + { integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: ">=10" } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== } + engines: { node: ">=18" } yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} + resolution: + { integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== } + engines: { node: ">= 14.6" } hasBin: true yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== } + engines: { node: ">=6" } yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== } + engines: { node: ">=10" } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: ">=12" } yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== } + engines: { node: ">=8" } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== } + engines: { node: ">=10" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: ">=12" } yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } + engines: { node: ">=6" } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: ">=10" } yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== } + engines: { node: ">=18" } yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug== } + engines: { node: ">=18" } zod-to-json-schema@3.25.2: - resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + resolution: + { integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA== } peerDependencies: zod: ^3.25.28 || ^4 zod@4.1.13: - resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + resolution: + { integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig== } zone.js@0.15.1: - resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} + resolution: + { integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w== } snapshots: + "@adobe/css-tools@4.5.0": {} - '@adobe/css-tools@4.5.0': {} - - '@aduh95/viz.js@3.4.0': {} + "@aduh95/viz.js@3.4.0": {} - '@algolia/abtesting@1.1.0': + "@algolia/abtesting@1.1.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-abtesting@5.35.0': + "@algolia/client-abtesting@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-analytics@5.35.0': + "@algolia/client-analytics@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-common@5.35.0': {} + "@algolia/client-common@5.35.0": {} - '@algolia/client-insights@5.35.0': + "@algolia/client-insights@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-personalization@5.35.0': + "@algolia/client-personalization@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-query-suggestions@5.35.0': + "@algolia/client-query-suggestions@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/client-search@5.35.0': + "@algolia/client-search@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/ingestion@1.35.0': + "@algolia/ingestion@1.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/monitoring@1.35.0': + "@algolia/monitoring@1.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/recommend@5.35.0': + "@algolia/recommend@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 - '@algolia/requester-browser-xhr@5.35.0': + "@algolia/requester-browser-xhr@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 + "@algolia/client-common": 5.35.0 - '@algolia/requester-fetch@5.35.0': + "@algolia/requester-fetch@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 + "@algolia/client-common": 5.35.0 - '@algolia/requester-node-http@5.35.0': + "@algolia/requester-node-http@5.35.0": dependencies: - '@algolia/client-common': 5.35.0 + "@algolia/client-common": 5.35.0 - '@ampproject/remapping@2.3.0': + "@ampproject/remapping@2.3.0": dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@angular-devkit/architect@0.2003.28(chokidar@5.0.0)': + "@angular-devkit/architect@0.2003.28(chokidar@5.0.0)": dependencies: - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/architect@0.2102.15(chokidar@5.0.0)': + "@angular-devkit/architect@0.2102.15(chokidar@5.0.0)": dependencies: - '@angular-devkit/core': 21.2.15(chokidar@5.0.0) + "@angular-devkit/core": 21.2.15(chokidar@5.0.0) rxjs: 7.8.2 transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@swc/core@1.15.41)(@types/node@22.19.21)(chokidar@5.0.0)(html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(jest@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)))(jiti@1.21.7)(karma@6.4.4)(typescript@5.9.3)(yaml@2.9.0)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2003.28(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) - '@angular/build': 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.43.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0) - '@angular/compiler-cli': 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) - '@babel/core': 7.28.3 - '@babel/generator': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-transform-runtime': 7.28.3(@babel/core@7.28.3) - '@babel/preset-env': 7.28.3(@babel/core@7.28.3) - '@babel/runtime': 7.28.3 - '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) + "@angular-devkit/build-angular@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@swc/core@1.15.41)(@types/node@22.19.21)(chokidar@5.0.0)(html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(jest@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)))(jiti@1.21.7)(karma@6.4.4)(typescript@5.9.3)(yaml@2.9.0)": + dependencies: + "@ampproject/remapping": 2.3.0 + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) + "@angular-devkit/build-webpack": 0.2003.28(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) + "@angular/build": 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.43.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0) + "@angular/compiler-cli": 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) + "@babel/core": 7.28.3 + "@babel/generator": 7.28.3 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-split-export-declaration": 7.24.7 + "@babel/plugin-transform-async-generator-functions": 7.28.0(@babel/core@7.28.3) + "@babel/plugin-transform-async-to-generator": 7.27.1(@babel/core@7.28.3) + "@babel/plugin-transform-runtime": 7.28.3(@babel/core@7.28.3) + "@babel/preset-env": 7.28.3(@babel/core@7.28.3) + "@babel/runtime": 7.28.3 + "@discoveryjs/json-ext": 0.6.3 + "@ngtools/webpack": 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) ansi-colors: 4.1.3 autoprefixer: 10.4.21(postcss@8.5.12) babel-loader: 10.0.0(@babel/core@7.28.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) @@ -9389,20 +11338,20 @@ snapshots: webpack-merge: 6.0.1 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) optionalDependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/service-worker': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/service-worker": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) esbuild: 0.28.0 jest: 30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) karma: 6.4.4 transitivePeerDependencies: - - '@angular/compiler' - - '@minify-html/node' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@swc/html' - - '@types/node' + - "@angular/compiler" + - "@minify-html/node" + - "@rspack/core" + - "@swc/core" + - "@swc/css" + - "@swc/html" + - "@types/node" - bufferutil - chokidar - clean-css @@ -9425,16 +11374,16 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.2003.28(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))': + "@angular-devkit/build-webpack@0.2003.28(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))": dependencies: - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) rxjs: 7.8.2 webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) transitivePeerDependencies: - chokidar - '@angular-devkit/core@20.3.28(chokidar@5.0.0)': + "@angular-devkit/core@20.3.28(chokidar@5.0.0)": dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) @@ -9445,7 +11394,7 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/core@21.1.0(chokidar@5.0.0)': + "@angular-devkit/core@21.1.0(chokidar@5.0.0)": dependencies: ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) @@ -9456,7 +11405,7 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/core@21.2.15(chokidar@5.0.0)': + "@angular-devkit/core@21.2.15(chokidar@5.0.0)": dependencies: ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) @@ -9467,9 +11416,9 @@ snapshots: optionalDependencies: chokidar: 5.0.0 - '@angular-devkit/schematics@20.3.28(chokidar@5.0.0)': + "@angular-devkit/schematics@20.3.28(chokidar@5.0.0)": dependencies: - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.17 ora: 8.2.0 @@ -9477,9 +11426,9 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/schematics@21.1.0(chokidar@5.0.0)': + "@angular-devkit/schematics@21.1.0(chokidar@5.0.0)": dependencies: - '@angular-devkit/core': 21.1.0(chokidar@5.0.0) + "@angular-devkit/core": 21.1.0(chokidar@5.0.0) jsonc-parser: 3.3.1 magic-string: 0.30.21 ora: 9.0.0 @@ -9487,85 +11436,85 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-eslint/builder@20.7.0(chokidar@5.0.0)(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/builder@20.7.0(chokidar@5.0.0)(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - chokidar - '@angular-eslint/bundled-angular-compiler@20.7.0': {} + "@angular-eslint/bundled-angular-compiler@20.7.0": {} - '@angular-eslint/eslint-plugin-template@20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/eslint-plugin-template@20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-eslint/bundled-angular-compiler': 20.7.0 - '@angular-eslint/template-parser': 20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/utils': 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-eslint/bundled-angular-compiler": 20.7.0 + "@angular-eslint/template-parser": 20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-eslint/utils": 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) aria-query: 5.3.2 axobject-query: 4.1.0 eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 - '@angular-eslint/eslint-plugin@20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/eslint-plugin@20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-eslint/bundled-angular-compiler': 20.7.0 - '@angular-eslint/utils': 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-eslint/bundled-angular-compiler": 20.7.0 + "@angular-eslint/utils": 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.4(jiti@1.21.7) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 - '@angular-eslint/schematics@20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/schematics@20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(chokidar@5.0.0)(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) - '@angular-devkit/schematics': 20.3.28(chokidar@5.0.0) - '@angular-eslint/eslint-plugin': 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@angular-eslint/eslint-plugin-template': 20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) + "@angular-devkit/schematics": 20.3.28(chokidar@5.0.0) + "@angular-eslint/eslint-plugin": 20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-eslint/eslint-plugin-template": 20.7.0(@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(@typescript-eslint/types@8.61.0)(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) ignore: 7.0.5 semver: 7.7.3 strip-json-comments: 3.1.1 transitivePeerDependencies: - - '@angular-eslint/template-parser' - - '@typescript-eslint/types' - - '@typescript-eslint/utils' + - "@angular-eslint/template-parser" + - "@typescript-eslint/types" + - "@typescript-eslint/utils" - chokidar - eslint - typescript - '@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/template-parser@20.7.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-eslint/bundled-angular-compiler': 20.7.0 + "@angular-eslint/bundled-angular-compiler": 20.7.0 eslint: 9.39.4(jiti@1.21.7) eslint-scope: 9.1.2 typescript: 5.9.3 - '@angular-eslint/utils@20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@angular-eslint/utils@20.7.0(@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@angular-eslint/bundled-angular-compiler': 20.7.0 - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@angular-eslint/bundled-angular-compiler": 20.7.0 + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 - '@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))': + "@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))": dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.43.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) - '@angular/compiler': 20.3.25 - '@angular/compiler-cli': 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.14(@types/node@22.19.21) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0)) + "@angular/build@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.43.1)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0)": + dependencies: + "@ampproject/remapping": 2.3.0 + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) + "@angular/compiler": 20.3.25 + "@angular/compiler-cli": 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-split-export-declaration": 7.24.7 + "@inquirer/confirm": 5.1.14(@types/node@22.19.21) + "@vitejs/plugin-basic-ssl": 2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0)) beasties: 0.3.5 browserslist: 4.28.2 esbuild: 0.28.0 @@ -9588,15 +11537,15 @@ snapshots: vite: 7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.43.1)(yaml@2.9.0) watchpack: 2.4.4 optionalDependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/service-worker': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/service-worker": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) karma: 6.4.4 less: 4.4.0 lmdb: 3.4.2 postcss: 8.5.12 transitivePeerDependencies: - - '@types/node' + - "@types/node" - chokidar - jiti - lightningcss @@ -9608,17 +11557,17 @@ snapshots: - tsx - yaml - '@angular/build@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.48.0)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) - '@angular/compiler': 20.3.25 - '@angular/compiler-cli': 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.14(@types/node@22.19.21) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0)) + "@angular/build@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@types/node@22.19.21)(chokidar@5.0.0)(jiti@1.21.7)(karma@6.4.4)(less@4.4.0)(postcss@8.5.12)(terser@5.48.0)(tslib@2.8.1)(typescript@5.9.3)(yaml@2.9.0)": + dependencies: + "@ampproject/remapping": 2.3.0 + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) + "@angular/compiler": 20.3.25 + "@angular/compiler-cli": 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-split-export-declaration": 7.24.7 + "@inquirer/confirm": 5.1.14(@types/node@22.19.21) + "@vitejs/plugin-basic-ssl": 2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0)) beasties: 0.3.5 browserslist: 4.28.2 esbuild: 0.28.0 @@ -9641,15 +11590,15 @@ snapshots: vite: 7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0) watchpack: 2.4.4 optionalDependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/service-worker': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/service-worker": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) karma: 6.4.4 less: 4.4.0 lmdb: 3.4.2 postcss: 8.5.12 transitivePeerDependencies: - - '@types/node' + - "@types/node" - chokidar - jiti - lightningcss @@ -9661,24 +11610,24 @@ snapshots: - tsx - yaml - '@angular/cdk@20.2.14(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + "@angular/cdk@20.2.14(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)": dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/cli@20.3.28(@types/node@22.19.21)(chokidar@5.0.0)': + "@angular/cli@20.3.28(@types/node@22.19.21)(chokidar@5.0.0)": dependencies: - '@angular-devkit/architect': 0.2003.28(chokidar@5.0.0) - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) - '@angular-devkit/schematics': 20.3.28(chokidar@5.0.0) - '@inquirer/prompts': 7.8.2(@types/node@22.19.21) - '@listr2/prompt-adapter-inquirer': 3.0.1(@inquirer/prompts@7.8.2(@types/node@22.19.21))(@types/node@22.19.21)(listr2@9.0.1) - '@modelcontextprotocol/sdk': 1.26.0(zod@4.1.13) - '@schematics/angular': 20.3.28(chokidar@5.0.0) - '@yarnpkg/lockfile': 1.1.0 + "@angular-devkit/architect": 0.2003.28(chokidar@5.0.0) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) + "@angular-devkit/schematics": 20.3.28(chokidar@5.0.0) + "@inquirer/prompts": 7.8.2(@types/node@22.19.21) + "@listr2/prompt-adapter-inquirer": 3.0.1(@inquirer/prompts@7.8.2(@types/node@22.19.21))(@types/node@22.19.21)(listr2@9.0.1) + "@modelcontextprotocol/sdk": 1.26.0(zod@4.1.13) + "@schematics/angular": 20.3.28(chokidar@5.0.0) + "@yarnpkg/lockfile": 1.1.0 algoliasearch: 5.35.0 ini: 5.0.0 jsonc-parser: 3.3.1 @@ -9690,22 +11639,22 @@ snapshots: yargs: 18.0.0 zod: 4.1.13 transitivePeerDependencies: - - '@cfworker/json-schema' - - '@types/node' + - "@cfworker/json-schema" + - "@types/node" - chokidar - supports-color - '@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + "@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)": dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3)': + "@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3)": dependencies: - '@angular/compiler': 20.3.25 - '@babel/core': 7.28.3 - '@jridgewell/sourcemap-codec': 1.5.5 + "@angular/compiler": 20.3.25 + "@babel/core": 7.28.3 + "@jridgewell/sourcemap-codec": 1.5.5 chokidar: 4.0.3 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 @@ -9717,350 +11666,350 @@ snapshots: transitivePeerDependencies: - supports-color - '@angular/compiler@20.3.25': + "@angular/compiler@20.3.25": dependencies: tslib: 2.8.1 - '@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)': + "@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)": dependencies: rxjs: 7.8.2 tslib: 2.8.1 optionalDependencies: - '@angular/compiler': 20.3.25 + "@angular/compiler": 20.3.25 zone.js: 0.15.1 - '@angular/forms@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + "@angular/forms@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)": dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/language-service@20.3.25': {} + "@angular/language-service@20.3.25": {} - '@angular/material@20.2.14(281485441b18e381a53616d26f500745)': + "@angular/material@20.2.14(281485441b18e381a53616d26f500745)": dependencies: - '@angular/cdk': 20.2.14(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/forms': 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/cdk": 20.2.14(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/forms": 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/platform-browser-dynamic@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))': + "@angular/platform-browser-dynamic@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))": dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': 20.3.25 - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/compiler": 20.3.25 + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) tslib: 2.8.1 - '@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))': + "@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))": dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/animations": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/pwa@20.3.28(@angular/cli@20.3.28(@types/node@22.19.21)(chokidar@5.0.0))(chokidar@5.0.0)': + "@angular/pwa@20.3.28(@angular/cli@20.3.28(@types/node@22.19.21)(chokidar@5.0.0))(chokidar@5.0.0)": dependencies: - '@angular-devkit/schematics': 20.3.28(chokidar@5.0.0) - '@schematics/angular': 20.3.28(chokidar@5.0.0) + "@angular-devkit/schematics": 20.3.28(chokidar@5.0.0) + "@schematics/angular": 20.3.28(chokidar@5.0.0) parse5-html-rewriting-stream: 8.0.0 optionalDependencies: - '@angular/cli': 20.3.28(@types/node@22.19.21)(chokidar@5.0.0) + "@angular/cli": 20.3.28(@types/node@22.19.21)(chokidar@5.0.0) transitivePeerDependencies: - chokidar - '@angular/router@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + "@angular/router@20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)": dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + "@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)": dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 - '@arr/every@1.0.1': {} + "@arr/every@1.0.1": {} - '@auth0/auth0-auth-js@1.7.0': + "@auth0/auth0-auth-js@1.7.0": dependencies: jose: 6.2.3 openid-client: 6.8.4 - '@auth0/auth0-spa-js@2.21.1': + "@auth0/auth0-spa-js@2.21.1": dependencies: - '@auth0/auth0-auth-js': 1.7.0 + "@auth0/auth0-auth-js": 1.7.0 browser-tabs-lock: 1.3.0 dpop: 2.1.1 es-cookie: 1.3.2 - '@aws-crypto/crc32@5.2.0': + "@aws-crypto/crc32@5.2.0": dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.12 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/types": 3.973.12 tslib: 2.8.1 optional: true - '@aws-crypto/sha256-browser@5.2.0': + "@aws-crypto/sha256-browser@5.2.0": dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.12 - '@aws-sdk/util-locate-window': 3.965.7 - '@smithy/util-utf8': 2.3.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-crypto/supports-web-crypto": 5.2.0 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/types": 3.973.12 + "@aws-sdk/util-locate-window": 3.965.7 + "@smithy/util-utf8": 2.3.0 tslib: 2.8.1 optional: true - '@aws-crypto/sha256-js@5.2.0': + "@aws-crypto/sha256-js@5.2.0": dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.12 + "@aws-crypto/util": 5.2.0 + "@aws-sdk/types": 3.973.12 tslib: 2.8.1 optional: true - '@aws-crypto/supports-web-crypto@5.2.0': + "@aws-crypto/supports-web-crypto@5.2.0": dependencies: tslib: 2.8.1 optional: true - '@aws-crypto/util@5.2.0': + "@aws-crypto/util@5.2.0": dependencies: - '@aws-sdk/types': 3.973.12 - '@smithy/util-utf8': 2.3.0 + "@aws-sdk/types": 3.973.12 + "@smithy/util-utf8": 2.3.0 tslib: 2.8.1 optional: true - '@aws-sdk/client-cognito-identity@3.1068.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.20 - '@aws-sdk/credential-provider-node': 3.972.55 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/fetch-http-handler': 5.4.7 - '@smithy/node-http-handler': 4.7.8 - '@smithy/types': 4.14.4 + "@aws-sdk/client-cognito-identity@3.1068.0": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/credential-provider-node": 3.972.55 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/fetch-http-handler": 5.4.7 + "@smithy/node-http-handler": 4.7.8 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/core@3.974.20': + "@aws-sdk/core@3.974.20": dependencies: - '@aws-sdk/types': 3.973.12 - '@aws-sdk/xml-builder': 3.972.29 - '@aws/lambda-invoke-store': 0.2.4 - '@smithy/core': 3.24.7 - '@smithy/signature-v4': 5.4.7 - '@smithy/types': 4.14.4 + "@aws-sdk/types": 3.973.12 + "@aws-sdk/xml-builder": 3.972.29 + "@aws/lambda-invoke-store": 0.2.4 + "@smithy/core": 3.24.7 + "@smithy/signature-v4": 5.4.7 + "@smithy/types": 4.14.4 bowser: 2.14.1 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-cognito-identity@3.972.45': + "@aws-sdk/credential-provider-cognito-identity@3.972.45": dependencies: - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-env@3.972.46': + "@aws-sdk/credential-provider-env@3.972.46": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-http@3.972.48': + "@aws-sdk/credential-provider-http@3.972.48": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/fetch-http-handler': 5.4.7 - '@smithy/node-http-handler': 4.7.8 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/fetch-http-handler": 5.4.7 + "@smithy/node-http-handler": 4.7.8 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-ini@3.972.53': - dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/credential-provider-env': 3.972.46 - '@aws-sdk/credential-provider-http': 3.972.48 - '@aws-sdk/credential-provider-login': 3.972.52 - '@aws-sdk/credential-provider-process': 3.972.46 - '@aws-sdk/credential-provider-sso': 3.972.52 - '@aws-sdk/credential-provider-web-identity': 3.972.52 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/credential-provider-imds': 4.3.9 - '@smithy/types': 4.14.4 + "@aws-sdk/credential-provider-ini@3.972.53": + dependencies: + "@aws-sdk/core": 3.974.20 + "@aws-sdk/credential-provider-env": 3.972.46 + "@aws-sdk/credential-provider-http": 3.972.48 + "@aws-sdk/credential-provider-login": 3.972.52 + "@aws-sdk/credential-provider-process": 3.972.46 + "@aws-sdk/credential-provider-sso": 3.972.52 + "@aws-sdk/credential-provider-web-identity": 3.972.52 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/credential-provider-imds": 4.3.9 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-login@3.972.52': + "@aws-sdk/credential-provider-login@3.972.52": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-node@3.972.55': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.46 - '@aws-sdk/credential-provider-http': 3.972.48 - '@aws-sdk/credential-provider-ini': 3.972.53 - '@aws-sdk/credential-provider-process': 3.972.46 - '@aws-sdk/credential-provider-sso': 3.972.52 - '@aws-sdk/credential-provider-web-identity': 3.972.52 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/credential-provider-imds': 4.3.9 - '@smithy/types': 4.14.4 + "@aws-sdk/credential-provider-node@3.972.55": + dependencies: + "@aws-sdk/credential-provider-env": 3.972.46 + "@aws-sdk/credential-provider-http": 3.972.48 + "@aws-sdk/credential-provider-ini": 3.972.53 + "@aws-sdk/credential-provider-process": 3.972.46 + "@aws-sdk/credential-provider-sso": 3.972.52 + "@aws-sdk/credential-provider-web-identity": 3.972.52 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/credential-provider-imds": 4.3.9 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-process@3.972.46': + "@aws-sdk/credential-provider-process@3.972.46": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-sso@3.972.52': + "@aws-sdk/credential-provider-sso@3.972.52": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/token-providers': 3.1066.0 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/token-providers": 3.1066.0 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-provider-web-identity@3.972.52': + "@aws-sdk/credential-provider-web-identity@3.972.52": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/credential-providers@3.1068.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.1068.0 - '@aws-sdk/core': 3.974.20 - '@aws-sdk/credential-provider-cognito-identity': 3.972.45 - '@aws-sdk/credential-provider-env': 3.972.46 - '@aws-sdk/credential-provider-http': 3.972.48 - '@aws-sdk/credential-provider-ini': 3.972.53 - '@aws-sdk/credential-provider-login': 3.972.52 - '@aws-sdk/credential-provider-node': 3.972.55 - '@aws-sdk/credential-provider-process': 3.972.46 - '@aws-sdk/credential-provider-sso': 3.972.52 - '@aws-sdk/credential-provider-web-identity': 3.972.52 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/credential-provider-imds': 4.3.9 - '@smithy/types': 4.14.4 + "@aws-sdk/credential-providers@3.1068.0": + dependencies: + "@aws-sdk/client-cognito-identity": 3.1068.0 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/credential-provider-cognito-identity": 3.972.45 + "@aws-sdk/credential-provider-env": 3.972.46 + "@aws-sdk/credential-provider-http": 3.972.48 + "@aws-sdk/credential-provider-ini": 3.972.53 + "@aws-sdk/credential-provider-login": 3.972.52 + "@aws-sdk/credential-provider-node": 3.972.55 + "@aws-sdk/credential-provider-process": 3.972.46 + "@aws-sdk/credential-provider-sso": 3.972.52 + "@aws-sdk/credential-provider-web-identity": 3.972.52 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/credential-provider-imds": 4.3.9 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/nested-clients@3.997.20': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.20 - '@aws-sdk/signature-v4-multi-region': 3.996.34 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/fetch-http-handler': 5.4.7 - '@smithy/node-http-handler': 4.7.8 - '@smithy/types': 4.14.4 + "@aws-sdk/nested-clients@3.997.20": + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/signature-v4-multi-region": 3.996.34 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/fetch-http-handler": 5.4.7 + "@smithy/node-http-handler": 4.7.8 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/signature-v4-multi-region@3.996.34': + "@aws-sdk/signature-v4-multi-region@3.996.34": dependencies: - '@aws-sdk/types': 3.973.12 - '@smithy/signature-v4': 5.4.7 - '@smithy/types': 4.14.4 + "@aws-sdk/types": 3.973.12 + "@smithy/signature-v4": 5.4.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/token-providers@3.1066.0': + "@aws-sdk/token-providers@3.1066.0": dependencies: - '@aws-sdk/core': 3.974.20 - '@aws-sdk/nested-clients': 3.997.20 - '@aws-sdk/types': 3.973.12 - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@aws-sdk/core": 3.974.20 + "@aws-sdk/nested-clients": 3.997.20 + "@aws-sdk/types": 3.973.12 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/types@3.973.12': + "@aws-sdk/types@3.973.12": dependencies: - '@smithy/types': 4.14.4 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@aws-sdk/util-locate-window@3.965.7': + "@aws-sdk/util-locate-window@3.965.7": dependencies: tslib: 2.8.1 optional: true - '@aws-sdk/xml-builder@3.972.29': + "@aws-sdk/xml-builder@3.972.29": dependencies: - '@smithy/types': 4.14.4 + "@smithy/types": 4.14.4 fast-xml-parser: 5.7.3 tslib: 2.8.1 optional: true - '@aws/lambda-invoke-store@0.2.4': + "@aws/lambda-invoke-store@0.2.4": optional: true - '@babel/code-frame@7.29.7': + "@babel/code-frame@7.29.7": dependencies: - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.7': {} + "@babel/compat-data@7.29.7": {} - '@babel/core@7.28.3': + "@babel/core@7.28.3": dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.3) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.3) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -10069,18 +12018,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.28.6': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 + "@babel/core@7.28.6": + dependencies: + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.6) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -10089,18 +12038,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/core@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/remapping': 2.3.5 + "@babel/core@7.29.7": + dependencies: + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.29.7) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -10109,1001 +12058,1001 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': + "@babel/generator@7.28.3": dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.7': + "@babel/generator@7.29.7": dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + "@babel/helper-annotate-as-pure@7.27.3": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/helper-annotate-as-pure@7.29.7': + "@babel/helper-annotate-as-pure@7.29.7": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/helper-compilation-targets@7.29.7': + "@babel/helper-compilation-targets@7.29.7": dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 + "@babel/compat-data": 7.29.7 + "@babel/helper-validator-option": 7.29.7 browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.3)': + "@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.3) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.3) + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/traverse": 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.6)': + "@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.6) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.6) + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/traverse": 7.29.7 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.28.3)': + "@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.28.6)': + "@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-annotate-as-pure": 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.28.3)': + "@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.28.6)': + "@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.29.7': {} + "@babel/helper-globals@7.29.7": {} - '@babel/helper-member-expression-to-functions@7.29.7': + "@babel/helper-member-expression-to-functions@7.29.7": dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + "@babel/helper-module-imports@7.29.7": dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.28.3)': + "@babel/helper-module-transforms@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.28.6)': + "@babel/helper-module-transforms@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.29.7': + "@babel/helper-optimise-call-expression@7.29.7": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/helper-plugin-utils@7.29.7': {} + "@babel/helper-plugin-utils@7.29.7": {} - '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.28.3)': + "@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-wrap-function": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.28.6)': + "@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-wrap-function": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.29.7(@babel/core@7.28.3)': + "@babel/helper-replace-supers@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.29.7(@babel/core@7.28.6)': + "@babel/helper-replace-supers@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-member-expression-to-functions': 7.29.7 - '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-member-expression-to-functions": 7.29.7 + "@babel/helper-optimise-call-expression": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + "@babel/helper-skip-transparent-expression-wrappers@7.29.7": dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helper-split-export-declaration@7.24.7': + "@babel/helper-split-export-declaration@7.24.7": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/helper-string-parser@7.29.7': {} + "@babel/helper-string-parser@7.29.7": {} - '@babel/helper-validator-identifier@7.29.7': {} + "@babel/helper-validator-identifier@7.29.7": {} - '@babel/helper-validator-option@7.29.7': {} + "@babel/helper-validator-option@7.29.7": {} - '@babel/helper-wrap-function@7.29.7': + "@babel/helper-wrap-function@7.29.7": dependencies: - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/helpers@7.29.7': + "@babel/helpers@7.29.7": dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 - '@babel/parser@7.29.7': + "@babel/parser@7.29.7": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/plugin-transform-optional-chaining": 7.29.7(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 + "@babel/plugin-transform-optional-chaining": 7.29.7(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 + "@babel/core": 7.28.3 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 + "@babel/core": 7.28.6 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': + "@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': + "@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': + "@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': + "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': + "@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': + "@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + "@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': + "@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': + "@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + "@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)": dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': + "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)': + "@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.3) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.3) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.3) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.3) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.6) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.6) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)': + "@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-remap-async-to-generator": 7.29.7(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-classes@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.3) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-globals": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.3) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-classes@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.6) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-globals": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.6) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/template': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/template": 7.29.7 - '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/template': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/template": 7.29.7 - '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-explicit-resource-management@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-for-of@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-for-of@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-function-name@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-function-name@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-literals@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-literals@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-literals@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-literals@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-modules-amd@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-modules-umd@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-new-target@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-new-target@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.3) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-parameters": 7.29.7(@babel/core@7.28.3) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.6) - '@babel/traverse': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-parameters": 7.29.7(@babel/core@7.28.6) + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-object-super@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-object-super@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-replace-supers": 7.29.7(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-parameters@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-parameters@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.3)': + "@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + "@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-annotate-as-pure": 7.29.7 + "@babel/helper-create-class-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.3)': + "@babel/plugin-transform-runtime@7.28.3(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.28.3) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.28.3) @@ -11111,176 +13060,176 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-spread@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-spread@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-skip-transparent-expression-wrappers": 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.28.6)': + "@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 - '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.28.3)': + "@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.28.3)': - dependencies: - '@babel/core': 7.28.3 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.3) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.28.6) - '@babel/helper-plugin-utils': 7.29.7 - - '@babel/preset-env@7.28.3(@babel/core@7.28.3)': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/core': 7.28.3 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) - '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.3) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.28.3) - '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.28.3) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.28.6)": + dependencies: + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.28.3)": + dependencies: + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.28.6)": + dependencies: + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.28.3)": + dependencies: + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.28.6)": + dependencies: + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.28.3)": + dependencies: + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.28.6)": + dependencies: + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.28.3)": + dependencies: + "@babel/core": 7.28.3 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.3) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.28.6)": + dependencies: + "@babel/core": 7.28.6 + "@babel/helper-create-regexp-features-plugin": 7.29.7(@babel/core@7.28.6) + "@babel/helper-plugin-utils": 7.29.7 + + "@babel/preset-env@7.28.3(@babel/core@7.28.3)": + dependencies: + "@babel/compat-data": 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-validator-option": 7.29.7 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-bugfix-safari-class-field-initializer-scope": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + "@babel/plugin-syntax-import-assertions": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-syntax-import-attributes": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.28.3) + "@babel/plugin-transform-arrow-functions": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-async-generator-functions": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-async-to-generator": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-block-scoped-functions": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-block-scoping": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-class-properties": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-class-static-block": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-classes": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-computed-properties": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-dotall-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-duplicate-keys": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-dynamic-import": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-explicit-resource-management": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-exponentiation-operator": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-export-namespace-from": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-for-of": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-function-name": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-json-strings": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-literals": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-logical-assignment-operators": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-member-expression-literals": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-modules-amd": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-modules-commonjs": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-modules-systemjs": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-modules-umd": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-named-capturing-groups-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-new-target": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-nullish-coalescing-operator": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-numeric-separator": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-object-rest-spread": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-object-super": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-optional-catch-binding": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-optional-chaining": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-parameters": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-private-methods": 7.28.6(@babel/core@7.28.3) + "@babel/plugin-transform-private-property-in-object": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-property-literals": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-regenerator": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-regexp-modifiers": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-reserved-words": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-shorthand-properties": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-spread": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-sticky-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-template-literals": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-typeof-symbol": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-unicode-escapes": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-unicode-property-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-unicode-regex": 7.29.7(@babel/core@7.28.3) + "@babel/plugin-transform-unicode-sets-regex": 7.29.7(@babel/core@7.28.3) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.28.3) babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.28.3) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.28.3) @@ -11289,74 +13238,74 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-env@7.28.6(@babel/core@7.28.6)': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) - '@babel/plugin-syntax-import-assertions': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-block-scoped-functions': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-computed-properties': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-dotall-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-duplicate-keys': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-dynamic-import': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-explicit-resource-management': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-exponentiation-operator': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-function-name': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-json-strings': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-literals': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-numeric-separator': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-object-super': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-escapes': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-property-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-sets-regex': 7.29.7(@babel/core@7.28.6) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) + "@babel/preset-env@7.28.6(@babel/core@7.28.6)": + dependencies: + "@babel/compat-data": 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/helper-validator-option": 7.29.7 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-bugfix-safari-class-field-initializer-scope": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) + "@babel/plugin-syntax-import-assertions": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-syntax-import-attributes": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.28.6) + "@babel/plugin-transform-arrow-functions": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-async-generator-functions": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-async-to-generator": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-block-scoped-functions": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-block-scoping": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-class-properties": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-class-static-block": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-classes": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-computed-properties": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-destructuring": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-dotall-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-duplicate-keys": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-dynamic-import": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-explicit-resource-management": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-exponentiation-operator": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-export-namespace-from": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-for-of": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-function-name": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-json-strings": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-literals": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-logical-assignment-operators": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-member-expression-literals": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-modules-amd": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-modules-commonjs": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-modules-systemjs": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-modules-umd": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-named-capturing-groups-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-new-target": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-nullish-coalescing-operator": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-numeric-separator": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-object-rest-spread": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-object-super": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-optional-catch-binding": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-optional-chaining": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-parameters": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-private-methods": 7.28.6(@babel/core@7.28.6) + "@babel/plugin-transform-private-property-in-object": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-property-literals": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-regenerator": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-regexp-modifiers": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-reserved-words": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-shorthand-properties": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-spread": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-sticky-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-template-literals": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-typeof-symbol": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-unicode-escapes": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-unicode-property-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-unicode-regex": 7.29.7(@babel/core@7.28.6) + "@babel/plugin-transform-unicode-sets-regex": 7.29.7(@babel/core@7.28.6) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.28.6) babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.28.6) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.28.6) @@ -11365,94 +13314,94 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': + "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)": dependencies: - '@babel/core': 7.28.3 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/types': 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/types": 7.29.7 esutils: 2.0.3 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': + "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)": dependencies: - '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/types': 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-plugin-utils": 7.29.7 + "@babel/types": 7.29.7 esutils: 2.0.3 - '@babel/runtime@7.28.3': {} + "@babel/runtime@7.28.3": {} - '@babel/runtime@7.29.7': {} + "@babel/runtime@7.29.7": {} - '@babel/template@7.29.7': + "@babel/template@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + "@babel/code-frame": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 - '@babel/traverse@7.29.7': + "@babel/traverse@7.29.7": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-globals": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + "@babel/types@7.29.7": dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 + "@babel/helper-string-parser": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 - '@bcoe/v8-coverage@0.2.3': {} + "@bcoe/v8-coverage@0.2.3": {} - '@biblionexus-foundation/scripture-utilities@0.0.7': + "@biblionexus-foundation/scripture-utilities@0.0.7": dependencies: - '@xmldom/xmldom': 0.9.10 + "@xmldom/xmldom": 0.9.10 - '@bugsnag/browser@7.25.0': + "@bugsnag/browser@7.25.0": dependencies: - '@bugsnag/core': 7.25.0 + "@bugsnag/core": 7.25.0 - '@bugsnag/core@7.25.0': + "@bugsnag/core@7.25.0": dependencies: - '@bugsnag/cuid': 3.2.2 - '@bugsnag/safe-json-stringify': 6.1.0 + "@bugsnag/cuid": 3.2.2 + "@bugsnag/safe-json-stringify": 6.1.0 error-stack-parser: 2.1.4 iserror: 0.0.2 stack-generator: 2.0.10 - '@bugsnag/cuid@3.2.2': {} + "@bugsnag/cuid@3.2.2": {} - '@bugsnag/js@7.25.0': + "@bugsnag/js@7.25.0": dependencies: - '@bugsnag/browser': 7.25.0 - '@bugsnag/node': 7.25.0 + "@bugsnag/browser": 7.25.0 + "@bugsnag/node": 7.25.0 - '@bugsnag/node@7.25.0': + "@bugsnag/node@7.25.0": dependencies: - '@bugsnag/core': 7.25.0 + "@bugsnag/core": 7.25.0 byline: 5.0.0 error-stack-parser: 2.1.4 iserror: 0.0.2 pump: 3.0.4 stack-generator: 2.0.10 - '@bugsnag/safe-json-stringify@6.1.0': {} + "@bugsnag/safe-json-stringify@6.1.0": {} - '@colors/colors@1.5.0': {} + "@colors/colors@1.5.0": {} - '@compodoc/compodoc@1.2.1(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(typescript@5.9.3)(vis-data@8.0.4(uuid@8.3.2)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))': + "@compodoc/compodoc@1.2.1(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(typescript@5.9.3)(vis-data@8.0.4(uuid@8.3.2)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))": dependencies: - '@angular-devkit/schematics': 21.1.0(chokidar@5.0.0) - '@babel/core': 7.28.6 - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) - '@babel/preset-env': 7.28.6(@babel/core@7.28.6) - '@compodoc/live-server': 1.2.3 - '@compodoc/ngd-transformer': 2.1.3 - '@polka/send-type': 0.5.2 + "@angular-devkit/schematics": 21.1.0(chokidar@5.0.0) + "@babel/core": 7.28.6 + "@babel/plugin-transform-private-methods": 7.28.6(@babel/core@7.28.6) + "@babel/preset-env": 7.28.6(@babel/core@7.28.6) + "@compodoc/live-server": 1.2.3 + "@compodoc/ngd-transformer": 2.1.3 + "@polka/send-type": 0.5.2 body-parser: 2.3.0 bootstrap.native: 5.1.10 cheerio: 1.1.2 @@ -11490,7 +13439,7 @@ snapshots: uuid: 11.1.0 vis-network: 10.1.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@11.1.0)(vis-data@8.0.4(uuid@8.3.2)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)) transitivePeerDependencies: - - '@egjs/hammerjs' + - "@egjs/hammerjs" - component-emitter - keycharm - supports-color @@ -11498,7 +13447,7 @@ snapshots: - vis-data - vis-util - '@compodoc/live-server@1.2.3': + "@compodoc/live-server@1.2.3": dependencies: chokidar: 3.6.0 colors: 1.4.0 @@ -11517,235 +13466,235 @@ snapshots: transitivePeerDependencies: - supports-color - '@compodoc/ngd-core@2.1.1': + "@compodoc/ngd-core@2.1.1": dependencies: ansi-colors: 4.1.3 fancy-log: 2.0.0 typescript: 5.9.3 - '@compodoc/ngd-transformer@2.1.3': + "@compodoc/ngd-transformer@2.1.3": dependencies: - '@aduh95/viz.js': 3.4.0 - '@compodoc/ngd-core': 2.1.1 + "@aduh95/viz.js": 3.4.0 + "@compodoc/ngd-core": 2.1.1 dot: 2.0.0-beta.1 fs-extra: 11.3.5 - '@cspotcode/source-map-support@0.8.1': + "@cspotcode/source-map-support@0.8.1": dependencies: - '@jridgewell/trace-mapping': 0.3.9 + "@jridgewell/trace-mapping": 0.3.9 - '@discoveryjs/json-ext@0.5.7': {} + "@discoveryjs/json-ext@0.5.7": {} - '@discoveryjs/json-ext@0.6.3': {} + "@discoveryjs/json-ext@0.6.3": {} - '@egjs/hammerjs@2.0.17': + "@egjs/hammerjs@2.0.17": dependencies: - '@types/hammerjs': 2.0.46 + "@types/hammerjs": 2.0.46 - '@emnapi/core@1.10.0': + "@emnapi/core@1.10.0": dependencies: - '@emnapi/wasi-threads': 1.2.1 + "@emnapi/wasi-threads": 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': + "@emnapi/runtime@1.10.0": dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.1': + "@emnapi/wasi-threads@1.2.1": dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.71.0': + "@es-joy/jsdoccomment@0.71.0": dependencies: - '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.61.0 + "@types/estree": 1.0.9 + "@typescript-eslint/types": 8.61.0 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 6.6.0 - '@esbuild/aix-ppc64@0.27.2': + "@esbuild/aix-ppc64@0.27.2": optional: true - '@esbuild/aix-ppc64@0.28.0': + "@esbuild/aix-ppc64@0.28.0": optional: true - '@esbuild/android-arm64@0.27.2': + "@esbuild/android-arm64@0.27.2": optional: true - '@esbuild/android-arm64@0.28.0': + "@esbuild/android-arm64@0.28.0": optional: true - '@esbuild/android-arm@0.27.2': + "@esbuild/android-arm@0.27.2": optional: true - '@esbuild/android-arm@0.28.0': + "@esbuild/android-arm@0.28.0": optional: true - '@esbuild/android-x64@0.27.2': + "@esbuild/android-x64@0.27.2": optional: true - '@esbuild/android-x64@0.28.0': + "@esbuild/android-x64@0.28.0": optional: true - '@esbuild/darwin-arm64@0.27.2': + "@esbuild/darwin-arm64@0.27.2": optional: true - '@esbuild/darwin-arm64@0.28.0': + "@esbuild/darwin-arm64@0.28.0": optional: true - '@esbuild/darwin-x64@0.27.2': + "@esbuild/darwin-x64@0.27.2": optional: true - '@esbuild/darwin-x64@0.28.0': + "@esbuild/darwin-x64@0.28.0": optional: true - '@esbuild/freebsd-arm64@0.27.2': + "@esbuild/freebsd-arm64@0.27.2": optional: true - '@esbuild/freebsd-arm64@0.28.0': + "@esbuild/freebsd-arm64@0.28.0": optional: true - '@esbuild/freebsd-x64@0.27.2': + "@esbuild/freebsd-x64@0.27.2": optional: true - '@esbuild/freebsd-x64@0.28.0': + "@esbuild/freebsd-x64@0.28.0": optional: true - '@esbuild/linux-arm64@0.27.2': + "@esbuild/linux-arm64@0.27.2": optional: true - '@esbuild/linux-arm64@0.28.0': + "@esbuild/linux-arm64@0.28.0": optional: true - '@esbuild/linux-arm@0.27.2': + "@esbuild/linux-arm@0.27.2": optional: true - '@esbuild/linux-arm@0.28.0': + "@esbuild/linux-arm@0.28.0": optional: true - '@esbuild/linux-ia32@0.27.2': + "@esbuild/linux-ia32@0.27.2": optional: true - '@esbuild/linux-ia32@0.28.0': + "@esbuild/linux-ia32@0.28.0": optional: true - '@esbuild/linux-loong64@0.27.2': + "@esbuild/linux-loong64@0.27.2": optional: true - '@esbuild/linux-loong64@0.28.0': + "@esbuild/linux-loong64@0.28.0": optional: true - '@esbuild/linux-mips64el@0.27.2': + "@esbuild/linux-mips64el@0.27.2": optional: true - '@esbuild/linux-mips64el@0.28.0': + "@esbuild/linux-mips64el@0.28.0": optional: true - '@esbuild/linux-ppc64@0.27.2': + "@esbuild/linux-ppc64@0.27.2": optional: true - '@esbuild/linux-ppc64@0.28.0': + "@esbuild/linux-ppc64@0.28.0": optional: true - '@esbuild/linux-riscv64@0.27.2': + "@esbuild/linux-riscv64@0.27.2": optional: true - '@esbuild/linux-riscv64@0.28.0': + "@esbuild/linux-riscv64@0.28.0": optional: true - '@esbuild/linux-s390x@0.27.2': + "@esbuild/linux-s390x@0.27.2": optional: true - '@esbuild/linux-s390x@0.28.0': + "@esbuild/linux-s390x@0.28.0": optional: true - '@esbuild/linux-x64@0.27.2': + "@esbuild/linux-x64@0.27.2": optional: true - '@esbuild/linux-x64@0.28.0': + "@esbuild/linux-x64@0.28.0": optional: true - '@esbuild/netbsd-arm64@0.27.2': + "@esbuild/netbsd-arm64@0.27.2": optional: true - '@esbuild/netbsd-arm64@0.28.0': + "@esbuild/netbsd-arm64@0.28.0": optional: true - '@esbuild/netbsd-x64@0.27.2': + "@esbuild/netbsd-x64@0.27.2": optional: true - '@esbuild/netbsd-x64@0.28.0': + "@esbuild/netbsd-x64@0.28.0": optional: true - '@esbuild/openbsd-arm64@0.27.2': + "@esbuild/openbsd-arm64@0.27.2": optional: true - '@esbuild/openbsd-arm64@0.28.0': + "@esbuild/openbsd-arm64@0.28.0": optional: true - '@esbuild/openbsd-x64@0.27.2': + "@esbuild/openbsd-x64@0.27.2": optional: true - '@esbuild/openbsd-x64@0.28.0': + "@esbuild/openbsd-x64@0.28.0": optional: true - '@esbuild/openharmony-arm64@0.27.2': + "@esbuild/openharmony-arm64@0.27.2": optional: true - '@esbuild/openharmony-arm64@0.28.0': + "@esbuild/openharmony-arm64@0.28.0": optional: true - '@esbuild/sunos-x64@0.27.2': + "@esbuild/sunos-x64@0.27.2": optional: true - '@esbuild/sunos-x64@0.28.0': + "@esbuild/sunos-x64@0.28.0": optional: true - '@esbuild/win32-arm64@0.27.2': + "@esbuild/win32-arm64@0.27.2": optional: true - '@esbuild/win32-arm64@0.28.0': + "@esbuild/win32-arm64@0.28.0": optional: true - '@esbuild/win32-ia32@0.27.2': + "@esbuild/win32-ia32@0.27.2": optional: true - '@esbuild/win32-ia32@0.28.0': + "@esbuild/win32-ia32@0.28.0": optional: true - '@esbuild/win32-x64@0.27.2': + "@esbuild/win32-x64@0.27.2": optional: true - '@esbuild/win32-x64@0.28.0': + "@esbuild/win32-x64@0.28.0": optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': + "@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))": dependencies: eslint: 9.39.4(jiti@1.21.7) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} + "@eslint-community/regexpp@4.12.2": {} - '@eslint/config-array@0.21.2': + "@eslint/config-array@0.21.2": dependencies: - '@eslint/object-schema': 2.1.7 + "@eslint/object-schema": 2.1.7 debug: 4.4.3 minimatch: 3.1.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + "@eslint/config-helpers@0.4.2": dependencies: - '@eslint/core': 0.17.0 + "@eslint/core": 0.17.0 - '@eslint/core@0.17.0': + "@eslint/core@0.17.0": dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 - '@eslint/eslintrc@3.3.5': + "@eslint/eslintrc@3.3.5": dependencies: ajv: 6.15.0 debug: 4.4.3 @@ -11759,180 +13708,180 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.4': {} + "@eslint/js@9.39.4": {} - '@eslint/object-schema@2.1.7': {} + "@eslint/object-schema@2.1.7": {} - '@eslint/plugin-kit@0.4.1': + "@eslint/plugin-kit@0.4.1": dependencies: - '@eslint/core': 0.17.0 + "@eslint/core": 0.17.0 levn: 0.4.1 - '@gar/promise-retry@1.0.3': {} + "@gar/promise-retry@1.0.3": {} - '@gfx/zopfli@1.0.15': + "@gfx/zopfli@1.0.15": dependencies: base64-js: 1.5.1 - '@hapi/hoek@9.3.0': {} + "@hapi/hoek@9.3.0": {} - '@hapi/topo@5.1.0': + "@hapi/topo@5.1.0": dependencies: - '@hapi/hoek': 9.3.0 + "@hapi/hoek": 9.3.0 - '@hono/node-server@1.19.15(hono@4.12.30)': + "@hono/node-server@1.19.15(hono@4.12.30)": dependencies: hono: 4.12.30 - '@humanfs/core@0.19.2': + "@humanfs/core@0.19.2": dependencies: - '@humanfs/types': 0.15.0 + "@humanfs/types": 0.15.0 - '@humanfs/node@0.16.8': + "@humanfs/node@0.16.8": dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 + "@humanfs/core": 0.19.2 + "@humanfs/types": 0.15.0 + "@humanwhocodes/retry": 0.4.3 - '@humanfs/types@0.15.0': {} + "@humanfs/types@0.15.0": {} - '@humanwhocodes/module-importer@1.0.1': {} + "@humanwhocodes/module-importer@1.0.1": {} - '@humanwhocodes/retry@0.4.3': {} + "@humanwhocodes/retry@0.4.3": {} - '@inquirer/ansi@1.0.2': {} + "@inquirer/ansi@1.0.2": {} - '@inquirer/checkbox@4.3.2(@types/node@22.19.21)': + "@inquirer/checkbox@4.3.2(@types/node@22.19.21)": dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@22.19.21) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/confirm@5.1.14(@types/node@22.19.21)': + "@inquirer/confirm@5.1.14(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/confirm@5.1.21(@types/node@22.19.21)': + "@inquirer/confirm@5.1.21(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/core@10.3.2(@types/node@22.19.21)': + "@inquirer/core@10.3.2(@types/node@22.19.21)": dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/ansi": 1.0.2 + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@22.19.21) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/editor@4.2.23(@types/node@22.19.21)': + "@inquirer/editor@4.2.23(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/external-editor': 1.0.3(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/external-editor": 1.0.3(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/expand@4.0.23(@types/node@22.19.21)': + "@inquirer/expand@4.0.23(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/external-editor@1.0.3(@types/node@22.19.21)': + "@inquirer/external-editor@1.0.3(@types/node@22.19.21)": dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/figures@1.0.15': {} + "@inquirer/figures@1.0.15": {} - '@inquirer/input@4.3.1(@types/node@22.19.21)': + "@inquirer/input@4.3.1(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/number@3.0.23(@types/node@22.19.21)': + "@inquirer/number@3.0.23(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/password@4.0.23(@types/node@22.19.21)': + "@inquirer/password@4.0.23(@types/node@22.19.21)": dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 - - '@inquirer/prompts@7.8.2(@types/node@22.19.21)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@22.19.21) - '@inquirer/confirm': 5.1.21(@types/node@22.19.21) - '@inquirer/editor': 4.2.23(@types/node@22.19.21) - '@inquirer/expand': 4.0.23(@types/node@22.19.21) - '@inquirer/input': 4.3.1(@types/node@22.19.21) - '@inquirer/number': 3.0.23(@types/node@22.19.21) - '@inquirer/password': 4.0.23(@types/node@22.19.21) - '@inquirer/rawlist': 4.1.11(@types/node@22.19.21) - '@inquirer/search': 3.2.2(@types/node@22.19.21) - '@inquirer/select': 4.4.2(@types/node@22.19.21) + "@types/node": 22.19.21 + + "@inquirer/prompts@7.8.2(@types/node@22.19.21)": + dependencies: + "@inquirer/checkbox": 4.3.2(@types/node@22.19.21) + "@inquirer/confirm": 5.1.21(@types/node@22.19.21) + "@inquirer/editor": 4.2.23(@types/node@22.19.21) + "@inquirer/expand": 4.0.23(@types/node@22.19.21) + "@inquirer/input": 4.3.1(@types/node@22.19.21) + "@inquirer/number": 3.0.23(@types/node@22.19.21) + "@inquirer/password": 4.0.23(@types/node@22.19.21) + "@inquirer/rawlist": 4.1.11(@types/node@22.19.21) + "@inquirer/search": 3.2.2(@types/node@22.19.21) + "@inquirer/select": 4.4.2(@types/node@22.19.21) optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/rawlist@4.1.11(@types/node@22.19.21)': + "@inquirer/rawlist@4.1.11(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/search@3.2.2(@types/node@22.19.21)': + "@inquirer/search@3.2.2(@types/node@22.19.21)": dependencies: - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@22.19.21) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/select@4.4.2(@types/node@22.19.21)': + "@inquirer/select@4.4.2(@types/node@22.19.21)": dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@22.19.21) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@22.19.21) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@22.19.21) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@inquirer/type@3.0.10(@types/node@22.19.21)': + "@inquirer/type@3.0.10(@types/node@22.19.21)": optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@isaacs/cliui@8.0.2': + "@isaacs/cliui@8.0.2": dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -11941,11 +13890,11 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': + "@isaacs/fs-minipass@4.0.1": dependencies: minipass: 7.1.3 - '@istanbuljs/load-nyc-config@1.1.0': + "@istanbuljs/load-nyc-config@1.1.0": dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -11953,26 +13902,26 @@ snapshots: js-yaml: 3.15.0 resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.6': {} + "@istanbuljs/schema@0.1.6": {} - '@jest/console@30.4.1': + "@jest/console@30.4.1": dependencies: - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 chalk: 4.1.2 jest-message-util: 30.4.1 jest-util: 30.4.1 slash: 3.0.0 - '@jest/core@30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3))': + "@jest/core@30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3))": dependencies: - '@jest/console': 30.4.1 - '@jest/pattern': 30.4.0 - '@jest/reporters': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/console": 30.4.1 + "@jest/pattern": 30.4.0 + "@jest/reporters": 30.4.1 + "@jest/test-result": 30.4.1 + "@jest/transform": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 @@ -12000,68 +13949,68 @@ snapshots: - supports-color - ts-node - '@jest/create-cache-key-function@30.4.1': + "@jest/create-cache-key-function@30.4.1": dependencies: - '@jest/types': 30.4.1 + "@jest/types": 30.4.1 - '@jest/diff-sequences@30.4.0': {} + "@jest/diff-sequences@30.4.0": {} - '@jest/environment@30.4.1': + "@jest/environment@30.4.1": dependencies: - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/fake-timers": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 jest-mock: 30.4.1 - '@jest/expect-utils@29.7.0': + "@jest/expect-utils@29.7.0": dependencies: jest-get-type: 29.6.3 - '@jest/expect-utils@30.4.1': + "@jest/expect-utils@30.4.1": dependencies: - '@jest/get-type': 30.1.0 + "@jest/get-type": 30.1.0 - '@jest/expect@30.4.1': + "@jest/expect@30.4.1": dependencies: expect: 30.4.1 jest-snapshot: 30.4.1 transitivePeerDependencies: - supports-color - '@jest/fake-timers@30.4.1': + "@jest/fake-timers@30.4.1": dependencies: - '@jest/types': 30.4.1 - '@sinonjs/fake-timers': 15.4.0 - '@types/node': 22.19.21 + "@jest/types": 30.4.1 + "@sinonjs/fake-timers": 15.4.0 + "@types/node": 22.19.21 jest-message-util: 30.4.1 jest-mock: 30.4.1 jest-util: 30.4.1 - '@jest/get-type@30.1.0': {} + "@jest/get-type@30.1.0": {} - '@jest/globals@30.4.1': + "@jest/globals@30.4.1": dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1 - '@jest/types': 30.4.1 + "@jest/environment": 30.4.1 + "@jest/expect": 30.4.1 + "@jest/types": 30.4.1 jest-mock: 30.4.1 transitivePeerDependencies: - supports-color - '@jest/pattern@30.4.0': + "@jest/pattern@30.4.0": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 jest-regex-util: 30.4.0 - '@jest/reporters@30.4.1': + "@jest/reporters@30.4.1": dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 22.19.21 + "@bcoe/v8-coverage": 0.2.3 + "@jest/console": 30.4.1 + "@jest/test-result": 30.4.1 + "@jest/transform": 30.4.1 + "@jest/types": 30.4.1 + "@jridgewell/trace-mapping": 0.3.31 + "@types/node": 22.19.21 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -12081,46 +14030,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.3': + "@jest/schemas@29.6.3": dependencies: - '@sinclair/typebox': 0.27.10 + "@sinclair/typebox": 0.27.10 - '@jest/schemas@30.4.1': + "@jest/schemas@30.4.1": dependencies: - '@sinclair/typebox': 0.34.49 + "@sinclair/typebox": 0.34.49 - '@jest/snapshot-utils@30.4.1': + "@jest/snapshot-utils@30.4.1": dependencies: - '@jest/types': 30.4.1 + "@jest/types": 30.4.1 chalk: 4.1.2 graceful-fs: 4.2.11 natural-compare: 1.4.0 - '@jest/source-map@30.0.1': + "@jest/source-map@30.0.1": dependencies: - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/trace-mapping": 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@30.4.1': + "@jest/test-result@30.4.1": dependencies: - '@jest/console': 30.4.1 - '@jest/types': 30.4.1 - '@types/istanbul-lib-coverage': 2.0.6 + "@jest/console": 30.4.1 + "@jest/types": 30.4.1 + "@types/istanbul-lib-coverage": 2.0.6 collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@30.4.1': + "@jest/test-sequencer@30.4.1": dependencies: - '@jest/test-result': 30.4.1 + "@jest/test-result": 30.4.1 graceful-fs: 4.2.11 jest-haste-map: 30.4.1 slash: 3.0.0 - '@jest/transform@30.4.1': + "@jest/transform@30.4.1": dependencies: - '@babel/core': 7.29.7 - '@jest/types': 30.4.1 - '@jridgewell/trace-mapping': 0.3.31 + "@babel/core": 7.29.7 + "@jest/types": 30.4.1 + "@jridgewell/trace-mapping": 0.3.31 babel-plugin-istanbul: 7.0.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -12135,219 +14084,219 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': + "@jest/types@29.6.3": dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.21 - '@types/yargs': 17.0.35 + "@jest/schemas": 29.6.3 + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@types/node": 22.19.21 + "@types/yargs": 17.0.35 chalk: 4.1.2 - '@jest/types@30.4.1': + "@jest/types@30.4.1": dependencies: - '@jest/pattern': 30.4.0 - '@jest/schemas': 30.4.1 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.21 - '@types/yargs': 17.0.35 + "@jest/pattern": 30.4.0 + "@jest/schemas": 30.4.1 + "@types/istanbul-lib-coverage": 2.0.6 + "@types/istanbul-reports": 3.0.4 + "@types/node": 22.19.21 + "@types/yargs": 17.0.35 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.13': + "@jridgewell/gen-mapping@0.3.13": dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/sourcemap-codec": 1.5.5 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/remapping@2.3.5': + "@jridgewell/remapping@2.3.5": dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/source-map@0.3.11': + "@jridgewell/source-map@0.3.11": dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/gen-mapping": 0.3.13 + "@jridgewell/trace-mapping": 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} + "@jridgewell/sourcemap-codec@1.5.5": {} - '@jridgewell/trace-mapping@0.3.31': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@jridgewell/trace-mapping@0.3.9': + "@jridgewell/trace-mapping@0.3.9": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.5 - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + "@jsonjoy.com/base64@1.1.2(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/base64@17.67.0(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + "@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + "@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-core": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)": dependencies: tslib: 2.8.1 - '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-fsa": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-core": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-print": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-snapshot": 4.56.10(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + "@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)": dependencies: - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + "@jsonjoy.com/buffers": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/json-pack": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/util": 17.67.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + "@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)": dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + "@jsonjoy.com/base64": 1.1.2(tslib@2.8.1) + "@jsonjoy.com/buffers": 1.2.1(tslib@2.8.1) + "@jsonjoy.com/codegen": 1.0.0(tslib@2.8.1) + "@jsonjoy.com/json-pointer": 1.0.2(tslib@2.8.1) + "@jsonjoy.com/util": 1.9.0(tslib@2.8.1) hyperdyperid: 1.2.0 thingies: 2.5.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)": dependencies: - '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + "@jsonjoy.com/base64": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/buffers": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/codegen": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/json-pointer": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/util": 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 thingies: 2.5.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + "@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)": dependencies: - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + "@jsonjoy.com/codegen": 1.0.0(tslib@2.8.1) + "@jsonjoy.com/util": 1.9.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)": dependencies: - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + "@jsonjoy.com/util": 17.67.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + "@jsonjoy.com/util@1.9.0(tslib@2.8.1)": dependencies: - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + "@jsonjoy.com/buffers": 1.2.1(tslib@2.8.1) + "@jsonjoy.com/codegen": 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': + "@jsonjoy.com/util@17.67.0(tslib@2.8.1)": dependencies: - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + "@jsonjoy.com/buffers": 17.67.0(tslib@2.8.1) + "@jsonjoy.com/codegen": 17.67.0(tslib@2.8.1) tslib: 2.8.1 - '@leichtgewicht/ip-codec@2.0.5': {} + "@leichtgewicht/ip-codec@2.0.5": {} - '@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@22.19.21))(@types/node@22.19.21)(listr2@9.0.1)': + "@listr2/prompt-adapter-inquirer@3.0.1(@inquirer/prompts@7.8.2(@types/node@22.19.21))(@types/node@22.19.21)(listr2@9.0.1)": dependencies: - '@inquirer/prompts': 7.8.2(@types/node@22.19.21) - '@inquirer/type': 3.0.10(@types/node@22.19.21) + "@inquirer/prompts": 7.8.2(@types/node@22.19.21) + "@inquirer/type": 3.0.10(@types/node@22.19.21) listr2: 9.0.1 transitivePeerDependencies: - - '@types/node' + - "@types/node" - '@lmdb/lmdb-darwin-arm64@3.4.2': + "@lmdb/lmdb-darwin-arm64@3.4.2": optional: true - '@lmdb/lmdb-darwin-x64@3.4.2': + "@lmdb/lmdb-darwin-x64@3.4.2": optional: true - '@lmdb/lmdb-linux-arm64@3.4.2': + "@lmdb/lmdb-linux-arm64@3.4.2": optional: true - '@lmdb/lmdb-linux-arm@3.4.2': + "@lmdb/lmdb-linux-arm@3.4.2": optional: true - '@lmdb/lmdb-linux-x64@3.4.2': + "@lmdb/lmdb-linux-x64@3.4.2": optional: true - '@lmdb/lmdb-win32-arm64@3.4.2': + "@lmdb/lmdb-win32-arm64@3.4.2": optional: true - '@lmdb/lmdb-win32-x64@3.4.2': + "@lmdb/lmdb-win32-x64@3.4.2": optional: true - '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@18.3.1)': + "@mdx-js/react@3.1.1(@types/react@19.2.17)(react@18.3.1)": dependencies: - '@types/mdx': 2.0.14 - '@types/react': 19.2.17 + "@types/mdx": 2.0.14 + "@types/react": 19.2.17 react: 18.3.1 - '@microsoft/signalr@8.0.17': + "@microsoft/signalr@8.0.17": dependencies: abort-controller: 3.0.0 eventsource: 2.0.2 @@ -12359,9 +14308,9 @@ snapshots: - encoding - utf-8-validate - '@modelcontextprotocol/sdk@1.26.0(zod@4.1.13)': + "@modelcontextprotocol/sdk@1.26.0(zod@4.1.13)": dependencies: - '@hono/node-server': 1.19.15(hono@4.12.30) + "@hono/node-server": 1.19.15(hono@4.12.30) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 @@ -12381,126 +14330,126 @@ snapshots: transitivePeerDependencies: - supports-color - '@mongodb-js/saslprep@1.4.11': + "@mongodb-js/saslprep@1.4.11": dependencies: sparse-bitfield: 3.0.3 optional: true - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4": optional: true - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + "@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4": optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + "@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4": optional: true - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + "@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4": optional: true - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + "@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4": optional: true - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + "@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4": optional: true - '@napi-rs/nice-android-arm-eabi@1.1.1': + "@napi-rs/nice-android-arm-eabi@1.1.1": optional: true - '@napi-rs/nice-android-arm64@1.1.1': + "@napi-rs/nice-android-arm64@1.1.1": optional: true - '@napi-rs/nice-darwin-arm64@1.1.1': + "@napi-rs/nice-darwin-arm64@1.1.1": optional: true - '@napi-rs/nice-darwin-x64@1.1.1': + "@napi-rs/nice-darwin-x64@1.1.1": optional: true - '@napi-rs/nice-freebsd-x64@1.1.1': + "@napi-rs/nice-freebsd-x64@1.1.1": optional: true - '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + "@napi-rs/nice-linux-arm-gnueabihf@1.1.1": optional: true - '@napi-rs/nice-linux-arm64-gnu@1.1.1': + "@napi-rs/nice-linux-arm64-gnu@1.1.1": optional: true - '@napi-rs/nice-linux-arm64-musl@1.1.1': + "@napi-rs/nice-linux-arm64-musl@1.1.1": optional: true - '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + "@napi-rs/nice-linux-ppc64-gnu@1.1.1": optional: true - '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + "@napi-rs/nice-linux-riscv64-gnu@1.1.1": optional: true - '@napi-rs/nice-linux-s390x-gnu@1.1.1': + "@napi-rs/nice-linux-s390x-gnu@1.1.1": optional: true - '@napi-rs/nice-linux-x64-gnu@1.1.1': + "@napi-rs/nice-linux-x64-gnu@1.1.1": optional: true - '@napi-rs/nice-linux-x64-musl@1.1.1': + "@napi-rs/nice-linux-x64-musl@1.1.1": optional: true - '@napi-rs/nice-openharmony-arm64@1.1.1': + "@napi-rs/nice-openharmony-arm64@1.1.1": optional: true - '@napi-rs/nice-win32-arm64-msvc@1.1.1': + "@napi-rs/nice-win32-arm64-msvc@1.1.1": optional: true - '@napi-rs/nice-win32-ia32-msvc@1.1.1': + "@napi-rs/nice-win32-ia32-msvc@1.1.1": optional: true - '@napi-rs/nice-win32-x64-msvc@1.1.1': + "@napi-rs/nice-win32-x64-msvc@1.1.1": optional: true - '@napi-rs/nice@1.1.1': + "@napi-rs/nice@1.1.1": optionalDependencies: - '@napi-rs/nice-android-arm-eabi': 1.1.1 - '@napi-rs/nice-android-arm64': 1.1.1 - '@napi-rs/nice-darwin-arm64': 1.1.1 - '@napi-rs/nice-darwin-x64': 1.1.1 - '@napi-rs/nice-freebsd-x64': 1.1.1 - '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 - '@napi-rs/nice-linux-arm64-gnu': 1.1.1 - '@napi-rs/nice-linux-arm64-musl': 1.1.1 - '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 - '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 - '@napi-rs/nice-linux-s390x-gnu': 1.1.1 - '@napi-rs/nice-linux-x64-gnu': 1.1.1 - '@napi-rs/nice-linux-x64-musl': 1.1.1 - '@napi-rs/nice-openharmony-arm64': 1.1.1 - '@napi-rs/nice-win32-arm64-msvc': 1.1.1 - '@napi-rs/nice-win32-ia32-msvc': 1.1.1 - '@napi-rs/nice-win32-x64-msvc': 1.1.1 + "@napi-rs/nice-android-arm-eabi": 1.1.1 + "@napi-rs/nice-android-arm64": 1.1.1 + "@napi-rs/nice-darwin-arm64": 1.1.1 + "@napi-rs/nice-darwin-x64": 1.1.1 + "@napi-rs/nice-freebsd-x64": 1.1.1 + "@napi-rs/nice-linux-arm-gnueabihf": 1.1.1 + "@napi-rs/nice-linux-arm64-gnu": 1.1.1 + "@napi-rs/nice-linux-arm64-musl": 1.1.1 + "@napi-rs/nice-linux-ppc64-gnu": 1.1.1 + "@napi-rs/nice-linux-riscv64-gnu": 1.1.1 + "@napi-rs/nice-linux-s390x-gnu": 1.1.1 + "@napi-rs/nice-linux-x64-gnu": 1.1.1 + "@napi-rs/nice-linux-x64-musl": 1.1.1 + "@napi-rs/nice-openharmony-arm64": 1.1.1 + "@napi-rs/nice-win32-arm64-msvc": 1.1.1 + "@napi-rs/nice-win32-ia32-msvc": 1.1.1 + "@napi-rs/nice-win32-x64-msvc": 1.1.1 optional: true - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + "@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)": dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + "@emnapi/core": 1.10.0 + "@emnapi/runtime": 1.10.0 + "@tybys/wasm-util": 0.10.2 optional: true - '@ngneat/transloco-locale@4.1.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3))(rxjs@7.8.2)': + "@ngneat/transloco-locale@4.1.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3))(rxjs@7.8.2)": dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@ngneat/transloco': 4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@ngneat/transloco": 4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3) rxjs: 7.8.2 tslib: 2.8.1 - '@ngneat/transloco-utils@3.0.5(typescript@5.9.3)': + "@ngneat/transloco-utils@3.0.5(typescript@5.9.3)": dependencies: cosmiconfig: 8.3.6(typescript@5.9.3) tslib: 2.8.1 transitivePeerDependencies: - typescript - '@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3)': + "@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3)": dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@ngneat/transloco-utils': 3.0.5(typescript@5.9.3) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@ngneat/transloco-utils": 3.0.5(typescript@5.9.3) flat: 5.0.2 fs-extra: 11.3.5 glob: 13.0.6 @@ -12512,28 +14461,28 @@ snapshots: transitivePeerDependencies: - typescript - '@ngtools/webpack@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))': + "@ngtools/webpack@20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))": dependencies: - '@angular/compiler-cli': 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) + "@angular/compiler-cli": 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) typescript: 5.9.3 webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) - '@nodable/entities@2.2.0': + "@nodable/entities@2.2.0": optional: true - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.20.1 - '@npmcli/agent@4.0.2': + "@npmcli/agent@4.0.2": dependencies: agent-base: 7.1.4 http-proxy-agent: 7.0.2 @@ -12543,14 +14492,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@npmcli/fs@5.0.0': + "@npmcli/fs@5.0.0": dependencies: semver: 7.8.4 - '@npmcli/git@7.0.2': + "@npmcli/git@7.0.2": dependencies: - '@gar/promise-retry': 1.0.3 - '@npmcli/promise-spawn': 9.0.1 + "@gar/promise-retry": 1.0.3 + "@npmcli/promise-spawn": 9.0.1 ini: 6.0.0 lru-cache: 11.5.1 npm-pick-manifest: 11.0.3 @@ -12558,16 +14507,16 @@ snapshots: semver: 7.8.4 which: 6.0.1 - '@npmcli/installed-package-contents@4.0.0': + "@npmcli/installed-package-contents@4.0.0": dependencies: npm-bundled: 5.0.0 npm-normalize-package-bin: 5.0.0 - '@npmcli/node-gyp@5.0.0': {} + "@npmcli/node-gyp@5.0.0": {} - '@npmcli/package-json@7.0.5': + "@npmcli/package-json@7.0.5": dependencies: - '@npmcli/git': 7.0.2 + "@npmcli/git": 7.0.2 glob: 13.0.6 hosted-git-info: 9.0.3 json-parse-even-better-errors: 5.0.0 @@ -12575,354 +14524,350 @@ snapshots: semver: 7.8.4 spdx-expression-parse: 4.0.0 - '@npmcli/promise-spawn@9.0.1': + "@npmcli/promise-spawn@9.0.1": dependencies: which: 6.0.1 - '@npmcli/redact@4.0.0': {} + "@npmcli/redact@4.0.0": {} - '@npmcli/run-script@10.0.4': + "@npmcli/run-script@10.0.4": dependencies: - '@npmcli/node-gyp': 5.0.0 - '@npmcli/package-json': 7.0.5 - '@npmcli/promise-spawn': 9.0.1 + "@npmcli/node-gyp": 5.0.0 + "@npmcli/package-json": 7.0.5 + "@npmcli/promise-spawn": 9.0.1 node-gyp: 12.4.0 proc-log: 6.1.0 - '@panva/asn1.js@1.0.0': {} + "@panva/asn1.js@1.0.0": {} - '@parcel/watcher-android-arm64@2.5.6': + "@parcel/watcher-android-arm64@2.5.6": optional: true - '@parcel/watcher-darwin-arm64@2.5.6': + "@parcel/watcher-darwin-arm64@2.5.6": optional: true - '@parcel/watcher-darwin-x64@2.5.6': + "@parcel/watcher-darwin-x64@2.5.6": optional: true - '@parcel/watcher-freebsd-x64@2.5.6': + "@parcel/watcher-freebsd-x64@2.5.6": optional: true - '@parcel/watcher-linux-arm-glibc@2.5.6': + "@parcel/watcher-linux-arm-glibc@2.5.6": optional: true - '@parcel/watcher-linux-arm-musl@2.5.6': + "@parcel/watcher-linux-arm-musl@2.5.6": optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.6': + "@parcel/watcher-linux-arm64-glibc@2.5.6": optional: true - '@parcel/watcher-linux-arm64-musl@2.5.6': + "@parcel/watcher-linux-arm64-musl@2.5.6": optional: true - '@parcel/watcher-linux-x64-glibc@2.5.6': + "@parcel/watcher-linux-x64-glibc@2.5.6": optional: true - '@parcel/watcher-linux-x64-musl@2.5.6': + "@parcel/watcher-linux-x64-musl@2.5.6": optional: true - '@parcel/watcher-win32-arm64@2.5.6': + "@parcel/watcher-win32-arm64@2.5.6": optional: true - '@parcel/watcher-win32-ia32@2.5.6': + "@parcel/watcher-win32-ia32@2.5.6": optional: true - '@parcel/watcher-win32-x64@2.5.6': + "@parcel/watcher-win32-x64@2.5.6": optional: true - '@parcel/watcher@2.5.6': + "@parcel/watcher@2.5.6": dependencies: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 picomatch: 4.0.4 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.6 - '@parcel/watcher-darwin-arm64': 2.5.6 - '@parcel/watcher-darwin-x64': 2.5.6 - '@parcel/watcher-freebsd-x64': 2.5.6 - '@parcel/watcher-linux-arm-glibc': 2.5.6 - '@parcel/watcher-linux-arm-musl': 2.5.6 - '@parcel/watcher-linux-arm64-glibc': 2.5.6 - '@parcel/watcher-linux-arm64-musl': 2.5.6 - '@parcel/watcher-linux-x64-glibc': 2.5.6 - '@parcel/watcher-linux-x64-musl': 2.5.6 - '@parcel/watcher-win32-arm64': 2.5.6 - '@parcel/watcher-win32-ia32': 2.5.6 - '@parcel/watcher-win32-x64': 2.5.6 + "@parcel/watcher-android-arm64": 2.5.6 + "@parcel/watcher-darwin-arm64": 2.5.6 + "@parcel/watcher-darwin-x64": 2.5.6 + "@parcel/watcher-freebsd-x64": 2.5.6 + "@parcel/watcher-linux-arm-glibc": 2.5.6 + "@parcel/watcher-linux-arm-musl": 2.5.6 + "@parcel/watcher-linux-arm64-glibc": 2.5.6 + "@parcel/watcher-linux-arm64-musl": 2.5.6 + "@parcel/watcher-linux-x64-glibc": 2.5.6 + "@parcel/watcher-linux-x64-musl": 2.5.6 + "@parcel/watcher-win32-arm64": 2.5.6 + "@parcel/watcher-win32-ia32": 2.5.6 + "@parcel/watcher-win32-x64": 2.5.6 optional: true - '@pkgjs/parseargs@0.11.0': + "@pkgjs/parseargs@0.11.0": optional: true - '@pkgr/core@0.3.6': {} + "@pkgr/core@0.3.6": {} - '@playwright/test@1.60.0': + "@playwright/test@1.60.0": dependencies: playwright: 1.60.0 - '@polka/send-type@0.5.2': {} + "@polka/send-type@0.5.2": {} - '@polka/url@0.5.0': {} + "@polka/url@0.5.0": {} - '@polka/url@1.0.0-next.29': {} + "@polka/url@1.0.0-next.29": {} - '@rollup/rollup-android-arm-eabi@4.59.0': + "@rollup/rollup-android-arm-eabi@4.59.0": optional: true - '@rollup/rollup-android-arm64@4.59.0': + "@rollup/rollup-android-arm64@4.59.0": optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + "@rollup/rollup-darwin-arm64@4.59.0": optional: true - '@rollup/rollup-darwin-x64@4.59.0': + "@rollup/rollup-darwin-x64@4.59.0": optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + "@rollup/rollup-freebsd-arm64@4.59.0": optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + "@rollup/rollup-freebsd-x64@4.59.0": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + "@rollup/rollup-linux-arm-gnueabihf@4.59.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + "@rollup/rollup-linux-arm-musleabihf@4.59.0": optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + "@rollup/rollup-linux-arm64-gnu@4.59.0": optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + "@rollup/rollup-linux-arm64-musl@4.59.0": optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + "@rollup/rollup-linux-loong64-gnu@4.59.0": optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + "@rollup/rollup-linux-loong64-musl@4.59.0": optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + "@rollup/rollup-linux-ppc64-gnu@4.59.0": optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + "@rollup/rollup-linux-ppc64-musl@4.59.0": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + "@rollup/rollup-linux-riscv64-gnu@4.59.0": optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + "@rollup/rollup-linux-riscv64-musl@4.59.0": optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + "@rollup/rollup-linux-s390x-gnu@4.59.0": optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + "@rollup/rollup-linux-x64-gnu@4.59.0": optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + "@rollup/rollup-linux-x64-musl@4.59.0": optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + "@rollup/rollup-openbsd-x64@4.59.0": optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + "@rollup/rollup-openharmony-arm64@4.59.0": optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + "@rollup/rollup-win32-arm64-msvc@4.59.0": optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + "@rollup/rollup-win32-ia32-msvc@4.59.0": optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + "@rollup/rollup-win32-x64-gnu@4.59.0": optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + "@rollup/rollup-win32-x64-msvc@4.59.0": optional: true - '@rtsao/scc@1.1.0': {} + "@rtsao/scc@1.1.0": {} - '@schematics/angular@20.3.28(chokidar@5.0.0)': + "@schematics/angular@20.3.28(chokidar@5.0.0)": dependencies: - '@angular-devkit/core': 20.3.28(chokidar@5.0.0) - '@angular-devkit/schematics': 20.3.28(chokidar@5.0.0) + "@angular-devkit/core": 20.3.28(chokidar@5.0.0) + "@angular-devkit/schematics": 20.3.28(chokidar@5.0.0) jsonc-parser: 3.3.1 transitivePeerDependencies: - chokidar - '@sideway/address@4.1.5': + "@sideway/address@4.1.5": dependencies: - '@hapi/hoek': 9.3.0 + "@hapi/hoek": 9.3.0 - '@sideway/formula@3.0.1': {} + "@sideway/formula@3.0.1": {} - '@sideway/pinpoint@2.0.0': {} + "@sideway/pinpoint@2.0.0": {} - '@sigstore/bundle@4.0.0': + "@sigstore/bundle@4.0.0": dependencies: - '@sigstore/protobuf-specs': 0.5.1 + "@sigstore/protobuf-specs": 0.5.1 - '@sigstore/core@3.2.1': {} + "@sigstore/core@3.2.1": {} - '@sigstore/protobuf-specs@0.5.1': {} + "@sigstore/protobuf-specs@0.5.1": {} - '@sigstore/sign@4.1.1': + "@sigstore/sign@4.1.1": dependencies: - '@gar/promise-retry': 1.0.3 - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 + "@gar/promise-retry": 1.0.3 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.2.1 + "@sigstore/protobuf-specs": 0.5.1 make-fetch-happen: 15.0.6 proc-log: 6.1.0 transitivePeerDependencies: - supports-color - '@sigstore/tuf@4.0.2': + "@sigstore/tuf@4.0.2": dependencies: - '@sigstore/protobuf-specs': 0.5.1 + "@sigstore/protobuf-specs": 0.5.1 tuf-js: 4.1.0 transitivePeerDependencies: - supports-color - '@sigstore/verify@3.1.1': + "@sigstore/verify@3.1.1": dependencies: - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.2.1 + "@sigstore/protobuf-specs": 0.5.1 - '@sillsdev/lynx-delta@0.2.4': + "@sillsdev/lynx-delta@0.2.4": dependencies: - '@sillsdev/lynx': 0.3.5 + "@sillsdev/lynx": 0.3.5 lodash-es: 4.18.1 quill-delta: 5.1.0 uuid: 11.1.1 - '@sillsdev/lynx-punctuation-checker@0.2.0': + "@sillsdev/lynx-punctuation-checker@0.2.0": dependencies: - '@sillsdev/lynx': 0.3.5 + "@sillsdev/lynx": 0.3.5 rxjs: 7.8.2 - '@sillsdev/lynx@0.3.5': + "@sillsdev/lynx@0.3.5": dependencies: i18next: 23.16.8 rxjs: 7.8.2 - '@sillsdev/machine@2.4.2': - dependencies: - mnemonist: 0.38.5 - - '@sillsdev/scripture@1.4.1': {} + "@sillsdev/scripture@1.4.1": {} - '@sinclair/typebox@0.27.10': {} + "@sinclair/typebox@0.27.10": {} - '@sinclair/typebox@0.34.49': {} + "@sinclair/typebox@0.34.49": {} - '@sinonjs/commons@3.0.1': + "@sinonjs/commons@3.0.1": dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@15.4.0': + "@sinonjs/fake-timers@15.4.0": dependencies: - '@sinonjs/commons': 3.0.1 + "@sinonjs/commons": 3.0.1 - '@smithy/core@3.24.7': + "@smithy/core@3.24.7": dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.4 + "@aws-crypto/crc32": 5.2.0 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@smithy/credential-provider-imds@4.3.9': + "@smithy/credential-provider-imds@4.3.9": dependencies: - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@smithy/fetch-http-handler@5.4.7': + "@smithy/fetch-http-handler@5.4.7": dependencies: - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@smithy/is-array-buffer@2.2.0': + "@smithy/is-array-buffer@2.2.0": dependencies: tslib: 2.8.1 optional: true - '@smithy/node-http-handler@4.7.8': + "@smithy/node-http-handler@4.7.8": dependencies: - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@smithy/signature-v4@5.4.7': + "@smithy/signature-v4@5.4.7": dependencies: - '@smithy/core': 3.24.7 - '@smithy/types': 4.14.4 + "@smithy/core": 3.24.7 + "@smithy/types": 4.14.4 tslib: 2.8.1 optional: true - '@smithy/types@4.14.4': + "@smithy/types@4.14.4": dependencies: tslib: 2.8.1 optional: true - '@smithy/util-buffer-from@2.2.0': + "@smithy/util-buffer-from@2.2.0": dependencies: - '@smithy/is-array-buffer': 2.2.0 + "@smithy/is-array-buffer": 2.2.0 tslib: 2.8.1 optional: true - '@smithy/util-utf8@2.3.0': + "@smithy/util-utf8@2.3.0": dependencies: - '@smithy/util-buffer-from': 2.2.0 + "@smithy/util-buffer-from": 2.2.0 tslib: 2.8.1 optional: true - '@socket.io/component-emitter@3.1.2': {} + "@socket.io/component-emitter@3.1.2": {} - '@storybook/addon-docs@10.2.14(@types/react@19.2.17)(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))': + "@storybook/addon-docs@10.2.14(@types/react@19.2.17)(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))": dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@18.3.1) - '@storybook/csf-plugin': 10.2.14(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) - '@storybook/icons': 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim': 10.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + "@mdx-js/react": 3.1.1(@types/react@19.2.17)(react@18.3.1) + "@storybook/csf-plugin": 10.2.14(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) + "@storybook/icons": 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@storybook/react-dom-shim": 10.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.3.0 transitivePeerDependencies: - - '@types/react' + - "@types/react" - esbuild - rollup - vite - webpack - '@storybook/addon-links@10.2.14(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + "@storybook/addon-links@10.2.14(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))": dependencies: - '@storybook/global': 5.0.0 + "@storybook/global": 5.0.0 storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: react: 18.3.1 - '@storybook/angular@10.2.14(f5f2b6b7ebb4dbb75e74fabc2de15a6d)': - dependencies: - '@angular-devkit/architect': 0.2102.15(chokidar@5.0.0) - '@angular-devkit/build-angular': 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@swc/core@1.15.41)(@types/node@22.19.21)(chokidar@5.0.0)(html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(jest@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)))(jiti@1.21.7)(karma@6.4.4)(typescript@5.9.3)(yaml@2.9.0) - '@angular-devkit/core': 21.2.15(chokidar@5.0.0) - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/compiler': 20.3.25 - '@angular/compiler-cli': 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/platform-browser': 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/platform-browser-dynamic': 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))) - '@storybook/builder-webpack5': 10.2.14(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3) - '@storybook/global': 5.0.0 + "@storybook/angular@10.2.14(f5f2b6b7ebb4dbb75e74fabc2de15a6d)": + dependencies: + "@angular-devkit/architect": 0.2102.15(chokidar@5.0.0) + "@angular-devkit/build-angular": 20.3.28(@angular/compiler-cli@20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/service-worker@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@swc/core@1.15.41)(@types/node@22.19.21)(chokidar@5.0.0)(html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)))(jest@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)))(jiti@1.21.7)(karma@6.4.4)(typescript@5.9.3)(yaml@2.9.0) + "@angular-devkit/core": 21.2.15(chokidar@5.0.0) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/compiler": 20.3.25 + "@angular/compiler-cli": 20.3.25(@angular/compiler@20.3.25)(typescript@5.9.3) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/platform-browser": 20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/platform-browser-dynamic": 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.3.25)(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))) + "@storybook/builder-webpack5": 10.2.14(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3) + "@storybook/global": 5.0.0 rxjs: 7.8.2 storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) telejson: 8.0.0 @@ -12931,15 +14876,15 @@ snapshots: typescript: 5.9.3 webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) optionalDependencies: - '@angular/animations': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) - '@angular/cli': 20.3.28(@types/node@22.19.21)(chokidar@5.0.0) + "@angular/animations": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)) + "@angular/cli": 20.3.28(@types/node@22.19.21)(chokidar@5.0.0) zone.js: 0.15.1 transitivePeerDependencies: - - '@minify-html/node' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@swc/html' + - "@minify-html/node" + - "@rspack/core" + - "@swc/core" + - "@swc/css" + - "@swc/html" - clean-css - cssnano - csso @@ -12950,9 +14895,9 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@10.2.14(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)': + "@storybook/builder-webpack5@10.2.14(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3)": dependencies: - '@storybook/core-webpack': 10.2.14(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + "@storybook/core-webpack": 10.2.14(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 css-loader: 7.1.4(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)) @@ -12971,11 +14916,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@minify-html/node' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@swc/html' + - "@minify-html/node" + - "@rspack/core" + - "@swc/core" + - "@swc/css" + - "@swc/html" - clean-css - cssnano - csso @@ -12986,12 +14931,12 @@ snapshots: - uglify-js - webpack-cli - '@storybook/core-webpack@10.2.14(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + "@storybook/core-webpack@10.2.14(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))": dependencies: storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ts-dedent: 2.3.0 - '@storybook/csf-plugin@10.2.14(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))': + "@storybook/csf-plugin@10.2.14(esbuild@0.28.0)(rollup@4.59.0)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12))": dependencies: storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) unplugin: 2.3.11 @@ -13001,28 +14946,28 @@ snapshots: vite: 7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0) webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) - '@storybook/global@5.0.0': {} + "@storybook/global@5.0.0": {} - '@storybook/icons@2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + "@storybook/icons@2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/react-dom-shim@10.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + "@storybook/react-dom-shim@10.2.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))": dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/test-runner@0.24.4(@types/node@22.19.21)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3))': + "@storybook/test-runner@0.24.4(@types/node@22.19.21)(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3))": dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/template': 7.29.7 - '@babel/types': 7.29.7 - '@jest/types': 30.4.1 - '@swc/core': 1.15.41 - '@swc/jest': 0.2.39(@swc/core@1.15.41) + "@babel/core": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 + "@jest/types": 30.4.1 + "@swc/core": 1.15.41 + "@swc/jest": 0.2.39(@swc/core@1.15.41) expect-playwright: 0.8.0 jest: 30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) jest-circus: 30.4.2 @@ -13039,8 +14984,8 @@ snapshots: storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) uuid: 8.3.2 transitivePeerDependencies: - - '@swc/helpers' - - '@types/node' + - "@swc/helpers" + - "@types/node" - babel-plugin-macros - debug - esbuild-register @@ -13048,350 +14993,350 @@ snapshots: - supports-color - ts-node - '@swc/core-darwin-arm64@1.15.41': + "@swc/core-darwin-arm64@1.15.41": optional: true - '@swc/core-darwin-x64@1.15.41': + "@swc/core-darwin-x64@1.15.41": optional: true - '@swc/core-linux-arm-gnueabihf@1.15.41': + "@swc/core-linux-arm-gnueabihf@1.15.41": optional: true - '@swc/core-linux-arm64-gnu@1.15.41': + "@swc/core-linux-arm64-gnu@1.15.41": optional: true - '@swc/core-linux-arm64-musl@1.15.41': + "@swc/core-linux-arm64-musl@1.15.41": optional: true - '@swc/core-linux-ppc64-gnu@1.15.41': + "@swc/core-linux-ppc64-gnu@1.15.41": optional: true - '@swc/core-linux-s390x-gnu@1.15.41': + "@swc/core-linux-s390x-gnu@1.15.41": optional: true - '@swc/core-linux-x64-gnu@1.15.41': + "@swc/core-linux-x64-gnu@1.15.41": optional: true - '@swc/core-linux-x64-musl@1.15.41': + "@swc/core-linux-x64-musl@1.15.41": optional: true - '@swc/core-win32-arm64-msvc@1.15.41': + "@swc/core-win32-arm64-msvc@1.15.41": optional: true - '@swc/core-win32-ia32-msvc@1.15.41': + "@swc/core-win32-ia32-msvc@1.15.41": optional: true - '@swc/core-win32-x64-msvc@1.15.41': + "@swc/core-win32-x64-msvc@1.15.41": optional: true - '@swc/core@1.15.41': + "@swc/core@1.15.41": dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.26 + "@swc/counter": 0.1.3 + "@swc/types": 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.41 - '@swc/core-darwin-x64': 1.15.41 - '@swc/core-linux-arm-gnueabihf': 1.15.41 - '@swc/core-linux-arm64-gnu': 1.15.41 - '@swc/core-linux-arm64-musl': 1.15.41 - '@swc/core-linux-ppc64-gnu': 1.15.41 - '@swc/core-linux-s390x-gnu': 1.15.41 - '@swc/core-linux-x64-gnu': 1.15.41 - '@swc/core-linux-x64-musl': 1.15.41 - '@swc/core-win32-arm64-msvc': 1.15.41 - '@swc/core-win32-ia32-msvc': 1.15.41 - '@swc/core-win32-x64-msvc': 1.15.41 - - '@swc/counter@0.1.3': {} - - '@swc/jest@0.2.39(@swc/core@1.15.41)': - dependencies: - '@jest/create-cache-key-function': 30.4.1 - '@swc/core': 1.15.41 - '@swc/counter': 0.1.3 + "@swc/core-darwin-arm64": 1.15.41 + "@swc/core-darwin-x64": 1.15.41 + "@swc/core-linux-arm-gnueabihf": 1.15.41 + "@swc/core-linux-arm64-gnu": 1.15.41 + "@swc/core-linux-arm64-musl": 1.15.41 + "@swc/core-linux-ppc64-gnu": 1.15.41 + "@swc/core-linux-s390x-gnu": 1.15.41 + "@swc/core-linux-x64-gnu": 1.15.41 + "@swc/core-linux-x64-musl": 1.15.41 + "@swc/core-win32-arm64-msvc": 1.15.41 + "@swc/core-win32-ia32-msvc": 1.15.41 + "@swc/core-win32-x64-msvc": 1.15.41 + + "@swc/counter@0.1.3": {} + + "@swc/jest@0.2.39(@swc/core@1.15.41)": + dependencies: + "@jest/create-cache-key-function": 30.4.1 + "@swc/core": 1.15.41 + "@swc/counter": 0.1.3 jsonc-parser: 3.3.1 - '@swc/types@0.1.26': + "@swc/types@0.1.26": dependencies: - '@swc/counter': 0.1.3 + "@swc/counter": 0.1.3 - '@testing-library/dom@10.4.1': + "@testing-library/dom@10.4.1": dependencies: - '@babel/code-frame': 7.29.7 - '@babel/runtime': 7.29.7 - '@types/aria-query': 5.0.4 + "@babel/code-frame": 7.29.7 + "@babel/runtime": 7.29.7 + "@types/aria-query": 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.9.1': + "@testing-library/jest-dom@6.9.1": dependencies: - '@adobe/css-tools': 4.5.0 + "@adobe/css-tools": 4.5.0 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + "@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)": dependencies: - '@testing-library/dom': 10.4.1 + "@testing-library/dom": 10.4.1 - '@thednp/event-listener@2.0.15': {} + "@thednp/event-listener@2.0.15": {} - '@thednp/position-observer@1.1.3': + "@thednp/position-observer@1.1.3": dependencies: - '@thednp/shorty': 2.0.14 + "@thednp/shorty": 2.0.14 - '@thednp/shorty@2.0.14': {} + "@thednp/shorty@2.0.14": {} - '@ts-morph/common@0.28.1': + "@ts-morph/common@0.28.1": dependencies: minimatch: 10.2.5 path-browserify: 1.0.1 tinyglobby: 0.2.17 - '@tsconfig/node10@1.0.12': {} + "@tsconfig/node10@1.0.12": {} - '@tsconfig/node12@1.0.11': {} + "@tsconfig/node12@1.0.11": {} - '@tsconfig/node14@1.0.3': {} + "@tsconfig/node14@1.0.3": {} - '@tsconfig/node16@1.0.4': {} + "@tsconfig/node16@1.0.4": {} - '@tufjs/canonical-json@2.0.0': {} + "@tufjs/canonical-json@2.0.0": {} - '@tufjs/models@4.1.0': + "@tufjs/models@4.1.0": dependencies: - '@tufjs/canonical-json': 2.0.0 + "@tufjs/canonical-json": 2.0.0 minimatch: 10.2.5 - '@tybys/wasm-util@0.10.2': + "@tybys/wasm-util@0.10.2": dependencies: tslib: 2.8.1 optional: true - '@types/aria-query@5.0.4': {} + "@types/aria-query@5.0.4": {} - '@types/auth0-js@9.21.6': {} + "@types/auth0-js@9.21.6": {} - '@types/babel__core@7.20.5': + "@types/babel__core@7.20.5": dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 + "@types/babel__generator": 7.27.0 + "@types/babel__template": 7.4.4 + "@types/babel__traverse": 7.28.0 - '@types/babel__generator@7.27.0': + "@types/babel__generator@7.27.0": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@types/babel__template@7.4.4': + "@types/babel__template@7.4.4": dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 - '@types/babel__traverse@7.28.0': + "@types/babel__traverse@7.28.0": dependencies: - '@babel/types': 7.29.7 + "@babel/types": 7.29.7 - '@types/body-parser@1.19.6': + "@types/body-parser@1.19.6": dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.19.21 + "@types/connect": 3.4.38 + "@types/node": 22.19.21 - '@types/bonjour@3.5.13': + "@types/bonjour@3.5.13": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/chai@5.2.3': + "@types/chai@5.2.3": dependencies: - '@types/deep-eql': 4.0.2 + "@types/deep-eql": 4.0.2 assertion-error: 2.0.1 - '@types/connect-history-api-fallback@1.5.4': + "@types/connect-history-api-fallback@1.5.4": dependencies: - '@types/express-serve-static-core': 4.19.7 - '@types/node': 22.19.21 + "@types/express-serve-static-core": 4.19.7 + "@types/node": 22.19.21 - '@types/connect@3.4.38': + "@types/connect@3.4.38": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/cors@2.8.19': + "@types/cors@2.8.19": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/deep-eql@4.0.2': {} + "@types/deep-eql@4.0.2": {} - '@types/eslint-scope@3.7.7': + "@types/eslint-scope@3.7.7": dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.9 + "@types/eslint": 9.6.1 + "@types/estree": 1.0.9 - '@types/eslint@9.6.1': + "@types/eslint@9.6.1": dependencies: - '@types/estree': 1.0.9 - '@types/json-schema': 7.0.15 + "@types/estree": 1.0.9 + "@types/json-schema": 7.0.15 - '@types/esrecurse@4.3.1': {} + "@types/esrecurse@4.3.1": {} - '@types/estree@1.0.8': {} + "@types/estree@1.0.8": {} - '@types/estree@1.0.9': {} + "@types/estree@1.0.9": {} - '@types/events@3.0.3': {} + "@types/events@3.0.3": {} - '@types/express-serve-static-core@4.19.7': + "@types/express-serve-static-core@4.19.7": dependencies: - '@types/node': 22.19.21 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.6 + "@types/node": 22.19.21 + "@types/qs": 6.14.0 + "@types/range-parser": 1.2.7 + "@types/send": 0.17.6 - '@types/express@4.17.25': + "@types/express@4.17.25": dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.10 + "@types/body-parser": 1.19.6 + "@types/express-serve-static-core": 4.19.7 + "@types/qs": 6.14.0 + "@types/serve-static": 1.15.10 - '@types/file-saver@2.0.7': {} + "@types/file-saver@2.0.7": {} - '@types/hammerjs@2.0.46': {} + "@types/hammerjs@2.0.46": {} - '@types/html-minifier-terser@6.1.0': {} + "@types/html-minifier-terser@6.1.0": {} - '@types/http-errors@2.0.5': {} + "@types/http-errors@2.0.5": {} - '@types/http-proxy@1.17.17': + "@types/http-proxy@1.17.17": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/istanbul-lib-coverage@2.0.6': {} + "@types/istanbul-lib-coverage@2.0.6": {} - '@types/istanbul-lib-report@3.0.3': + "@types/istanbul-lib-report@3.0.3": dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + "@types/istanbul-lib-coverage": 2.0.6 - '@types/istanbul-reports@3.0.4': + "@types/istanbul-reports@3.0.4": dependencies: - '@types/istanbul-lib-report': 3.0.3 + "@types/istanbul-lib-report": 3.0.3 - '@types/jasmine@3.10.19': {} + "@types/jasmine@3.10.19": {} - '@types/jasminewd2@2.0.13': + "@types/jasminewd2@2.0.13": dependencies: - '@types/jasmine': 3.10.19 + "@types/jasmine": 3.10.19 - '@types/jest@29.5.14': + "@types/jest@29.5.14": dependencies: expect: 29.7.0 pretty-format: 29.7.0 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/json5@0.0.29': {} + "@types/json5@0.0.29": {} - '@types/jsonwebtoken@8.5.9': + "@types/jsonwebtoken@8.5.9": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/lodash-es@4.17.12': + "@types/lodash-es@4.17.12": dependencies: - '@types/lodash': 4.17.24 + "@types/lodash": 4.17.24 - '@types/lodash@4.17.24': {} + "@types/lodash@4.17.24": {} - '@types/mdx@2.0.14': {} + "@types/mdx@2.0.14": {} - '@types/mime@1.3.5': {} + "@types/mime@1.3.5": {} - '@types/node-forge@1.3.14': + "@types/node-forge@1.3.14": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/node@22.19.21': + "@types/node@22.19.21": dependencies: undici-types: 6.21.0 - '@types/papaparse@5.5.2': + "@types/papaparse@5.5.2": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/qs@6.14.0': {} + "@types/qs@6.14.0": {} - '@types/range-parser@1.2.7': {} + "@types/range-parser@1.2.7": {} - '@types/react-dom@19.2.3(@types/react@19.2.17)': + "@types/react-dom@19.2.3(@types/react@19.2.17)": dependencies: - '@types/react': 19.2.17 + "@types/react": 19.2.17 - '@types/react@19.2.17': + "@types/react@19.2.17": dependencies: csstype: 3.2.3 - '@types/retry@0.12.2': {} + "@types/retry@0.12.2": {} - '@types/send@0.17.6': + "@types/send@0.17.6": dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.19.21 + "@types/mime": 1.3.5 + "@types/node": 22.19.21 - '@types/serve-index@1.9.4': + "@types/serve-index@1.9.4": dependencies: - '@types/express': 4.17.25 + "@types/express": 4.17.25 - '@types/serve-static@1.15.10': + "@types/serve-static@1.15.10": dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 22.19.21 - '@types/send': 0.17.6 + "@types/http-errors": 2.0.5 + "@types/node": 22.19.21 + "@types/send": 0.17.6 - '@types/sharedb@1.0.24': {} + "@types/sharedb@1.0.24": {} - '@types/sockjs@0.3.36': + "@types/sockjs@0.3.36": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/stack-utils@2.0.3': {} + "@types/stack-utils@2.0.3": {} - '@types/tinycolor2@1.4.6': {} + "@types/tinycolor2@1.4.6": {} - '@types/uuid@8.3.4': {} + "@types/uuid@8.3.4": {} - '@types/wait-on@5.3.4': + "@types/wait-on@5.3.4": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/webidl-conversions@7.0.3': {} + "@types/webidl-conversions@7.0.3": {} - '@types/whatwg-url@8.2.2': + "@types/whatwg-url@8.2.2": dependencies: - '@types/node': 22.19.21 - '@types/webidl-conversions': 7.0.3 + "@types/node": 22.19.21 + "@types/webidl-conversions": 7.0.3 - '@types/ws@8.18.1': + "@types/ws@8.18.1": dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 - '@types/yargs-parser@21.0.3': {} + "@types/yargs-parser@21.0.3": {} - '@types/yargs@17.0.35': + "@types/yargs@17.0.35": dependencies: - '@types/yargs-parser': 21.0.3 + "@types/yargs-parser": 21.0.3 - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.61.0 + "@eslint-community/regexpp": 4.12.2 + "@typescript-eslint/parser": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.61.0 + "@typescript-eslint/type-utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.61.0 eslint: 9.39.4(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 @@ -13400,41 +15345,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.61.0 + "@typescript-eslint/scope-manager": 8.61.0 + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/typescript-estree": 8.61.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.61.0 debug: 4.4.3 eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.61.0(typescript@5.9.3)': + "@typescript-eslint/project-service@8.61.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 + "@typescript-eslint/tsconfig-utils": 8.61.0(typescript@5.9.3) + "@typescript-eslint/types": 8.61.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.61.0': + "@typescript-eslint/scope-manager@8.61.0": dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/visitor-keys": 8.61.0 - '@typescript-eslint/tsconfig-utils@8.61.0(typescript@5.9.3)': + "@typescript-eslint/tsconfig-utils@8.61.0(typescript@5.9.3)": dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@typescript-eslint/type-utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/typescript-estree": 8.61.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.4(jiti@1.21.7) ts-api-utils: 2.5.0(typescript@5.9.3) @@ -13442,14 +15387,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.61.0': {} + "@typescript-eslint/types@8.61.0": {} - '@typescript-eslint/typescript-estree@8.61.0(typescript@5.9.3)': + "@typescript-eslint/typescript-estree@8.61.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/project-service': 8.61.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@5.9.3) - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/visitor-keys': 8.61.0 + "@typescript-eslint/project-service": 8.61.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.61.0(typescript@5.9.3) + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/visitor-keys": 8.61.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.4 @@ -13459,203 +15404,203 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)': + "@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3)": dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) + "@eslint-community/eslint-utils": 4.9.1(eslint@9.39.4(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.61.0 + "@typescript-eslint/types": 8.61.0 + "@typescript-eslint/typescript-estree": 8.61.0(typescript@5.9.3) eslint: 9.39.4(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.61.0': + "@typescript-eslint/visitor-keys@8.61.0": dependencies: - '@typescript-eslint/types': 8.61.0 + "@typescript-eslint/types": 8.61.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.1': {} + "@ungap/structured-clone@1.3.1": {} - '@unrs/resolver-binding-android-arm-eabi@1.12.2': + "@unrs/resolver-binding-android-arm-eabi@1.12.2": optional: true - '@unrs/resolver-binding-android-arm64@1.12.2': + "@unrs/resolver-binding-android-arm64@1.12.2": optional: true - '@unrs/resolver-binding-darwin-arm64@1.12.2': + "@unrs/resolver-binding-darwin-arm64@1.12.2": optional: true - '@unrs/resolver-binding-darwin-x64@1.12.2': + "@unrs/resolver-binding-darwin-x64@1.12.2": optional: true - '@unrs/resolver-binding-freebsd-x64@1.12.2': + "@unrs/resolver-binding-freebsd-x64@1.12.2": optional: true - '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + "@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2": optional: true - '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + "@unrs/resolver-binding-linux-arm-musleabihf@1.12.2": optional: true - '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + "@unrs/resolver-binding-linux-arm64-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + "@unrs/resolver-binding-linux-arm64-musl@1.12.2": optional: true - '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + "@unrs/resolver-binding-linux-loong64-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + "@unrs/resolver-binding-linux-loong64-musl@1.12.2": optional: true - '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + "@unrs/resolver-binding-linux-ppc64-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + "@unrs/resolver-binding-linux-riscv64-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + "@unrs/resolver-binding-linux-riscv64-musl@1.12.2": optional: true - '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + "@unrs/resolver-binding-linux-s390x-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + "@unrs/resolver-binding-linux-x64-gnu@1.12.2": optional: true - '@unrs/resolver-binding-linux-x64-musl@1.12.2': + "@unrs/resolver-binding-linux-x64-musl@1.12.2": optional: true - '@unrs/resolver-binding-openharmony-arm64@1.12.2': + "@unrs/resolver-binding-openharmony-arm64@1.12.2": optional: true - '@unrs/resolver-binding-wasm32-wasi@1.12.2': + "@unrs/resolver-binding-wasm32-wasi@1.12.2": dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + "@emnapi/core": 1.10.0 + "@emnapi/runtime": 1.10.0 + "@napi-rs/wasm-runtime": 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + "@unrs/resolver-binding-win32-arm64-msvc@1.12.2": optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + "@unrs/resolver-binding-win32-ia32-msvc@1.12.2": optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + "@unrs/resolver-binding-win32-x64-msvc@1.12.2": optional: true - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))': + "@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0))": dependencies: vite: 7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.48.0)(yaml@2.9.0) - '@vitest/expect@3.2.4': + "@vitest/expect@3.2.4": dependencies: - '@types/chai': 5.2.3 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 + "@types/chai": 5.2.3 + "@vitest/spy": 3.2.4 + "@vitest/utils": 3.2.4 chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/pretty-format@3.2.4': + "@vitest/pretty-format@3.2.4": dependencies: tinyrainbow: 2.0.0 - '@vitest/spy@3.2.4': + "@vitest/spy@3.2.4": dependencies: tinyspy: 4.0.4 - '@vitest/utils@3.2.4': + "@vitest/utils@3.2.4": dependencies: - '@vitest/pretty-format': 3.2.4 + "@vitest/pretty-format": 3.2.4 loupe: 3.2.1 tinyrainbow: 2.0.0 - '@webassemblyjs/ast@1.14.1': + "@webassemblyjs/ast@1.14.1": dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + "@webassemblyjs/helper-numbers": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + "@webassemblyjs/floating-point-hex-parser@1.13.2": {} - '@webassemblyjs/helper-api-error@1.13.2': {} + "@webassemblyjs/helper-api-error@1.13.2": {} - '@webassemblyjs/helper-buffer@1.14.1': {} + "@webassemblyjs/helper-buffer@1.14.1": {} - '@webassemblyjs/helper-numbers@1.13.2': + "@webassemblyjs/helper-numbers@1.13.2": dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 + "@webassemblyjs/floating-point-hex-parser": 1.13.2 + "@webassemblyjs/helper-api-error": 1.13.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + "@webassemblyjs/helper-wasm-bytecode@1.13.2": {} - '@webassemblyjs/helper-wasm-section@1.14.1': + "@webassemblyjs/helper-wasm-section@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/wasm-gen": 1.14.1 - '@webassemblyjs/ieee754@1.13.2': + "@webassemblyjs/ieee754@1.13.2": dependencies: - '@xtuc/ieee754': 1.2.0 + "@xtuc/ieee754": 1.2.0 - '@webassemblyjs/leb128@1.13.2': + "@webassemblyjs/leb128@1.13.2": dependencies: - '@xtuc/long': 4.2.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/utf8@1.13.2': {} + "@webassemblyjs/utf8@1.13.2": {} - '@webassemblyjs/wasm-edit@1.14.1': + "@webassemblyjs/wasm-edit@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/helper-wasm-section": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-opt": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + "@webassemblyjs/wast-printer": 1.14.1 - '@webassemblyjs/wasm-gen@1.14.1': + "@webassemblyjs/wasm-gen@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 - '@webassemblyjs/wasm-opt@1.14.1': + "@webassemblyjs/wasm-opt@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 - '@webassemblyjs/wasm-parser@1.14.1': + "@webassemblyjs/wasm-parser@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-api-error": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 - '@webassemblyjs/wast-printer@1.14.1': + "@webassemblyjs/wast-printer@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 + "@webassemblyjs/ast": 1.14.1 + "@xtuc/long": 4.2.2 - '@xmldom/xmldom@0.9.10': {} + "@xmldom/xmldom@0.9.10": {} - '@xtuc/ieee754@1.2.0': {} + "@xtuc/ieee754@1.2.0": {} - '@xtuc/long@4.2.2': {} + "@xtuc/long@4.2.2": {} - '@yarnpkg/lockfile@1.1.0': {} + "@yarnpkg/lockfile@1.1.0": {} abbrev@1.0.9: {} @@ -13764,20 +15709,20 @@ snapshots: algoliasearch@5.35.0: dependencies: - '@algolia/abtesting': 1.1.0 - '@algolia/client-abtesting': 5.35.0 - '@algolia/client-analytics': 5.35.0 - '@algolia/client-common': 5.35.0 - '@algolia/client-insights': 5.35.0 - '@algolia/client-personalization': 5.35.0 - '@algolia/client-query-suggestions': 5.35.0 - '@algolia/client-search': 5.35.0 - '@algolia/ingestion': 1.35.0 - '@algolia/monitoring': 1.35.0 - '@algolia/recommend': 5.35.0 - '@algolia/requester-browser-xhr': 5.35.0 - '@algolia/requester-fetch': 5.35.0 - '@algolia/requester-node-http': 5.35.0 + "@algolia/abtesting": 1.1.0 + "@algolia/client-abtesting": 5.35.0 + "@algolia/client-analytics": 5.35.0 + "@algolia/client-common": 5.35.0 + "@algolia/client-insights": 5.35.0 + "@algolia/client-personalization": 5.35.0 + "@algolia/client-query-suggestions": 5.35.0 + "@algolia/client-search": 5.35.0 + "@algolia/ingestion": 1.35.0 + "@algolia/monitoring": 1.35.0 + "@algolia/recommend": 5.35.0 + "@algolia/requester-browser-xhr": 5.35.0 + "@algolia/requester-fetch": 5.35.0 + "@algolia/requester-node-http": 5.35.0 amdefine@1.0.1: optional: true @@ -13788,8 +15733,8 @@ snapshots: angular-split@16.2.1(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2): dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 @@ -13955,9 +15900,9 @@ snapshots: babel-jest@30.4.1(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.7 - '@jest/transform': 30.4.1 - '@types/babel__core': 7.20.5 + "@babel/core": 7.29.7 + "@jest/transform": 30.4.1 + "@types/babel__core": 7.20.5 babel-plugin-istanbul: 7.0.1 babel-preset-jest: 30.4.0(@babel/core@7.29.7) chalk: 4.1.2 @@ -13968,13 +15913,13 @@ snapshots: babel-loader@10.0.0(@babel/core@7.28.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@babel/core': 7.28.3 + "@babel/core": 7.28.3 find-up: 5.0.0 webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@babel/core': 7.29.7 + "@babel/core": 7.29.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 @@ -13983,9 +15928,9 @@ snapshots: babel-plugin-istanbul@7.0.1: dependencies: - '@babel/helper-plugin-utils': 7.29.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.6 + "@babel/helper-plugin-utils": 7.29.7 + "@istanbuljs/load-nyc-config": 1.1.0 + "@istanbuljs/schema": 0.1.6 istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: @@ -13993,78 +15938,78 @@ snapshots: babel-plugin-jest-hoist@30.4.0: dependencies: - '@types/babel__core': 7.20.5 + "@types/babel__core": 7.20.5 babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.28.3): dependencies: - '@babel/compat-data': 7.29.7 - '@babel/core': 7.28.3 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.3) + "@babel/compat-data": 7.29.7 + "@babel/core": 7.28.3 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.3) semver: 6.3.1 transitivePeerDependencies: - supports-color babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.28.6): dependencies: - '@babel/compat-data': 7.29.7 - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.6) + "@babel/compat-data": 7.29.7 + "@babel/core": 7.28.6 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.6) semver: 6.3.1 transitivePeerDependencies: - supports-color babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.3): dependencies: - '@babel/core': 7.28.3 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.3) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.6) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.28.3): dependencies: - '@babel/core': 7.28.3 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.3) + "@babel/core": 7.28.3 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.3) transitivePeerDependencies: - supports-color babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.28.6): dependencies: - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.28.6) + "@babel/core": 7.28.6 + "@babel/helper-define-polyfill-provider": 0.6.8(@babel/core@7.28.6) transitivePeerDependencies: - supports-color babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + "@babel/core": 7.29.7 + "@babel/plugin-syntax-async-generators": 7.8.4(@babel/core@7.29.7) + "@babel/plugin-syntax-bigint": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-class-properties": 7.12.13(@babel/core@7.29.7) + "@babel/plugin-syntax-class-static-block": 7.14.5(@babel/core@7.29.7) + "@babel/plugin-syntax-import-attributes": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.29.7) + "@babel/plugin-syntax-json-strings": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-logical-assignment-operators": 7.10.4(@babel/core@7.29.7) + "@babel/plugin-syntax-nullish-coalescing-operator": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-numeric-separator": 7.10.4(@babel/core@7.29.7) + "@babel/plugin-syntax-object-rest-spread": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-optional-catch-binding": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-optional-chaining": 7.8.3(@babel/core@7.29.7) + "@babel/plugin-syntax-private-property-in-object": 7.14.5(@babel/core@7.29.7) + "@babel/plugin-syntax-top-level-await": 7.14.5(@babel/core@7.29.7) babel-preset-jest@30.4.0(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.7 + "@babel/core": 7.29.7 babel-plugin-jest-hoist: 30.4.0 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) @@ -14147,9 +16092,9 @@ snapshots: bootstrap.native@5.1.10: dependencies: - '@thednp/event-listener': 2.0.15 - '@thednp/position-observer': 1.1.3 - '@thednp/shorty': 2.0.14 + "@thednp/event-listener": 2.0.15 + "@thednp/position-observer": 1.1.3 + "@thednp/shorty": 2.0.14 bowser@2.14.1: {} @@ -14211,7 +16156,7 @@ snapshots: cacache@20.0.4: dependencies: - '@npmcli/fs': 5.0.0 + "@npmcli/fs": 5.0.0 fs-minipass: 3.0.3 glob: 13.0.6 lru-cache: 11.5.1 @@ -14739,7 +16684,7 @@ snapshots: dns-packet@5.6.1: dependencies: - '@leichtgewicht/ip-codec': 2.0.5 + "@leichtgewicht/ip-codec": 2.0.5 doctrine@2.1.0: dependencies: @@ -14873,9 +16818,9 @@ snapshots: engine.io@6.6.8: dependencies: - '@types/cors': 2.8.19 - '@types/node': 22.19.21 - '@types/ws': 8.18.1 + "@types/cors": 2.8.19 + "@types/node": 22.19.21 + "@types/ws": 8.18.1 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -15027,61 +16972,61 @@ snapshots: esbuild@0.27.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + "@esbuild/aix-ppc64": 0.27.2 + "@esbuild/android-arm": 0.27.2 + "@esbuild/android-arm64": 0.27.2 + "@esbuild/android-x64": 0.27.2 + "@esbuild/darwin-arm64": 0.27.2 + "@esbuild/darwin-x64": 0.27.2 + "@esbuild/freebsd-arm64": 0.27.2 + "@esbuild/freebsd-x64": 0.27.2 + "@esbuild/linux-arm": 0.27.2 + "@esbuild/linux-arm64": 0.27.2 + "@esbuild/linux-ia32": 0.27.2 + "@esbuild/linux-loong64": 0.27.2 + "@esbuild/linux-mips64el": 0.27.2 + "@esbuild/linux-ppc64": 0.27.2 + "@esbuild/linux-riscv64": 0.27.2 + "@esbuild/linux-s390x": 0.27.2 + "@esbuild/linux-x64": 0.27.2 + "@esbuild/netbsd-arm64": 0.27.2 + "@esbuild/netbsd-x64": 0.27.2 + "@esbuild/openbsd-arm64": 0.27.2 + "@esbuild/openbsd-x64": 0.27.2 + "@esbuild/openharmony-arm64": 0.27.2 + "@esbuild/sunos-x64": 0.27.2 + "@esbuild/win32-arm64": 0.27.2 + "@esbuild/win32-ia32": 0.27.2 + "@esbuild/win32-x64": 0.27.2 esbuild@0.28.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.28.0 - '@esbuild/android-arm': 0.28.0 - '@esbuild/android-arm64': 0.28.0 - '@esbuild/android-x64': 0.28.0 - '@esbuild/darwin-arm64': 0.28.0 - '@esbuild/darwin-x64': 0.28.0 - '@esbuild/freebsd-arm64': 0.28.0 - '@esbuild/freebsd-x64': 0.28.0 - '@esbuild/linux-arm': 0.28.0 - '@esbuild/linux-arm64': 0.28.0 - '@esbuild/linux-ia32': 0.28.0 - '@esbuild/linux-loong64': 0.28.0 - '@esbuild/linux-mips64el': 0.28.0 - '@esbuild/linux-ppc64': 0.28.0 - '@esbuild/linux-riscv64': 0.28.0 - '@esbuild/linux-s390x': 0.28.0 - '@esbuild/linux-x64': 0.28.0 - '@esbuild/netbsd-arm64': 0.28.0 - '@esbuild/netbsd-x64': 0.28.0 - '@esbuild/openbsd-arm64': 0.28.0 - '@esbuild/openbsd-x64': 0.28.0 - '@esbuild/openharmony-arm64': 0.28.0 - '@esbuild/sunos-x64': 0.28.0 - '@esbuild/win32-arm64': 0.28.0 - '@esbuild/win32-ia32': 0.28.0 - '@esbuild/win32-x64': 0.28.0 + "@esbuild/aix-ppc64": 0.28.0 + "@esbuild/android-arm": 0.28.0 + "@esbuild/android-arm64": 0.28.0 + "@esbuild/android-x64": 0.28.0 + "@esbuild/darwin-arm64": 0.28.0 + "@esbuild/darwin-x64": 0.28.0 + "@esbuild/freebsd-arm64": 0.28.0 + "@esbuild/freebsd-x64": 0.28.0 + "@esbuild/linux-arm": 0.28.0 + "@esbuild/linux-arm64": 0.28.0 + "@esbuild/linux-ia32": 0.28.0 + "@esbuild/linux-loong64": 0.28.0 + "@esbuild/linux-mips64el": 0.28.0 + "@esbuild/linux-ppc64": 0.28.0 + "@esbuild/linux-riscv64": 0.28.0 + "@esbuild/linux-s390x": 0.28.0 + "@esbuild/linux-x64": 0.28.0 + "@esbuild/netbsd-arm64": 0.28.0 + "@esbuild/netbsd-x64": 0.28.0 + "@esbuild/openbsd-arm64": 0.28.0 + "@esbuild/openbsd-x64": 0.28.0 + "@esbuild/openharmony-arm64": 0.28.0 + "@esbuild/sunos-x64": 0.28.0 + "@esbuild/win32-arm64": 0.28.0 + "@esbuild/win32-ia32": 0.28.0 + "@esbuild/win32-x64": 0.28.0 escalade@3.2.0: {} @@ -15118,7 +17063,7 @@ snapshots: dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/parser": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.4(jiti@1.21.7) eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: @@ -15126,7 +17071,7 @@ snapshots: eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.4(jiti@1.21.7)): dependencies: - '@rtsao/scc': 1.1.0 + "@rtsao/scc": 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 @@ -15147,7 +17092,7 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/parser": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15155,7 +17100,7 @@ snapshots: eslint-plugin-jsdoc@60.8.3(eslint@9.39.4(jiti@1.21.7)): dependencies: - '@es-joy/jsdoccomment': 0.71.0 + "@es-joy/jsdoccomment": 0.71.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.3 @@ -15178,12 +17123,12 @@ snapshots: prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - '@types/eslint': 9.6.1 + "@types/eslint": 9.6.1 eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@1.21.7)) eslint-plugin-storybook@10.2.14(eslint@9.39.4(jiti@1.21.7))(storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + "@typescript-eslint/utils": 8.61.0(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.4(jiti@1.21.7) storybook: 10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: @@ -15202,8 +17147,8 @@ snapshots: eslint-scope@9.1.2: dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 + "@types/esrecurse": 4.3.1 + "@types/estree": 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -15215,18 +17160,18 @@ snapshots: eslint@9.39.4(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 + "@eslint-community/eslint-utils": 4.9.1(eslint@9.39.4(jiti@1.21.7)) + "@eslint-community/regexpp": 4.12.2 + "@eslint/config-array": 0.21.2 + "@eslint/config-helpers": 0.4.2 + "@eslint/core": 0.17.0 + "@eslint/eslintrc": 3.3.5 + "@eslint/js": 9.39.4 + "@eslint/plugin-kit": 0.4.1 + "@humanfs/node": 0.16.8 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.3 + "@types/estree": 1.0.9 ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -15356,7 +17301,7 @@ snapshots: expect@29.7.0: dependencies: - '@jest/expect-utils': 29.7.0 + "@jest/expect-utils": 29.7.0 jest-get-type: 29.6.3 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 @@ -15364,8 +17309,8 @@ snapshots: expect@30.4.1: dependencies: - '@jest/expect-utils': 30.4.1 - '@jest/get-type': 30.1.0 + "@jest/expect-utils": 30.4.1 + "@jest/get-type": 30.1.0 jest-matcher-utils: 30.4.1 jest-message-util: 30.4.1 jest-mock: 30.4.1 @@ -15461,8 +17406,8 @@ snapshots: fast-glob@3.3.3: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -15481,7 +17426,7 @@ snapshots: fast-xml-parser@5.7.3: dependencies: - '@nodable/entities': 2.2.0 + "@nodable/entities": 2.2.0 fast-xml-builder: 1.2.0 path-expression-matcher: 1.5.0 strnum: 2.4.0 @@ -15613,7 +17558,7 @@ snapshots: fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@babel/code-frame': 7.29.7 + "@babel/code-frame": 7.29.7 chalk: 4.1.2 chokidar: 4.0.3 cosmiconfig: 8.3.6(typescript@5.9.3) @@ -15815,7 +17760,7 @@ snapshots: gzipper@8.2.1: dependencies: - '@gfx/zopfli': 1.0.15 + "@gfx/zopfli": 1.0.15 commander: 12.1.0 simple-zstd: 1.4.2 @@ -15898,7 +17843,7 @@ snapshots: html-webpack-plugin@5.6.7(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@types/html-minifier-terser': 6.1.0 + "@types/html-minifier-terser": 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.18.1 pretty-error: 4.0.0 @@ -15969,19 +17914,19 @@ snapshots: http-proxy-middleware@2.0.10(@types/express@4.17.25): dependencies: - '@types/http-proxy': 1.17.17 + "@types/http-proxy": 1.17.17 http-proxy: 1.18.1(patch_hash=34942a089432d32a961a3881a83f7312b9558b049f7c21c0f9d77edec45bb625)(debug@4.4.3) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 optionalDependencies: - '@types/express': 4.17.25 + "@types/express": 4.17.25 transitivePeerDependencies: - debug http-proxy-middleware@3.0.5: dependencies: - '@types/http-proxy': 1.17.17 + "@types/http-proxy": 1.17.17 debug: 4.4.3 http-proxy: 1.18.1(patch_hash=34942a089432d32a961a3881a83f7312b9558b049f7c21c0f9d77edec45bb625)(debug@4.4.3) is-glob: 4.0.3 @@ -16024,11 +17969,11 @@ snapshots: i18next@23.16.8: dependencies: - '@babel/runtime': 7.29.7 + "@babel/runtime": 7.29.7 i18next@25.7.4(typescript@5.9.3): dependencies: - '@babel/runtime': 7.29.7 + "@babel/runtime": 7.29.7 optionalDependencies: typescript: 5.9.3 @@ -16313,8 +18258,8 @@ snapshots: istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.29.7 - '@istanbuljs/schema': 0.1.6 + "@babel/core": 7.29.7 + "@istanbuljs/schema": 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: @@ -16322,9 +18267,9 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 - '@istanbuljs/schema': 0.1.6 + "@babel/core": 7.29.7 + "@babel/parser": 7.29.7 + "@istanbuljs/schema": 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.8.4 transitivePeerDependencies: @@ -16365,7 +18310,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/trace-mapping": 0.3.31 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: @@ -16395,9 +18340,9 @@ snapshots: jackspeak@3.4.3: dependencies: - '@isaacs/cliui': 8.0.2 + "@isaacs/cliui": 8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + "@pkgjs/parseargs": 0.11.0 jasmine-core@3.9.0: {} @@ -16409,11 +18354,11 @@ snapshots: jest-circus@30.4.2: dependencies: - '@jest/environment': 30.4.1 - '@jest/expect': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/environment": 30.4.1 + "@jest/expect": 30.4.1 + "@jest/test-result": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 @@ -16435,9 +18380,9 @@ snapshots: jest-cli@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)): dependencies: - '@jest/core': 30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 + "@jest/core": 30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) + "@jest/test-result": 30.4.1 + "@jest/types": 30.4.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 @@ -16446,7 +18391,7 @@ snapshots: jest-validate: 30.4.1 yargs: 17.7.2 transitivePeerDependencies: - - '@types/node' + - "@types/node" - babel-plugin-macros - esbuild-register - supports-color @@ -16454,11 +18399,11 @@ snapshots: jest-config@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)): dependencies: - '@babel/core': 7.29.7 - '@jest/get-type': 30.1.0 - '@jest/pattern': 30.4.0 - '@jest/test-sequencer': 30.4.1 - '@jest/types': 30.4.1 + "@babel/core": 7.29.7 + "@jest/get-type": 30.1.0 + "@jest/pattern": 30.4.0 + "@jest/test-sequencer": 30.4.1 + "@jest/types": 30.4.1 babel-jest: 30.4.1(@babel/core@7.29.7) chalk: 4.1.2 ci-info: 4.4.0 @@ -16478,7 +18423,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 ts-node: 10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros @@ -16493,8 +18438,8 @@ snapshots: jest-diff@30.4.1: dependencies: - '@jest/diff-sequences': 30.4.0 - '@jest/get-type': 30.1.0 + "@jest/diff-sequences": 30.4.0 + "@jest/get-type": 30.1.0 chalk: 4.1.2 pretty-format: 30.4.1 @@ -16504,18 +18449,18 @@ snapshots: jest-each@30.4.1: dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 + "@jest/get-type": 30.1.0 + "@jest/types": 30.4.1 chalk: 4.1.2 jest-util: 30.4.1 pretty-format: 30.4.1 jest-environment-node@30.4.1: dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/environment": 30.4.1 + "@jest/fake-timers": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 jest-mock: 30.4.1 jest-util: 30.4.1 jest-validate: 30.4.1 @@ -16524,8 +18469,8 @@ snapshots: jest-haste-map@30.4.1: dependencies: - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -16546,7 +18491,7 @@ snapshots: jest-leak-detector@30.4.1: dependencies: - '@jest/get-type': 30.1.0 + "@jest/get-type": 30.1.0 pretty-format: 30.4.1 jest-matcher-utils@29.7.0: @@ -16558,16 +18503,16 @@ snapshots: jest-matcher-utils@30.4.1: dependencies: - '@jest/get-type': 30.1.0 + "@jest/get-type": 30.1.0 chalk: 4.1.2 jest-diff: 30.4.1 pretty-format: 30.4.1 jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.29.7 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 + "@babel/code-frame": 7.29.7 + "@jest/types": 29.6.3 + "@types/stack-utils": 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -16577,9 +18522,9 @@ snapshots: jest-message-util@30.4.1: dependencies: - '@babel/code-frame': 7.29.7 - '@jest/types': 30.4.1 - '@types/stack-utils': 2.0.3 + "@babel/code-frame": 7.29.7 + "@jest/types": 30.4.1 + "@types/stack-utils": 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 jest-util: 30.4.1 @@ -16590,8 +18535,8 @@ snapshots: jest-mock@30.4.1: dependencies: - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 jest-util: 30.4.1 jest-pnp-resolver@1.2.3(jest-resolve@30.4.1): @@ -16600,7 +18545,7 @@ snapshots: jest-process-manager@0.4.0: dependencies: - '@types/wait-on': 5.3.4 + "@types/wait-on": 5.3.4 chalk: 4.1.2 cwd: 0.10.0 exit: 0.1.2 @@ -16636,12 +18581,12 @@ snapshots: jest-runner@30.4.2: dependencies: - '@jest/console': 30.4.1 - '@jest/environment': 30.4.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/console": 30.4.1 + "@jest/environment": 30.4.1 + "@jest/test-result": 30.4.1 + "@jest/transform": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -16663,14 +18608,14 @@ snapshots: jest-runtime@30.4.2: dependencies: - '@jest/environment': 30.4.1 - '@jest/fake-timers': 30.4.1 - '@jest/globals': 30.4.1 - '@jest/source-map': 30.0.1 - '@jest/test-result': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/environment": 30.4.1 + "@jest/fake-timers": 30.4.1 + "@jest/globals": 30.4.1 + "@jest/source-map": 30.0.1 + "@jest/test-result": 30.4.1 + "@jest/transform": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -16694,16 +18639,16 @@ snapshots: jest-snapshot@30.4.1: dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/types': 7.29.7 - '@jest/expect-utils': 30.4.1 - '@jest/get-type': 30.1.0 - '@jest/snapshot-utils': 30.4.1 - '@jest/transform': 30.4.1 - '@jest/types': 30.4.1 + "@babel/core": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/plugin-syntax-jsx": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-syntax-typescript": 7.29.7(@babel/core@7.29.7) + "@babel/types": 7.29.7 + "@jest/expect-utils": 30.4.1 + "@jest/get-type": 30.1.0 + "@jest/snapshot-utils": 30.4.1 + "@jest/transform": 30.4.1 + "@jest/types": 30.4.1 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 expect: 30.4.1 @@ -16720,8 +18665,8 @@ snapshots: jest-util@29.7.0: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.19.21 + "@jest/types": 29.6.3 + "@types/node": 22.19.21 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16729,8 +18674,8 @@ snapshots: jest-util@30.4.1: dependencies: - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -16738,8 +18683,8 @@ snapshots: jest-validate@30.4.1: dependencies: - '@jest/get-type': 30.1.0 - '@jest/types': 30.4.1 + "@jest/get-type": 30.1.0 + "@jest/types": 30.4.1 camelcase: 6.3.0 chalk: 4.1.2 leven: 3.1.0 @@ -16758,9 +18703,9 @@ snapshots: jest-watcher@30.4.1: dependencies: - '@jest/test-result': 30.4.1 - '@jest/types': 30.4.1 - '@types/node': 22.19.21 + "@jest/test-result": 30.4.1 + "@jest/types": 30.4.1 + "@types/node": 22.19.21 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -16769,26 +18714,26 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.4.1: dependencies: - '@types/node': 22.19.21 - '@ungap/structured-clone': 1.3.1 + "@types/node": 22.19.21 + "@ungap/structured-clone": 1.3.1 jest-util: 30.4.1 merge-stream: 2.0.0 supports-color: 8.1.1 jest@30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)): dependencies: - '@jest/core': 30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) - '@jest/types': 30.4.1 + "@jest/core": 30.4.2(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) + "@jest/types": 30.4.1 import-local: 3.2.0 jest-cli: 30.4.2(@types/node@22.19.21)(ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3)) transitivePeerDependencies: - - '@types/node' + - "@types/node" - babel-plugin-macros - esbuild-register - supports-color @@ -16798,15 +18743,15 @@ snapshots: joi@17.13.4: dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 + "@hapi/hoek": 9.3.0 + "@hapi/topo": 5.1.0 + "@sideway/address": 4.1.5 + "@sideway/formula": 3.0.1 + "@sideway/pinpoint": 2.0.0 jose@2.0.7: dependencies: - '@panva/asn1.js': 1.0.0 + "@panva/asn1.js": 1.0.0 jose@6.2.3: {} @@ -16893,8 +18838,8 @@ snapshots: jwks-rsa@2.1.5: dependencies: - '@types/express': 4.17.25 - '@types/jsonwebtoken': 8.5.9 + "@types/express": 4.17.25 + "@types/jsonwebtoken": 8.5.9 debug: 4.4.3 jose: 2.0.7 limiter: 1.1.5 @@ -16972,7 +18917,7 @@ snapshots: karma@6.4.4: dependencies: - '@colors/colors': 1.5.0 + "@colors/colors": 1.5.0 body-parser: 1.20.6 braces: 3.0.3 chokidar: 3.6.0 @@ -17106,13 +19051,13 @@ snapshots: ordered-binary: 1.6.1 weak-lru-cache: 1.2.2 optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.4.2 - '@lmdb/lmdb-darwin-x64': 3.4.2 - '@lmdb/lmdb-linux-arm': 3.4.2 - '@lmdb/lmdb-linux-arm64': 3.4.2 - '@lmdb/lmdb-linux-x64': 3.4.2 - '@lmdb/lmdb-win32-arm64': 3.4.2 - '@lmdb/lmdb-win32-x64': 3.4.2 + "@lmdb/lmdb-darwin-arm64": 3.4.2 + "@lmdb/lmdb-darwin-x64": 3.4.2 + "@lmdb/lmdb-linux-arm": 3.4.2 + "@lmdb/lmdb-linux-arm64": 3.4.2 + "@lmdb/lmdb-linux-x64": 3.4.2 + "@lmdb/lmdb-win32-arm64": 3.4.2 + "@lmdb/lmdb-win32-x64": 3.4.2 optional: true loader-runner@4.3.2: {} @@ -17239,11 +19184,11 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/sourcemap-codec": 1.5.5 magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + "@jridgewell/sourcemap-codec": 1.5.5 make-dir@2.1.0: dependencies: @@ -17262,9 +19207,9 @@ snapshots: make-fetch-happen@15.0.6: dependencies: - '@gar/promise-retry': 1.0.3 - '@npmcli/agent': 4.0.2 - '@npmcli/redact': 4.0.0 + "@gar/promise-retry": 1.0.3 + "@npmcli/agent": 4.0.2 + "@npmcli/redact": 4.0.0 cacache: 20.0.4 http-cache-semantics: 4.2.0 minipass: 7.1.3 @@ -17287,7 +19232,7 @@ snapshots: matchit@1.1.0: dependencies: - '@arr/every': 1.0.1 + "@arr/every": 1.0.1 math-intrinsics@1.1.0: {} @@ -17301,16 +19246,16 @@ snapshots: memfs@4.56.10(tslib@2.8.1): dependencies: - '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) - '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + "@jsonjoy.com/fs-core": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-fsa": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-builtins": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-to-fsa": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-node-utils": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-print": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/fs-snapshot": 4.56.10(tslib@2.8.1) + "@jsonjoy.com/json-pack": 1.21.0(tslib@2.8.1) + "@jsonjoy.com/util": 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) thingies: 2.5.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) @@ -17422,13 +19367,9 @@ snapshots: mkdirp@1.0.4: {} - mnemonist@0.38.5: - dependencies: - obliterator: 2.0.5 - mongodb-connection-string-url@2.6.0: dependencies: - '@types/whatwg-url': 8.2.2 + "@types/whatwg-url": 8.2.2 whatwg-url: 11.0.0 mongodb@4.17.2: @@ -17437,8 +19378,8 @@ snapshots: mongodb-connection-string-url: 2.6.0 socks: 2.8.9 optionalDependencies: - '@aws-sdk/credential-providers': 3.1068.0 - '@mongodb-js/saslprep': 1.4.11 + "@aws-sdk/credential-providers": 3.1068.0 + "@mongodb-js/saslprep": 1.4.11 morgan@1.11.0: dependencies: @@ -17460,12 +19401,12 @@ snapshots: dependencies: node-gyp-build-optional-packages: 5.2.2 optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4 + "@msgpackr-extract/msgpackr-extract-darwin-arm64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-darwin-x64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-arm": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-arm64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-linux-x64": 3.0.4 + "@msgpackr-extract/msgpackr-extract-win32-x64": 3.0.4 optional: true msgpackr@1.12.1: @@ -17506,37 +19447,37 @@ snapshots: ng-circle-progress@1.7.1(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2): dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) rxjs: 7.8.2 tslib: 2.8.1 ngx-cookie-service@20.1.1(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)): dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 ngx-quill@28.0.2(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(quill@2.0.3)(rxjs@7.8.2): dependencies: - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) quill: 2.0.3 rxjs: 7.8.2 tslib: 2.8.1 ngx-transloco-markup-router-link@4.0.0(c3cef6d599be0cfca7d4c386200690f4): dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@angular/router': 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@angular/router": 20.3.25(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.3.25(@angular/animations@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) ngx-transloco-markup: 4.0.0(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3))(rxjs@7.8.2) tslib: 2.8.1 ngx-transloco-markup@4.0.0(@angular/common@20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(@ngneat/transloco@4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3))(rxjs@7.8.2): dependencies: - '@angular/common': 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) - '@angular/core': 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) - '@ngneat/transloco': 4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3) + "@angular/common": 20.3.25(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + "@angular/core": 20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1) + "@ngneat/transloco": 4.3.0(@angular/core@20.3.25(@angular/compiler@20.3.25)(rxjs@7.8.2)(zone.js@0.15.1))(fs-extra@11.3.5)(glob@13.0.6)(rxjs@7.8.2)(typescript@5.9.3) rxjs: 7.8.2 tslib: 2.8.1 @@ -17635,7 +19576,7 @@ snapshots: npm-registry-fetch@19.1.1: dependencies: - '@npmcli/redact': 4.0.0 + "@npmcli/redact": 4.0.0 jsonparse: 1.3.1 make-fetch-happen: 15.0.6 minipass: 7.1.3 @@ -17662,8 +19603,8 @@ snapshots: nyc@15.1.0: dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.6 + "@istanbuljs/load-nyc-config": 1.1.0 + "@istanbuljs/schema": 0.1.6 caching-transform: 4.0.0 convert-source-map: 1.9.0 decamelize: 1.2.0 @@ -17893,7 +19834,7 @@ snapshots: p-retry@6.2.1: dependencies: - '@types/retry': 0.12.2 + "@types/retry": 0.12.2 is-network-error: 1.3.0 retry: 0.13.1 @@ -17910,11 +19851,11 @@ snapshots: pacote@21.0.4: dependencies: - '@npmcli/git': 7.0.2 - '@npmcli/installed-package-contents': 4.0.0 - '@npmcli/package-json': 7.0.5 - '@npmcli/promise-spawn': 9.0.1 - '@npmcli/run-script': 10.0.4 + "@npmcli/git": 7.0.2 + "@npmcli/installed-package-contents": 4.0.0 + "@npmcli/package-json": 7.0.5 + "@npmcli/promise-spawn": 9.0.1 + "@npmcli/run-script": 10.0.4 cacache: 20.0.4 fs-minipass: 3.0.3 minipass: 7.1.3 @@ -17951,7 +19892,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.7 + "@babel/code-frame": 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -18055,7 +19996,7 @@ snapshots: piscina@5.1.3: optionalDependencies: - '@napi-rs/nice': 1.1.1 + "@napi-rs/nice": 1.1.1 pixelmatch@7.2.0: dependencies: @@ -18079,7 +20020,7 @@ snapshots: polka@0.5.2: dependencies: - '@polka/url': 0.5.0 + "@polka/url": 0.5.0 trouter: 2.0.1 possible-typed-array-names@1.1.0: {} @@ -18160,13 +20101,13 @@ snapshots: pretty-format@29.7.0: dependencies: - '@jest/schemas': 29.6.3 + "@jest/schemas": 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 pretty-format@30.4.1: dependencies: - '@jest/schemas': 30.4.1 + "@jest/schemas": 30.4.1 ansi-styles: 5.2.0 react-is-18: react-is@18.3.1 react-is-19: react-is@19.2.8 @@ -18317,9 +20258,9 @@ snapshots: realtime-server@file:../../RealtimeServer: dependencies: - '@biblionexus-foundation/scripture-utilities': 0.0.7 - '@bugsnag/js': 7.25.0 - '@sillsdev/scripture': 1.4.1 + "@biblionexus-foundation/scripture-utilities": 0.0.7 + "@bugsnag/js": 7.25.0 + "@sillsdev/scripture": 1.4.1 ajv: 8.20.0 ajv-bsontype: 1.0.7 express: 4.22.2 @@ -18508,33 +20449,33 @@ snapshots: rollup@4.59.0: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + "@rollup/rollup-android-arm-eabi": 4.59.0 + "@rollup/rollup-android-arm64": 4.59.0 + "@rollup/rollup-darwin-arm64": 4.59.0 + "@rollup/rollup-darwin-x64": 4.59.0 + "@rollup/rollup-freebsd-arm64": 4.59.0 + "@rollup/rollup-freebsd-x64": 4.59.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.59.0 + "@rollup/rollup-linux-arm-musleabihf": 4.59.0 + "@rollup/rollup-linux-arm64-gnu": 4.59.0 + "@rollup/rollup-linux-arm64-musl": 4.59.0 + "@rollup/rollup-linux-loong64-gnu": 4.59.0 + "@rollup/rollup-linux-loong64-musl": 4.59.0 + "@rollup/rollup-linux-ppc64-gnu": 4.59.0 + "@rollup/rollup-linux-ppc64-musl": 4.59.0 + "@rollup/rollup-linux-riscv64-gnu": 4.59.0 + "@rollup/rollup-linux-riscv64-musl": 4.59.0 + "@rollup/rollup-linux-s390x-gnu": 4.59.0 + "@rollup/rollup-linux-x64-gnu": 4.59.0 + "@rollup/rollup-linux-x64-musl": 4.59.0 + "@rollup/rollup-openbsd-x64": 4.59.0 + "@rollup/rollup-openharmony-arm64": 4.59.0 + "@rollup/rollup-win32-arm64-msvc": 4.59.0 + "@rollup/rollup-win32-ia32-msvc": 4.59.0 + "@rollup/rollup-win32-x64-gnu": 4.59.0 + "@rollup/rollup-win32-x64-msvc": 4.59.0 fsevents: 2.3.3 router@2.2.0: @@ -18595,7 +20536,7 @@ snapshots: immutable: 5.1.9 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.6 + "@parcel/watcher": 2.5.6 sax@1.4.3: optional: true @@ -18606,19 +20547,19 @@ snapshots: schema-utils@2.7.1: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 6.15.0 ajv-keywords: 3.5.2(ajv@6.15.0) schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 6.15.0 ajv-keywords: 3.5.2(ajv@6.15.0) schema-utils@4.3.3: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 8.20.0 ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) @@ -18627,7 +20568,7 @@ snapshots: selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.14 + "@types/node-forge": 1.3.14 node-forge: 1.4.0 semver@5.7.2: {} @@ -18807,12 +20748,12 @@ snapshots: sigstore@4.1.1: dependencies: - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.2.1 - '@sigstore/protobuf-specs': 0.5.1 - '@sigstore/sign': 4.1.1 - '@sigstore/tuf': 4.0.2 - '@sigstore/verify': 3.1.1 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.2.1 + "@sigstore/protobuf-specs": 0.5.1 + "@sigstore/sign": 4.1.1 + "@sigstore/tuf": 4.0.2 + "@sigstore/verify": 3.1.1 transitivePeerDependencies: - supports-color @@ -18825,13 +20766,13 @@ snapshots: sirv@2.0.4: dependencies: - '@polka/url': 1.0.0-next.29 + "@polka/url": 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 sirv@3.0.2: dependencies: - '@polka/url': 1.0.0-next.29 + "@polka/url": 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 @@ -18864,7 +20805,7 @@ snapshots: socket.io-parser@4.2.6: dependencies: - '@socket.io/component-emitter': 3.1.2 + "@socket.io/component-emitter": 3.1.2 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -19015,12 +20956,12 @@ snapshots: storybook@10.2.14(@testing-library/dom@10.4.1)(prettier@3.8.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/expect': 3.2.4 - '@vitest/spy': 3.2.4 + "@storybook/global": 5.0.0 + "@storybook/icons": 2.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@testing-library/jest-dom": 6.9.1 + "@testing-library/user-event": 14.6.1(@testing-library/dom@10.4.1) + "@vitest/expect": 3.2.4 + "@vitest/spy": 3.2.4 esbuild: 0.27.2 open: 10.2.0 recast: 0.23.11 @@ -19030,7 +20971,7 @@ snapshots: optionalDependencies: prettier: 3.8.4 transitivePeerDependencies: - - '@testing-library/dom' + - "@testing-library/dom" - bufferutil - react - react-dom @@ -19174,7 +21115,7 @@ snapshots: synckit@0.11.13: dependencies: - '@pkgr/core': 0.3.6 + "@pkgr/core": 0.3.6 tablesort@5.7.1: {} @@ -19182,7 +21123,7 @@ snapshots: tar@7.5.21: dependencies: - '@isaacs/fs-minipass': 4.0.1 + "@isaacs/fs-minipass": 4.0.1 chownr: 3.0.0 minipass: 7.1.3 minizlib: 3.1.0 @@ -19192,33 +21133,33 @@ snapshots: terser-webpack-plugin@5.6.1(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@jridgewell/trace-mapping': 0.3.31 + "@jridgewell/trace-mapping": 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.48.0 webpack: 5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12) optionalDependencies: - '@swc/core': 1.15.41 + "@swc/core": 1.15.41 esbuild: 0.28.0 postcss: 8.5.12 terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.11 + "@jridgewell/source-map": 0.3.11 acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 terser@5.48.0: dependencies: - '@jridgewell/source-map': 0.3.11 + "@jridgewell/source-map": 0.3.11 acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 test-exclude@6.0.0: dependencies: - '@istanbuljs/schema': 0.1.6 + "@istanbuljs/schema": 0.1.6 glob: 7.2.3 minimatch: 3.1.5 @@ -19304,17 +21245,17 @@ snapshots: ts-morph@27.0.2: dependencies: - '@ts-morph/common': 0.28.1 + "@ts-morph/common": 0.28.1 code-block-writer: 13.0.3 ts-node@10.9.2(@swc/core@1.15.41)(@types/node@22.19.21)(typescript@5.9.3): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.21 + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.12 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 22.19.21 acorn: 8.17.0 acorn-walk: 8.3.5 arg: 4.1.3 @@ -19325,7 +21266,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.41 + "@swc/core": 1.15.41 ts-object-path@0.1.2: {} @@ -19338,7 +21279,7 @@ snapshots: tsconfig-paths@3.15.0: dependencies: - '@types/json5': 0.0.29 + "@types/json5": 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 @@ -19353,7 +21294,7 @@ snapshots: tuf-js@4.1.0: dependencies: - '@tufjs/models': 4.1.0 + "@tufjs/models": 4.1.0 debug: 4.4.3 make-fetch-happen: 15.0.6 transitivePeerDependencies: @@ -19468,7 +21409,7 @@ snapshots: unplugin@2.3.11: dependencies: - '@jridgewell/remapping': 2.3.5 + "@jridgewell/remapping": 2.3.5 acorn: 8.17.0 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 @@ -19477,28 +21418,28 @@ snapshots: dependencies: napi-postinstall: 0.3.4 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.12.2 - '@unrs/resolver-binding-android-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-arm64': 1.12.2 - '@unrs/resolver-binding-darwin-x64': 1.12.2 - '@unrs/resolver-binding-freebsd-x64': 1.12.2 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 - '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 - '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 - '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 - '@unrs/resolver-binding-linux-x64-musl': 1.12.2 - '@unrs/resolver-binding-openharmony-arm64': 1.12.2 - '@unrs/resolver-binding-wasm32-wasi': 1.12.2 - '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 - '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 - '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + "@unrs/resolver-binding-android-arm-eabi": 1.12.2 + "@unrs/resolver-binding-android-arm64": 1.12.2 + "@unrs/resolver-binding-darwin-arm64": 1.12.2 + "@unrs/resolver-binding-darwin-x64": 1.12.2 + "@unrs/resolver-binding-freebsd-x64": 1.12.2 + "@unrs/resolver-binding-linux-arm-gnueabihf": 1.12.2 + "@unrs/resolver-binding-linux-arm-musleabihf": 1.12.2 + "@unrs/resolver-binding-linux-arm64-gnu": 1.12.2 + "@unrs/resolver-binding-linux-arm64-musl": 1.12.2 + "@unrs/resolver-binding-linux-loong64-gnu": 1.12.2 + "@unrs/resolver-binding-linux-loong64-musl": 1.12.2 + "@unrs/resolver-binding-linux-ppc64-gnu": 1.12.2 + "@unrs/resolver-binding-linux-riscv64-gnu": 1.12.2 + "@unrs/resolver-binding-linux-riscv64-musl": 1.12.2 + "@unrs/resolver-binding-linux-s390x-gnu": 1.12.2 + "@unrs/resolver-binding-linux-x64-gnu": 1.12.2 + "@unrs/resolver-binding-linux-x64-musl": 1.12.2 + "@unrs/resolver-binding-openharmony-arm64": 1.12.2 + "@unrs/resolver-binding-wasm32-wasi": 1.12.2 + "@unrs/resolver-binding-win32-arm64-msvc": 1.12.2 + "@unrs/resolver-binding-win32-ia32-msvc": 1.12.2 + "@unrs/resolver-binding-win32-x64-msvc": 1.12.2 update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: @@ -19535,8 +21476,8 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@types/istanbul-lib-coverage': 2.0.6 + "@jridgewell/trace-mapping": 0.3.31 + "@types/istanbul-lib-coverage": 2.0.6 convert-source-map: 2.0.0 validate-npm-package-name@6.0.2: {} @@ -19550,7 +21491,7 @@ snapshots: vis-network@10.1.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@11.1.0)(vis-data@8.0.4(uuid@8.3.2)(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)): dependencies: - '@egjs/hammerjs': 2.0.17 + "@egjs/hammerjs": 2.0.17 component-emitter: 2.0.0 keycharm: 0.4.0 uuid: 11.1.0 @@ -19559,7 +21500,7 @@ snapshots: vis-util@6.0.0(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0): dependencies: - '@egjs/hammerjs': 2.0.17 + "@egjs/hammerjs": 2.0.17 component-emitter: 2.0.0 vite@7.3.2(@types/node@22.19.21)(jiti@1.21.7)(less@4.4.0)(sass@1.90.0)(terser@5.43.1)(yaml@2.9.0): @@ -19571,7 +21512,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 fsevents: 2.3.3 jiti: 1.21.7 less: 4.4.0 @@ -19588,7 +21529,7 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 22.19.21 + "@types/node": 22.19.21 fsevents: 2.3.3 jiti: 1.21.7 less: 4.4.0 @@ -19648,7 +21589,7 @@ snapshots: webpack-bundle-analyzer@4.10.2: dependencies: - '@discoveryjs/json-ext': 0.5.7 + "@discoveryjs/json-ext": 0.5.7 acorn: 8.17.0 acorn-walk: 8.3.5 commander: 7.2.0 @@ -19702,14 +21643,14 @@ snapshots: webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12)): dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.10 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 + "@types/bonjour": 3.5.13 + "@types/connect-history-api-fallback": 1.5.4 + "@types/express": 4.17.25 + "@types/express-serve-static-core": 4.19.7 + "@types/serve-index": 1.9.4 + "@types/serve-static": 1.15.10 + "@types/sockjs": 0.3.36 + "@types/ws": 8.18.1 ansi-html-community: 0.0.8 bonjour-service: 1.3.0 chokidar: 3.6.0 @@ -19764,12 +21705,12 @@ snapshots: webpack@5.105.0(@swc/core@1.15.41)(esbuild@0.28.0)(postcss@8.5.12): dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.9 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.9 + "@types/json-schema": 7.0.15 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/wasm-edit": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 acorn: 8.17.0 acorn-import-phases: 1.0.4(acorn@8.17.0) browserslist: 4.28.2 @@ -19790,10 +21731,10 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.5.0 transitivePeerDependencies: - - '@minify-html/node' - - '@swc/core' - - '@swc/css' - - '@swc/html' + - "@minify-html/node" + - "@swc/core" + - "@swc/css" + - "@swc/html" - clean-css - cssnano - csso diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-answers/checking-question/checking-question.stories.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-answers/checking-question/checking-question.stories.ts index 876c9ce7ce4..eac01fe170b 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-answers/checking-question/checking-question.stories.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-answers/checking-question/checking-question.stories.ts @@ -24,8 +24,7 @@ const query: RealtimeQuery = mock(RealtimeQuery); const projectUserConfigDoc: SFProjectUserConfigDoc = mock(SFProjectUserConfigDoc); const projectUserConfig: SFProjectUserConfig = createTestProjectUserConfig({ projectRef: 'project01', - ownerRef: 'user01', - translationSuggestionsEnabled: false + ownerRef: 'user01' }); const textAudioDoc: TextAudioDoc = mock(TextAudioDoc); const textAudio: TextAudio = { diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-questions/checking-questions.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-questions/checking-questions.component.ts index 32fe298801a..c8111941a29 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-questions/checking-questions.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking-questions/checking-questions.component.ts @@ -38,7 +38,6 @@ import { QuestionDoc } from '../../../core/models/question-doc'; import { SFProjectProfileDoc } from '../../../core/models/sf-project-profile-doc'; import { SFProjectUserConfigDoc } from '../../../core/models/sf-project-user-config-doc'; import { SFProjectService } from '../../../core/sf-project.service'; -import { TranslationEngineService } from '../../../core/translation-engine.service'; import { BookChapter, bookChapterMatchesVerseRef, CheckingUtils } from '../../checking.utils'; import { CheckingQuestionsService } from '../checking-questions.service'; @@ -155,7 +154,6 @@ export class CheckingQuestionsComponent implements OnInit, OnChanges { constructor( private readonly questionsService: CheckingQuestionsService, private readonly userService: UserService, - private readonly translationEngineService: TranslationEngineService, private readonly changeDetector: ChangeDetectorRef, private readonly projectService: SFProjectService, private readonly i18n: I18nService, @@ -472,16 +470,6 @@ export class CheckingQuestionsComponent implements OnInit, OnChanges { if (this._projectUserConfigDoc != null && this._projectUserConfigDoc.data != null) { const activeQuestionDoc = this.activeQuestionDoc; if (activeQuestionDoc != null && activeQuestionDoc.data != null) { - if ( - this.project != null && - this.project.translateConfig.translationSuggestionsEnabled && - this.project.translateConfig.source !== undefined - ) { - await this.translationEngineService.trainSelectedSegment( - this._projectUserConfigDoc.data, - this.project.translateConfig.source.projectRef - ); - } await this._projectUserConfigDoc.submitJson0Op(op => { op.set(puc => puc.selectedQuestionRef!, activeQuestionDoc.id); op.unset(puc => puc.selectedSegment); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking.component.spec.ts index 72c348dfc4b..a0afc674060 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/checking/checking/checking.component.spec.ts @@ -75,7 +75,6 @@ import { SF_TYPE_REGISTRY } from '../../core/models/sf-type-registry'; import { TextAudioDoc } from '../../core/models/text-audio-doc'; import { TextDoc } from '../../core/models/text-doc'; import { SFProjectService } from '../../core/sf-project.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; import { AudioRecorderDialogComponent } from '../../shared/audio-recorder-dialog/audio-recorder-dialog.component'; import { AudioPlayerComponent } from '../../shared/audio/audio-player/audio-player.component'; import { AudioTimePipe } from '../../shared/audio/audio-time-pipe'; @@ -103,7 +102,6 @@ import { FontSizeComponent } from './font-size/font-size.component'; const mockedUserService = mock(UserService); const mockedProjectService = mock(SFProjectService); -const mockedTranslationEngineService = mock(TranslationEngineService); const mockedNoticeService = mock(NoticeService); const mockedActivatedRoute = mock(ActivatedRoute); const mockedDialogService = mock(DialogService); @@ -175,7 +173,6 @@ describe('CheckingComponent', () => { { provide: ActivatedRoute, useMock: mockedActivatedRoute }, { provide: UserService, useMock: mockedUserService }, { provide: SFProjectService, useMock: mockedProjectService }, - { provide: TranslationEngineService, useMock: mockedTranslationEngineService }, { provide: NoticeService, useMock: mockedNoticeService }, { provide: DialogService, useMock: mockedDialogService }, { provide: QuestionDialogService, useMock: mockedQuestionDialogService }, @@ -1392,15 +1389,10 @@ describe('CheckingComponent', () => { it('saves the last visited question', fakeAsync(() => { const env = new TestEnvironment({ user: CHECKER_USER }); const projectUserConfigDoc = env.component.projectUserConfigDoc!.data!; - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).once(); expect(projectUserConfigDoc.selectedQuestionRef).toBe('project01:q5Id'); - env.component.projectDoc!.submitJson0Op(op => { - op.set(p => p.translateConfig.translationSuggestionsEnabled, false); - }); env.waitForSliderUpdate(); env.selectQuestion(4); expect(projectUserConfigDoc.selectedQuestionRef).toBe('project01:q4Id'); - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).once(); })); it('saves the last visited question in all question context', fakeAsync(() => { @@ -1411,11 +1403,9 @@ describe('CheckingComponent', () => { questionScope: 'all' }); const projectUserConfigDoc = env.component.projectUserConfigDoc!.data!; - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).once(); expect(projectUserConfigDoc.selectedQuestionRef).toBe('project01:q5Id'); env.selectQuestion(4); expect(projectUserConfigDoc.selectedQuestionRef).toBe('project01:q3Id'); - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).twice(); })); it('can cancel answering a question', fakeAsync(() => { @@ -3215,7 +3205,6 @@ class TestEnvironment { tag: TestEnvironment.project01WritingSystemTag }, translateConfig: { - translationSuggestionsEnabled: true, source: { paratextId: 'project02', projectRef: 'project02', diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/connect-project/connect-project.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/connect-project/connect-project.component.spec.ts index 2accc9c62b6..734a590f522 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/connect-project/connect-project.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/connect-project/connect-project.component.spec.ts @@ -354,7 +354,6 @@ class TestEnvironment { const newProject: SFProject = createTestProject({ paratextId: settings.paratextId, translateConfig: { - translationSuggestionsEnabled: false, source: settings.sourceParatextId == null ? undefined diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-settings.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-settings.ts index 1b759da08bc..14e7dea89e7 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-settings.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/core/models/sf-project-settings.ts @@ -4,7 +4,6 @@ import { CheckingAnswerExport } from 'realtime-server/lib/esm/scriptureforge/mod * This interface represents the project settings that can be updated using "SFProjectService.onlineUpdateSettings()". */ export interface SFProjectSettings { - translationSuggestionsEnabled?: boolean | null; sourceParatextId?: string | null; biblicalTermsEnabled?: boolean | null; diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/core/translation-engine.service.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/core/translation-engine.service.ts deleted file mode 100644 index d44f47843e0..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/core/translation-engine.service.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { DestroyRef, Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { InteractiveTranslator, InteractiveTranslatorFactory, LatinWordTokenizer } from '@sillsdev/machine'; -import { Canon } from '@sillsdev/scripture'; -import * as crc from 'crc-32'; -import { SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; -import { SFProjectUserConfig } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-user-config'; -import { getTextDocId } from 'realtime-server/lib/esm/scriptureforge/models/text-data'; -import { Observable } from 'rxjs'; -import { filter, share } from 'rxjs/operators'; -import { I18nService } from 'xforge-common/i18n.service'; -import { NoticeService } from 'xforge-common/notice.service'; -import { OfflineData, OfflineStore } from 'xforge-common/offline-store'; -import { OnlineStatusService } from 'xforge-common/online-status.service'; -import { quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; -import { HttpClient } from '../machine-api/http-client'; -import { RemoteTranslationEngine } from '../machine-api/remote-translation-engine'; -import { EDITED_SEGMENTS, EditedSegmentData } from './models/edited-segment-data'; -import { SFProjectService } from './sf-project.service'; - -/** - * A service to access features for translation suggestions and training the translation engine - */ -@Injectable({ - providedIn: 'root' -}) -export class TranslationEngineService { - private onlineStatus$: Observable; - private tokenizer = new LatinWordTokenizer(); - private translationEngines: Map = new Map(); - private interactiveTranslatorFactories: Map = new Map< - string, - InteractiveTranslatorFactory - >(); - - constructor( - private readonly offlineStore: OfflineStore, - private readonly onlineStatusService: OnlineStatusService, - private readonly projectService: SFProjectService, - private readonly machineHttp: HttpClient, - private readonly noticeService: NoticeService, - private readonly router: Router, - private destroyRef: DestroyRef, - private readonly i18n: I18nService - ) { - this.onlineStatus$ = this.onlineStatusService.onlineStatus$.pipe( - filter(online => online), - share() - ); - this.onlineCallback(async () => { - const engineTrainingData: EditedSegmentData[] = await this.getAll(EDITED_SEGMENTS); - for (const data of engineTrainingData) { - await this.trainSegment(data.projectRef, data.sourceProjectRef, data.bookNum, data.chapterNum, data.segment); - await this.delete(EDITED_SEGMENTS, data.id); - } - }); - } - - createTranslationEngine(projectId: string): RemoteTranslationEngine { - if (!this.translationEngines.has(projectId)) { - this.translationEngines.set( - projectId, - new RemoteTranslationEngine(projectId, this.machineHttp, this.noticeService, this.router, this.i18n) - ); - } - return this.translationEngines.get(projectId)!; - } - - createInteractiveTranslatorFactory(projectId: string): InteractiveTranslatorFactory { - if (!this.interactiveTranslatorFactories.has(projectId)) { - this.interactiveTranslatorFactories.set( - projectId, - new InteractiveTranslatorFactory(this.createTranslationEngine(projectId), this.tokenizer) - ); - } - return this.interactiveTranslatorFactories.get(projectId)!; - } - - checkHasSourceBooks(project: SFProjectProfile): boolean { - return project.texts.filter(t => t.hasSource).length > 0; - } - - /** - * Train the translation engine with the text for a specified segment using the target and source text - */ - async trainSelectedSegment(projectUserConfig: SFProjectUserConfig, sourceProjectRef: string): Promise { - if ( - projectUserConfig.selectedTask === 'checking' || - projectUserConfig.selectedBookNum == null || - projectUserConfig.selectedChapterNum == null || - projectUserConfig.selectedSegment === '' || - projectUserConfig.selectedSegmentChecksum == null - ) { - return; - } - return this.trainSegment( - projectUserConfig.projectRef, - sourceProjectRef, - projectUserConfig.selectedBookNum, - projectUserConfig.selectedChapterNum, - projectUserConfig.selectedSegment, - projectUserConfig.selectedSegmentChecksum - ); - } - - /** - * Store a segment to be used to train the translation engine when returning online - */ - async storeTrainingSegment( - projectRef: string, - sourceProjectRef: string, - bookNum: number, - chapterNum: number, - segment: string - ): Promise { - let trainingData: EditedSegmentData | undefined = await this.get( - EDITED_SEGMENTS, - this.translationSuggestionId(projectRef, bookNum, segment) - ); - if (trainingData != null) { - return; - } - - trainingData = { - id: this.translationSuggestionId(projectRef, bookNum, segment), - projectRef: projectRef, - sourceProjectRef: sourceProjectRef, - bookNum: bookNum, - chapterNum: chapterNum, - segment: segment - }; - return this.put(EDITED_SEGMENTS, trainingData); - } - - private async trainSegment( - projectRef: string, - sourceProjectRef: string, - bookNum: number, - chapterNum: number, - segment: string, - checksum?: number - ): Promise { - const targetDoc = await this.projectService.getText(getTextDocId(projectRef, bookNum, chapterNum, 'target')); - const targetText = targetDoc.getSegmentText(segment); - if (targetText === '') { - return; - } - if (checksum != null) { - const targetChecksum = crc.str(targetText); - if (checksum === targetChecksum) { - return; - } - } - - const sourceDoc = await this.projectService.getText(getTextDocId(sourceProjectRef, bookNum, chapterNum, 'source')); - const sourceText = sourceDoc.getSegmentText(segment); - if (sourceText === '') { - return; - } - - const factory: InteractiveTranslatorFactory = this.createInteractiveTranslatorFactory(projectRef); - const translator: InteractiveTranslator = await factory.create(sourceText); - if (!translator.isSegmentValid) { - return; - } - translator.setPrefix(targetText); - await translator.approve(true); - console.log('Segment ' + segment + ' of document ' + Canon.bookNumberToId(bookNum) + ' was trained successfully.'); - } - - private put(collection: string, data: T): Promise { - return this.offlineStore.put(collection, data); - } - - private getAll(collection: string): Promise { - return this.offlineStore.getAll(collection); - } - private get(collection: string, id: string): Promise { - return this.offlineStore.get(collection, id); - } - - private delete(collection: string, id: string): Promise { - return this.offlineStore.delete(collection, id); - } - - private onlineCallback(callback: () => any): void { - this.onlineStatus$.pipe(quietTakeUntilDestroyed(this.destroyRef)).subscribe(callback); - } - - private translationSuggestionId(projectRef: string, bookNum: number, segment: string): string { - return `${projectRef}:${bookNum}:${segment}`; - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/aligned-word-pair-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/aligned-word-pair-dto.ts deleted file mode 100644 index bf33c3a3d58..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/aligned-word-pair-dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface AlignedWordPairDto { - sourceIndex: number; - targetIndex: number; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/engine-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/engine-dto.ts deleted file mode 100644 index ec59328cd5a..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/engine-dto.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ResourceDto } from './resource-dto'; - -export interface EngineDto extends ResourceDto { - sourceLanguageTag: string; - targetLanguageTag: string; - isShared: boolean; - projects: ResourceDto[]; - confidence: number; - trainedSegmentCount: number; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/phrase-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/phrase-dto.ts deleted file mode 100644 index 2b9282e8726..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/phrase-dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface PhraseDto { - sourceSegmentStart: number; - sourceSegmentEnd: number; - targetSegmentCut: number; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.spec.ts deleted file mode 100644 index 7631f64a14b..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.spec.ts +++ /dev/null @@ -1,574 +0,0 @@ -import { HttpErrorResponse } from '@angular/common/http'; -import { NgZone } from '@angular/core'; -import { TestBed } from '@angular/core/testing'; -import { Router } from '@angular/router'; -import { TranslationSources, WordGraph } from '@sillsdev/machine'; -import { of, throwError } from 'rxjs'; -import { anything, instance, mock, when } from 'ts-mockito'; -import { I18nService } from 'xforge-common/i18n.service'; -import { NoticeService } from 'xforge-common/notice.service'; -import { configureTestingModule, getTestTranslocoModule } from 'xforge-common/test-utils'; -import { BuildDto } from './build-dto'; -import { BuildStates } from './build-states'; -import { EngineDto } from './engine-dto'; -import { HttpClient } from './http-client'; -import { RemoteTranslationEngine } from './remote-translation-engine'; -import { SegmentPairDto } from './segment-pair-dto'; -import { TranslationResultDto } from './translation-result-dto'; -import { TranslationSource } from './translation-source'; -import { WordGraphDto } from './word-graph-dto'; - -describe('RemoteTranslationEngine', () => { - configureTestingModule(() => ({ - imports: [getTestTranslocoModule()] - })); - - it('get word graph', async () => { - const env = new TestEnvironment(); - const sourceTokens = ['Esto', 'es', 'una', 'prueba', '.']; - const sourceSegment = 'Esto es una prueba.'; - when( - env.mockedHttpClient.post( - 'translation/engines/project:project01/actions/getWordGraph', - JSON.stringify(sourceSegment) - ) - ).thenReturn( - of({ - status: 200, - data: env.getWordGraph(sourceTokens) - }) - ); - - // SUT - const wordGraph = await env.client.getWordGraph(sourceSegment); - env.verifyWordGraphAssertions(wordGraph, sourceTokens); - }); - - it('get word graph duplicate queued request', async () => { - const env = new TestEnvironment(); - const sourceTokens = ['Esto', 'es', 'una', 'prueba', '.']; - const sourceSegment = 'Esto es una prueba.'; - - // Mock that a word graph request is already queued. - // This mocks the promise of executeGetWordGraphRequest() - env.client['pendingWordGraphRequests'].set( - sourceSegment, - Promise.resolve(env.client['createWordGraph'](env.getWordGraph(sourceTokens))) - ); - - // SUT - const wordGraph = await env.client.getWordGraph(sourceSegment); - env.verifyWordGraphAssertions(wordGraph, sourceTokens); - }); - - it('get stats is successful when engine exists', async () => { - const env = new TestEnvironment(); - - const stats = await env.client.getStats(); - expect(stats.confidence).toEqual(0.2); - expect(stats.trainedSegmentCount).toEqual(100); - }); - - it('get stats is successful when engine is not found', async () => { - const env = new TestEnvironment(); - - when(env.mockedHttpClient.get('translation/engines/project:project01')).thenReturn( - throwError(() => new HttpErrorResponse({ status: 404 })) - ); - - const stats = await env.client.getStats(); - expect(stats.confidence).toEqual(0); - expect(stats.trainedSegmentCount).toEqual(0); - }); - - it('start training is successful when engine exists', async () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - - when(env.mockedHttpClient.post('translation/builds', JSON.stringify('project01'))).thenReturn( - of({ - status: 200, - data: { - id: 'build01', - href: 'translation/builds/id:build01', - revision: 0, - engine: { id: 'engine01', href: 'translation/engines/id:engine01' }, - percentCompleted: 0, - message: '', - state: BuildStates.Pending, - queueDepth: 0 - } - }) - ); - - await env.client.startTraining(); - expect().nothing(); - }); - - it('start training is successful when engine is not found', async () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - - when(env.mockedHttpClient.post('translation/builds', JSON.stringify('project01'))).thenReturn( - throwError(() => new HttpErrorResponse({ status: 404 })) - ); - - await env.client.startTraining(); - expect().nothing(); - }); - - it('train with no errors', () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - env.addBuildProgress(); - - let expectedStep = -1; - env.client.train().subscribe({ - next: progress => { - expectedStep++; - expect(progress.percentCompleted).toEqual(expectedStep / 10); - }, - error: () => {}, - complete: () => { - expect(expectedStep).toEqual(10); - } - }); - }); - - it('train with error while starting build', () => { - const env = new TestEnvironment(); - when(env.mockedHttpClient.post('translation/builds', JSON.stringify('engine01'))).thenReturn( - throwError(() => new Error('Error while creating build.')) - ); - - env.client.train().subscribe({ - next: () => {}, - error: err => expect(err.message).toEqual('Error while creating build.') - }); - }); - - it('train with 404 error during build', () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - when(env.mockedHttpClient.get('translation/builds/id:build01?minRevision=1')).thenReturn( - throwError(() => new HttpErrorResponse({ status: 404, statusText: 'Not Found' })) - ); - - env.client.train().subscribe({ - next: progress => expect(progress.percentCompleted).toEqual(0), - error: err => expect(err.message).toContain('404 Not Found') - }); - }); - - it('train with error during build', () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - when(env.mockedHttpClient.get('translation/builds/id:build01?minRevision=1')).thenReturn( - of({ - status: 200, - data: { - id: 'build01', - href: 'translation/builds/id:build01', - revision: 1, - engine: { id: 'engine01', href: 'translation/engines/id:engine01' }, - percentCompleted: 0.1, - message: 'broken', - state: BuildStates.Faulted, - queueDepth: 0 - } - }) - ); - - env.client.train().subscribe({ - next: progress => expect(progress.percentCompleted).toEqual(0), - error: err => expect(err.message).toEqual('Error occurred during build: broken') - }); - }); - - it('train segment executes successfully', async () => { - const env = new TestEnvironment(); - const sourceSegment = 'source'; - const targetSegment = 'target'; - let remoteMethodCalled = false; - when( - env.mockedHttpClient.post( - 'translation/engines/project:project01/actions/trainSegment', - anything() - ) - ).thenCall((_, dto: SegmentPairDto) => { - remoteMethodCalled = true; - expect(dto.sourceSegment).toBe(sourceSegment); - expect(dto.targetSegment).toBe(targetSegment); - expect(dto.sentenceStart).toBe(true); - return of({ status: 200 }); - }); - - await env.client.trainSegment(sourceSegment, targetSegment); - expect(remoteMethodCalled).toBe(true); - }); - - it('translate executes successfully', async () => { - const env = new TestEnvironment(); - const confidences = [0.1, 0.2, 0.3, 0.4, 0.5]; - const sourceTokens = ['Esto', 'es', 'una', 'prueba', '.']; - const sourceSegment = 'Esto es una prueba.'; - const translation = 'This is a test.'; - const targetTokens = ['This', 'is', 'a', 'test', '.']; - when( - env.mockedHttpClient.post( - 'translation/engines/project:project01/actions/translate', - JSON.stringify(sourceSegment) - ) - ).thenReturn( - of({ - status: 200, - data: { - alignment: [ - { sourceIndex: 0, targetIndex: 0 }, - { sourceIndex: 1, targetIndex: 1 }, - { sourceIndex: 2, targetIndex: 2 }, - { sourceIndex: 3, targetIndex: 3 }, - { sourceIndex: 4, targetIndex: 4 } - ], - confidences: confidences, - phrases: [ - { sourceSegmentStart: 0, sourceSegmentEnd: 1, targetSegmentCut: 2 }, - { sourceSegmentStart: 1, sourceSegmentEnd: 2, targetSegmentCut: 3 }, - { sourceSegmentStart: 2, sourceSegmentEnd: 3, targetSegmentCut: 4 }, - { sourceSegmentStart: 3, sourceSegmentEnd: 4, targetSegmentCut: 5 }, - { sourceSegmentStart: 4, sourceSegmentEnd: 5, targetSegmentCut: 6 } - ], - sources: [ - [TranslationSource.Primary], - [TranslationSource.Secondary], - [TranslationSource.Human], - [TranslationSource.Primary, TranslationSource.Secondary], - [TranslationSource.Primary, TranslationSource.Secondary, TranslationSource.Human] - ], - sourceTokens: sourceTokens, - targetTokens: targetTokens, - translation: translation - } - }) - ); - - const translationResult = await env.client.translate(sourceSegment); - expect(translationResult.alignment.columnCount).toEqual(5); - expect(translationResult.alignment.rowCount).toEqual(5); - expect(translationResult.confidences).toEqual(confidences); - expect(translationResult.phrases.length).toEqual(5); - for (let i = 0; i < translationResult.phrases.length; i++) { - expect(translationResult.phrases[i].sourceSegmentRange.start).toEqual(i); - expect(translationResult.phrases[i].sourceSegmentRange.end).toEqual(i + 1); - expect(translationResult.phrases[i].targetSegmentCut).toEqual(i + 2); - } - expect(translationResult.sourceTokens).toEqual(sourceTokens); - expect(translationResult.sources.length).toEqual(5); - expect(translationResult.sources[0]).toEqual(TranslationSources.Smt); - expect(translationResult.sources[1]).toEqual(TranslationSources.Transfer); - expect(translationResult.sources[2]).toEqual(TranslationSources.Prefix); - expect(translationResult.sources[3]).toEqual(TranslationSources.Smt + TranslationSources.Transfer); - expect(translationResult.sources[4]).toEqual( - TranslationSources.Smt + TranslationSources.Transfer + TranslationSources.Prefix - ); - expect(translationResult.targetTokens).toEqual(targetTokens); - expect(translationResult.translation).toEqual(translation); - }); - - it('translate n executes successfully', async () => { - const env = new TestEnvironment(); - const n = 1; - const confidences = [0.1, 0.2, 0.3, 0.4, 0.5]; - const sourceTokens = ['Esto', 'es', 'una', 'prueba', '.']; - const sourceSegment = 'Esto es una prueba.'; - const translation = 'This is a test.'; - const targetTokens = ['This', 'is', 'a', 'test', '.']; - when( - env.mockedHttpClient.post( - 'translation/engines/project:project01/actions/translate/1', - JSON.stringify(sourceSegment) - ) - ).thenReturn( - of({ - status: 200, - data: [ - { - alignment: [ - { sourceIndex: 0, targetIndex: 0 }, - { sourceIndex: 1, targetIndex: 1 }, - { sourceIndex: 2, targetIndex: 2 }, - { sourceIndex: 3, targetIndex: 3 }, - { sourceIndex: 4, targetIndex: 4 } - ], - confidences: confidences, - phrases: [ - { sourceSegmentStart: 0, sourceSegmentEnd: 1, targetSegmentCut: 2 }, - { sourceSegmentStart: 1, sourceSegmentEnd: 2, targetSegmentCut: 3 }, - { sourceSegmentStart: 2, sourceSegmentEnd: 3, targetSegmentCut: 4 }, - { sourceSegmentStart: 3, sourceSegmentEnd: 4, targetSegmentCut: 5 }, - { sourceSegmentStart: 4, sourceSegmentEnd: 5, targetSegmentCut: 6 } - ], - sources: [ - [TranslationSource.Primary], - [TranslationSource.Secondary], - [TranslationSource.Human], - [TranslationSource.Primary, TranslationSource.Secondary], - [TranslationSource.Primary, TranslationSource.Secondary, TranslationSource.Human] - ], - sourceTokens: sourceTokens, - targetTokens: targetTokens, - translation: translation - } - ] - }) - ); - - const translationResults = await env.client.translateN(n, sourceSegment); - expect(translationResults.length).toEqual(n); - expect(translationResults[0].alignment.columnCount).toEqual(5); - expect(translationResults[0].alignment.rowCount).toEqual(5); - expect(translationResults[0].confidences).toEqual(confidences); - expect(translationResults[0].phrases.length).toEqual(5); - for (let i = 0; i < translationResults[0].phrases.length; i++) { - expect(translationResults[0].phrases[i].sourceSegmentRange.start).toEqual(i); - expect(translationResults[0].phrases[i].sourceSegmentRange.end).toEqual(i + 1); - expect(translationResults[0].phrases[i].targetSegmentCut).toEqual(i + 2); - } - expect(translationResults[0].sourceTokens).toEqual(sourceTokens); - expect(translationResults[0].sources.length).toEqual(5); - expect(translationResults[0].sources[0]).toEqual(TranslationSources.Smt); - expect(translationResults[0].sources[1]).toEqual(TranslationSources.Transfer); - expect(translationResults[0].sources[2]).toEqual(TranslationSources.Prefix); - expect(translationResults[0].sources[3]).toEqual(TranslationSources.Smt + TranslationSources.Transfer); - expect(translationResults[0].sources[4]).toEqual( - TranslationSources.Smt + TranslationSources.Transfer + TranslationSources.Prefix - ); - expect(translationResults[0].targetTokens).toEqual(targetTokens); - expect(translationResults[0].translation).toEqual(translation); - }); - - it('listen for training status with 404 error', () => { - const env = new TestEnvironment(); - env.addCreateBuild(); - let errorThrown = false; - when(env.mockedHttpClient.get('translation/builds/id:engine01?minRevision=0')).thenCall(() => { - errorThrown = true; - throwError(() => new HttpErrorResponse({ status: 404 })); - }); - - env.client.listenForTrainingStatus().subscribe({ - next: progress => throwError(() => new Error(`This should not be called. Progress: ${progress}`)), - error: err => throwError(() => err) - }); - expect(errorThrown).toBe(true); - }); - - it('listen for training status with no errors', () => { - const env = new TestEnvironment(); - when(env.mockedHttpClient.get('translation/builds/id:engine01?minRevision=0')).thenReturn( - of({ - status: 200, - data: { - id: 'build01', - href: 'translation/builds/id:build01', - revision: 0, - engine: { id: 'engine01', href: 'translation/engines/id:engine01' }, - percentCompleted: 0, - message: '', - state: BuildStates.Pending, - queueDepth: 0 - } - }) - ); - env.addBuildProgress(); - - let expectedStep = -1; - env.client.listenForTrainingStatus().subscribe({ - next: progress => { - expectedStep++; - expect(progress.percentCompleted).toEqual(expectedStep / 10); - }, - error: () => {}, - complete: () => { - expect(expectedStep).toEqual(10); - } - }); - }); - - it('sends notice when getWordGraph has error', async function () { - const env = new TestEnvironment(); - const sourceSegment = 'Esto es una prueba.'; - when( - env.mockedHttpClient.post( - 'translation/engines/project:project01/actions/getWordGraph', - JSON.stringify(sourceSegment) - ) - ).thenThrow(new Error()); - - env.wait(); - - const result: WordGraph = await env.client.getWordGraph(sourceSegment); - expect(result.isEmpty).toBeTruthy(); - }); -}); - -class TestEnvironment { - readonly mockedHttpClient: HttpClient; - readonly client: RemoteTranslationEngine; - readonly mockedNoticeService: NoticeService; - readonly mockedRouter: Router; - readonly mockedI18nService: I18nService; - readonly ngZone: NgZone; - - constructor() { - this.mockedHttpClient = mock(HttpClient); - when(this.mockedHttpClient.get('translation/engines/project:project01')).thenReturn( - of({ - status: 200, - data: { - id: 'engine01', - href: 'translation/engines/id:engine01', - sourceLanguageTag: 'en', - targetLanguageTag: 'es', - isShared: false, - projects: [{ id: 'project01', href: 'translation/projects/id:project01' }], - confidence: 0.2, - trainedSegmentCount: 100 - } - }) - ); - this.mockedNoticeService = mock(NoticeService); - this.mockedRouter = mock(Router); - this.mockedI18nService = mock(I18nService); - this.client = new RemoteTranslationEngine( - 'project01', - instance(this.mockedHttpClient), - instance(this.mockedNoticeService), - instance(this.mockedRouter), - instance(this.mockedI18nService) - ); - - this.ngZone = TestBed.inject(NgZone); - } - - addCreateBuild(): void { - when(this.mockedHttpClient.post('translation/builds', JSON.stringify('engine01'))).thenReturn( - of({ - status: 201, - data: { - id: 'build01', - href: 'translation/builds/id:build01', - revision: 0, - engine: { id: 'engine01', href: 'translation/engines/id:engine01' }, - percentCompleted: 0, - message: '', - state: BuildStates.Pending, - queueDepth: 0 - } - }) - ); - } - - addBuildProgress(): void { - for (let i = 1; i <= 10; i++) { - when(this.mockedHttpClient.get(`translation/builds/id:build01?minRevision=${i}`)).thenReturn( - of({ - status: 200, - data: { - id: 'build01', - href: 'translation/builds/id:build01', - revision: i, - engine: { id: 'engine01', href: 'translation/engines/id:engine01' }, - percentCompleted: i / 10, - message: '', - state: i === 10 ? BuildStates.Completed : BuildStates.Active, - queueDepth: 0 - } - }) - ); - } - } - - getWordGraph(sourceTokens: string[]): WordGraphDto { - return { - sourceTokens, - initialStateScore: -111.111, - finalStates: [4], - arcs: [ - { - prevState: 0, - nextState: 1, - score: -11.11, - targetTokens: ['This', 'is'], - confidences: [0.4, 0.5], - sourceSegmentStart: 0, - sourceSegmentEnd: 2, - sources: [[TranslationSource.Primary], [TranslationSource.Secondary], [TranslationSource.Human]], - alignment: [ - { sourceIndex: 0, targetIndex: 0 }, - { sourceIndex: 1, targetIndex: 1 } - ] - }, - { - prevState: 1, - nextState: 2, - score: -22.22, - targetTokens: ['a'], - confidences: [0.6], - sourceSegmentStart: 2, - sourceSegmentEnd: 3, - sources: [[TranslationSource.Primary]], - alignment: [{ sourceIndex: 0, targetIndex: 0 }] - }, - { - prevState: 2, - nextState: 3, - score: 33.33, - targetTokens: ['prueba'], - confidences: [0], - sourceSegmentStart: 3, - sourceSegmentEnd: 4, - sources: [[]], - alignment: [{ sourceIndex: 0, targetIndex: 0 }] - }, - { - prevState: 3, - nextState: 4, - score: -44.44, - targetTokens: ['.'], - confidences: [0.7], - sourceSegmentStart: 4, - sourceSegmentEnd: 5, - sources: [[TranslationSource.Primary]], - alignment: [{ sourceIndex: 0, targetIndex: 0 }] - } - ] - }; - } - - verifyWordGraphAssertions(wordGraph: WordGraph, sourceTokens: string[]): void { - expect(wordGraph.initialStateScore).toEqual(-111.111); - expect(wordGraph.sourceTokens).toEqual(sourceTokens); - expect(Array.from(wordGraph.finalStates)).toEqual([4]); - expect(wordGraph.arcs.length).toEqual(4); - - let arc = wordGraph.arcs[0]; - expect(arc.prevState).toEqual(0); - expect(arc.nextState).toEqual(1); - expect(arc.score).toEqual(-11.11); - expect(arc.targetTokens).toEqual(['This', 'is']); - expect(arc.confidences).toEqual([0.4, 0.5]); - expect(arc.sourceSegmentRange.start).toEqual(0); - expect(arc.sourceSegmentRange.end).toEqual(2); - expect(arc.sources).toEqual([TranslationSources.Smt, TranslationSources.Transfer, TranslationSources.Prefix]); - expect(arc.alignment.get(0, 0)).toBe(true); - expect(arc.alignment.get(1, 1)).toBe(true); - - arc = wordGraph.arcs[2]; - expect(arc.sources).toEqual([TranslationSources.None]); - } - - async wait(ms: number = 500): Promise { - await new Promise(resolve => this.ngZone.runOutsideAngular(() => setTimeout(resolve, ms))); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.ts deleted file mode 100644 index eb69032272f..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/remote-translation-engine.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { Router } from '@angular/router'; -import { - createRange, - InteractiveTranslationEngine, - Phrase, - ProgressStatus, - TranslationResult, - TranslationSources, - WordAlignmentMatrix, - WordGraph, - WordGraphArc -} from '@sillsdev/machine'; -import { lastValueFrom, Observable, of, throwError } from 'rxjs'; -import { catchError, expand, filter, map, mergeMap, share, startWith, takeWhile } from 'rxjs/operators'; -import { I18nService } from 'xforge-common/i18n.service'; -import { NoticeService } from 'xforge-common/notice.service'; -import { AlignedWordPairDto } from './aligned-word-pair-dto'; -import { BuildDto } from './build-dto'; -import { BuildStates } from './build-states'; -import { EngineDto } from './engine-dto'; -import { HttpClient } from './http-client'; -import { PhraseDto } from './phrase-dto'; -import { SegmentPairDto } from './segment-pair-dto'; -import { TranslationEngineStats } from './translation-engine-stats'; -import { TranslationResultDto } from './translation-result-dto'; -import { TranslationSource } from './translation-source'; -import { WordGraphDto } from './word-graph-dto'; - -export class RemoteTranslationEngine implements InteractiveTranslationEngine { - private trainingStatus$?: Observable; - private wordGraphQueue: Promise = Promise.resolve(); - private pendingWordGraphRequests = new Map>(); - - constructor( - public readonly projectId: string, - private readonly httpClient: HttpClient, - private readonly noticeService: NoticeService, - private readonly router: Router, - private readonly i18n: I18nService - ) {} - - async translate(segment: string): Promise { - const response = await lastValueFrom( - this.httpClient.post( - `translation/engines/project:${this.projectId}/actions/translate`, - JSON.stringify(segment) - ) - ); - return this.createTranslationResult(response.data as TranslationResultDto); - } - - async translateN(n: number, segment: string): Promise { - const response = await lastValueFrom( - this.httpClient.post( - `translation/engines/project:${this.projectId}/actions/translate/${n}`, - JSON.stringify(segment) - ) - ); - const dto = response.data as TranslationResultDto[]; - return dto.map(dto => this.createTranslationResult(dto)); - } - - async getWordGraph(segment: string): Promise { - // See if a request for this segment is already in progress - if (this.pendingWordGraphRequests.has(segment)) { - return this.pendingWordGraphRequests.get(segment)!; - } - - // Add the request to the queue - const requestPromise = this.wordGraphQueue.then(() => this.executeGetWordGraphRequest(segment)); - - // Put the promise in the pendingRequests cache. - // - // This is so we can return the word graph for any pending requests - // that are for the same segment to stop duplicate requests. - // We do not cache already run word graph queries, - // as the SMT model may have changed via trainSegment(). - this.pendingWordGraphRequests.set(segment, requestPromise); - - // After the queue has run, remove the pending request - this.wordGraphQueue = requestPromise - .then(() => undefined) - .finally(() => this.pendingWordGraphRequests.delete(segment)); - - // Return the promise for the quests in the queue - return requestPromise; - } - - private async executeGetWordGraphRequest(segment: string): Promise { - try { - const response = await lastValueFrom( - this.httpClient.post( - `translation/engines/project:${this.projectId}/actions/getWordGraph`, - JSON.stringify(segment) - ) - ); - return this.createWordGraph(response.data as WordGraphDto); - } catch (err: any) { - if (err.status === 403 || err.status === 404 || err.status === 409) { - this.noticeService.showError( - this.i18n.translateStatic('error_messages.suggestion_engine_requires_retrain'), - this.i18n.translateStatic('error_messages.go_to_retrain'), - () => { - void this.router.navigate(['projects', this.projectId, 'translate']); - } - ); - } else { - this.noticeService.showError(this.i18n.translateStatic('error_messages.failed_to_retrieve_suggestions')); - } - } - - return new WordGraph([]); - } - - async trainSegment(sourceSegment: string, targetSegment: string, sentenceStart: boolean = true): Promise { - const pairDto: SegmentPairDto = { sourceSegment, targetSegment, sentenceStart }; - await lastValueFrom( - this.httpClient.post(`translation/engines/project:${this.projectId}/actions/trainSegment`, pairDto) - ); - } - - train(): Observable { - return this.getEngine(this.projectId).pipe( - mergeMap(e => this.createBuild(e.id)), - mergeMap(b => this.pollBuildProgress(b.id, b.revision + 1).pipe(startWith(b))) - ); - } - - async startTraining(): Promise { - return lastValueFrom( - this.createBuild(this.projectId).pipe( - catchError(err => { - if (err.status === 404) { - return of(undefined); - } else { - return throwError(() => err); - } - }) - ) - ); - } - - listenForTrainingStatus(): Observable { - this.trainingStatus$ ??= this.getEngine(this.projectId).pipe( - mergeMap(e => this.pollBuildProgress(e.id, 0)), - share() - ); - return this.trainingStatus$; - } - - async getStats(): Promise { - const engineDto = await lastValueFrom( - this.getEngine(this.projectId).pipe( - catchError(err => { - if (err.status === 404) { - return of({ confidence: 0.0, trainedSegmentCount: 0 }); - } else { - return throwError(() => err); - } - }) - ) - ); - return { confidence: engineDto.confidence, trainedSegmentCount: engineDto.trainedSegmentCount }; - } - - private getEngine(projectId: string): Observable { - return this.httpClient.get(`translation/engines/project:${projectId}`).pipe( - map(res => { - if (res.data == null) throw new Error('Unexpectedly received no engine data.'); - return res.data; - }) - ); - } - - private createBuild(engineId: string): Observable { - return this.httpClient.post('translation/builds', JSON.stringify(engineId)).pipe( - map(res => { - if (res.data == null) throw new Error('Unexpectedly received no build data.'); - return res.data; - }) - ); - } - - private pollBuildProgress(locator: string, minRevision: number): Observable { - return this.getBuildProgress(locator, minRevision).pipe( - expand(buildDto => { - if (buildDto != null) { - locator = buildDto.id; - minRevision = buildDto.revision + 1; - } - return this.getBuildProgress(locator, minRevision); - }), - filter(buildDto => buildDto != null), - map(buildDto => buildDto as BuildDto), - takeWhile( - buildDto => - buildDto.state === BuildStates.Queued || - buildDto.state === BuildStates.Pending || - buildDto.state === BuildStates.Active, - true - ) - ); - } - - private getBuildProgress(locator: string, minRevision: number): Observable { - return this.httpClient.get(`translation/builds/id:${locator}?minRevision=${minRevision}`).pipe( - map(res => { - if (res.data != null && res.data.state === BuildStates.Faulted) { - throw new Error('Error occurred during build: ' + res.data.message); - } - return res.data; - }) - ); - } - - private createWordGraph(dto: WordGraphDto): WordGraph { - const arcs: WordGraphArc[] = []; - for (const arcDto of dto.arcs) { - const alignment = this.createWordAlignmentMatrix( - arcDto.alignment, - arcDto.sourceSegmentEnd - arcDto.sourceSegmentStart, - arcDto.targetTokens.length - ); - arcs.push( - new WordGraphArc( - arcDto.prevState, - arcDto.nextState, - arcDto.score, - arcDto.targetTokens, - alignment, - createRange(arcDto.sourceSegmentStart, arcDto.sourceSegmentEnd), - Array.from(this.createTranslationSources(arcDto.sources)), - arcDto.confidences - ) - ); - } - return new WordGraph(dto.sourceTokens, arcs, dto.finalStates, dto.initialStateScore); - } - - private createTranslationResult(dto: TranslationResultDto): TranslationResult { - return new TranslationResult( - dto.translation, - dto.sourceTokens, - dto.targetTokens, - dto.confidences, - Array.from(this.createTranslationSources(dto.sources)), - this.createWordAlignmentMatrix(dto.alignment, dto.sourceTokens.length, dto.targetTokens.length), - dto.phrases.map(p => this.createPhrase(p)) - ); - } - - private *createTranslationSources(sources: TranslationSource[][]): Iterable { - for (const source of sources) { - let translationSources = TranslationSources.None; - for (const translationSource of source) { - switch (translationSource) { - case TranslationSource.Primary: - translationSources |= TranslationSources.Smt; - break; - case TranslationSource.Secondary: - translationSources |= TranslationSources.Transfer; - break; - case TranslationSource.Human: - translationSources |= TranslationSources.Prefix; - break; - } - } - yield translationSources; - } - } - - private createWordAlignmentMatrix(dto: AlignedWordPairDto[], i: number, j: number): WordAlignmentMatrix { - const alignment = new WordAlignmentMatrix(i, j); - for (const wordPairDto of dto) { - alignment.set(wordPairDto.sourceIndex, wordPairDto.targetIndex, true); - } - return alignment; - } - - private createPhrase(dto: PhraseDto): Phrase { - return new Phrase(createRange(dto.sourceSegmentStart, dto.sourceSegmentEnd), dto.targetSegmentCut); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/segment-pair-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/segment-pair-dto.ts deleted file mode 100644 index 29d14364286..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/segment-pair-dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface SegmentPairDto { - sourceSegment: string; - targetSegment: string; - sentenceStart: boolean; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-engine-stats.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-engine-stats.ts deleted file mode 100644 index b9769fbc372..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-engine-stats.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface TranslationEngineStats { - confidence: number; - trainedSegmentCount: number; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-result-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-result-dto.ts deleted file mode 100644 index 99414eb9b7d..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-result-dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { AlignedWordPairDto } from './aligned-word-pair-dto'; -import { PhraseDto } from './phrase-dto'; -import { TranslationSource } from './translation-source'; - -export interface TranslationResultDto { - translation: string; - sourceTokens: string[]; - targetTokens: string[]; - confidences: number[]; - sources: TranslationSource[][]; - alignment: AlignedWordPairDto[]; - phrases: PhraseDto[]; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-source.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-source.ts deleted file mode 100644 index 23d667b3639..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/translation-source.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum TranslationSource { - Primary = 0, - Secondary = 1, - Human = 2 -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-arc-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-arc-dto.ts deleted file mode 100644 index 9d7872f5f39..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-arc-dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { AlignedWordPairDto } from './aligned-word-pair-dto'; -import { TranslationSource } from './translation-source'; - -export interface WordGraphArcDto { - prevState: number; - nextState: number; - score: number; - targetTokens: string[]; - confidences: number[]; - sourceSegmentStart: number; - sourceSegmentEnd: number; - alignment: AlignedWordPairDto[]; - sources: TranslationSource[][]; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-dto.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-dto.ts deleted file mode 100644 index d5206c4e2f2..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/machine-api/word-graph-dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { WordGraphArcDto } from './word-graph-arc-dto'; - -export interface WordGraphDto { - sourceTokens: string[]; - initialStateScore: number; - finalStates: number[]; - arcs: WordGraphArcDto[]; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/job-details-dialog.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/job-details-dialog.component.ts index 7d7c2eff614..52ecc1d52c0 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/job-details-dialog.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/serval-administration/job-details-dialog.component.ts @@ -97,7 +97,7 @@ export class JobDetailsDialogComponent implements OnInit { }); // Fetch raw engine data (pre-translate is true for draft jobs) - this.draftGenerationService.getRawEngine(this.data.projectId, true).subscribe({ + this.draftGenerationService.getRawEngine(this.data.projectId).subscribe({ next: data => { this.engine = data; this.isLoadingEngine = false; diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.html index c206af99db5..2d15e766f1a 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.html +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.html @@ -51,25 +51,6 @@

{{ t("settings") }}

} } - @if (isTranslationSuggestionsEnabled || featureFlags.showDeveloperTools.enabled) { -
- @if (isBasedOnProjectSet) { -
- - {{ t("translation_suggestions") }} - - - -
- } @else { - {{ t("translation_suggestions_require_source_text") }} - } -
- }
diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.spec.ts index 29d96f58d69..0697a97abc5 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.spec.ts @@ -17,7 +17,7 @@ import { createTestProject } from 'realtime-server/lib/esm/scriptureforge/models import { TextAudio } from 'realtime-server/lib/esm/scriptureforge/models/text-audio'; import { createTestTextAudio } from 'realtime-server/lib/esm/scriptureforge/models/text-audio-test-data'; import { of } from 'rxjs'; -import { anything, capture, deepEqual, instance, mock, verify, when } from 'ts-mockito'; +import { anything, deepEqual, instance, mock, verify, when } from 'ts-mockito'; import { AuthService } from 'xforge-common/auth.service'; import { createTestFeatureFlag, FeatureFlagService } from 'xforge-common/feature-flags/feature-flag.service'; import { NoticeService } from 'xforge-common/notice.service'; @@ -189,14 +189,13 @@ describe('SettingsComponent', () => { expect(env.inputElement(env.biblicalTermsCheckbox).disabled).toBe(false); })); - describe('Translation Suggestions options', () => { + describe('Translate options', () => { it('should show the Paratext account notice when Paratext account not connected', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); + env.setupProject(); when(mockedParatextService.getParatextUsername()).thenReturn(of(undefined)); env.wait(); expect(env.paratextAccountNotice).not.toBeNull(); - expect(env.inputElement(env.translationSuggestionsCheckbox).disabled).toBe(false); expect(env.basedOnSelect).not.toBeNull(); })); @@ -213,78 +212,11 @@ describe('SettingsComponent', () => { expect(env.inputElement(env.basedOnSelect).disabled).toBe(true); })); - it('should hide Translation Suggestions when Based On is not set', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); - env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); - expect(env.basedOnSelect).not.toBeNull(); - expect(env.basedOnSelectValue).toContain('ParatextP1'); - - env.resetBasedOnProject(); - - expect(env.translationSuggestionsCheckbox).toBeNull(); - expect(env.basedOnSelectValue).toEqual(''); - })); - - it('should show Translation Suggestions when Based On is set and the feature flag is enabled', fakeAsync(() => { - const env = new TestEnvironment(); - when(mockedFeatureFlagService.showDeveloperTools).thenReturn(createTestFeatureFlag(true)); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: false, source: undefined } }, true); - env.wait(); - expect(env.translationSuggestionsCheckbox).toBeNull(); - expect(env.basedOnSelectValue).toEqual(''); - - env.setBasedOnValue('paratextId01'); - - expect(env.inputElement(env.translationSuggestionsCheckbox)).not.toBeNull(); - expect(env.basedOnSelectValue).toEqual('ParatextP1'); - })); - - it('should not show Translation Suggestions when Based On is set and the feature flag is not enabled', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: false, source: undefined } }, true); - env.wait(); - expect(env.translationSuggestionsCheckbox).toBeNull(); - expect(env.basedOnSelectValue).toEqual(''); - - env.setBasedOnValue('paratextId01'); - - expect(env.translationSuggestionsCheckbox).toBeNull(); - expect(env.basedOnSelectValue).toEqual('ParatextP1'); - })); - - it('should retain Based On value when Translation Suggestions is disabled', fakeAsync(() => { - const env = new TestEnvironment(); - when(mockedFeatureFlagService.showDeveloperTools).thenReturn(createTestFeatureFlag(true)); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); - env.wait(); - env.clickElement(env.inputElement(env.checkingCheckbox)); - expect(env.inputElement(env.checkingCheckbox).checked).toBe(true); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); - expect(env.basedOnSelect).not.toBeNull(); - expect(env.basedOnSelectValue).toContain('ParatextP1'); - - env.clickElement(env.inputElement(env.translationSuggestionsCheckbox)); - - env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(false); - expect(env.statusDone(env.translationSuggestionsStatus)).not.toBeNull(); - - env.clickElement(env.inputElement(env.translationSuggestionsCheckbox)); - - env.wait(); - expect(env.statusDone(env.translationSuggestionsStatus)).not.toBeNull(); - expect(env.basedOnSelect).not.toBeNull(); - expect(env.basedOnSelectValue).toContain('ParatextP1'); - })); - it('should change Based On select value', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); + env.setupProject(); env.wait(); env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); expect(env.basedOnSelect).not.toBeNull(); expect(env.basedOnSelectValue).toContain('ParatextP1'); expect(env.statusDone(env.basedOnStatus)).toBeNull(); @@ -297,7 +229,7 @@ describe('SettingsComponent', () => { it('should display Based On project even if user is not a member', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); + env.setupProject(); when(mockedParatextService.getProjects()).thenResolve([ { paratextId: 'paratextId02', @@ -315,7 +247,6 @@ describe('SettingsComponent', () => { env.wait(); env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); expect(env.basedOnSelect).not.toBeNull(); expect(env.basedOnSelectValue).toBe('ParatextP1'); expect(env.basedOnSelectProjectsResources.length).toEqual(1); @@ -324,58 +255,14 @@ describe('SettingsComponent', () => { it('should display projects then resources', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); + env.setupProject(); env.wait(); env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); expect(env.basedOnSelect).not.toBeNull(); expect(env.basedOnSelectProjectsResources.length).toEqual(5); expect(env.basedOnSelectProjectsResources[1].name).toBe('ParatextP2'); expect(env.basedOnSelectProjectsResources[2].name).toBe('Sob Jonah and Luke'); })); - - it('Translation Suggestions should remain unchanged when Based On is changed', fakeAsync(() => { - const env = new TestEnvironment(); - when(mockedFeatureFlagService.showDeveloperTools).thenReturn(createTestFeatureFlag(true)); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: false } }, true); - env.wait(); - expect(env.translationSuggestionsCheckbox).toBeNull(); - expect(env.basedOnSelectValue).toEqual(''); - - env.setBasedOnValue('paratextId01'); - expect(env.translationSuggestionsCheckbox).not.toBeNull(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(false); - expect(env.basedOnSelectValue).toContain('ParatextP1'); - - env.setBasedOnValue('paratextId02'); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(false); - expect(env.basedOnSelectValue).toContain('ParatextP2'); - expect(env.statusDone(env.translationSuggestionsStatus)).toBeNull(); - expect(env.statusDone(env.basedOnStatus)).not.toBeNull(); - - env.clickElement(env.inputElement(env.translationSuggestionsCheckbox)); - env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); - - env.setBasedOnValue('paratextId01'); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); - const [_, secondArg] = capture(mockedSFProjectService.onlineUpdateSettings).last(); - expect(secondArg).toEqual({ sourceParatextId: 'paratextId01', translationSuggestionsEnabled: true }); - })); - - it('should save Translation Suggestions only if Based On is set', fakeAsync(() => { - const env = new TestEnvironment(); - when(mockedFeatureFlagService.showDeveloperTools).thenReturn(createTestFeatureFlag(true)); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: false } }); - env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(false); - - env.clickElement(env.inputElement(env.translationSuggestionsCheckbox)); - env.wait(); - expect(env.inputElement(env.translationSuggestionsCheckbox).checked).toBe(true); - expect(env.statusDone(env.translationSuggestionsStatus)).not.toBeNull(); - expect(env.statusDone(env.basedOnStatus)).toBeNull(); - })); }); describe('Checking options', () => { @@ -693,17 +580,14 @@ describe('SettingsComponent', () => { it('should hide/disabled settings while loading', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: { translationSuggestionsEnabled: true } }); + env.setupProject(); env.fixture.detectChanges(); - expect(env.translationSuggestionsCheckbox).toBeNull(); expect(env.basedOnSelect).toBeNull(); expect(env.checkingCheckbox).not.toBeNull(); expect(env.inputElement(env.checkingCheckbox).disabled).toBe(true); env.wait(); - expect(env.translationSuggestionsCheckbox).not.toBeNull(); expect(env.basedOnSelect).not.toBeNull(); - expect(env.inputElement(env.translationSuggestionsCheckbox).disabled).toBe(false); expect(env.inputElement(env.checkingCheckbox).disabled).toBe(false); })); @@ -831,14 +715,6 @@ class TestEnvironment { return this.fixture.nativeElement.parentElement.querySelector('.cdk-overlay-container'); } - get translationSuggestionsCheckbox(): DebugElement { - return this.fixture.debugElement.query(By.css('#checkbox-translation-suggestions')); - } - - get translationSuggestionsStatus(): DebugElement { - return this.fixture.debugElement.query(By.css('#translation-suggestions-status')); - } - get basedOnSelect(): DebugElement { return this.fixture.debugElement.query(By.css('app-project-select#sourceParatextId')); } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.ts index 56bc798ff29..60a9c0ecf34 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/settings/settings.component.ts @@ -5,7 +5,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatCard, MatCardActions, MatCardContent, MatCardTitle } from '@angular/material/card'; import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialogConfig } from '@angular/material/dialog'; -import { MatError, MatHint } from '@angular/material/form-field'; +import { MatError } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; import { MatRadioButton, MatRadioGroup } from '@angular/material/radio'; import { ActivatedRoute, Router } from '@angular/router'; @@ -63,7 +63,6 @@ import { DeleteProjectDialogComponent } from './delete-project-dialog/delete-pro MatError, MatCheckbox, InfoComponent, - MatHint, MatRadioGroup, MatRadioButton, TranslocoMarkupComponent, @@ -73,7 +72,6 @@ import { DeleteProjectDialogComponent } from './delete-project-dialog/delete-pro ] }) export class SettingsComponent extends DataLoadingComponent implements OnInit { - translationSuggestionsEnabled = new FormControl(false); sourceParatextId = new FormControl(undefined); biblicalTermsEnabled = new FormControl(false); checkingEnabled = new FormControl(false); @@ -94,7 +92,6 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { SFProjectRole = SFProjectRole; form = new FormGroup({ - translationSuggestionsEnabled: this.translationSuggestionsEnabled, sourceParatextId: this.sourceParatextId, biblicalTermsEnabled: this.biblicalTermsEnabled, checkingEnabled: this.checkingEnabled, @@ -160,10 +157,6 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { return this.paratextUsername != null; } - get isTranslationSuggestionsEnabled(): boolean { - return this.translationSuggestionsEnabled.value ?? false; - } - get isCheckingEnabled(): boolean { return this.checkingEnabled.value ?? false; } @@ -318,23 +311,12 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { // Set status and include values for changed form items // Sometimes sourceParatextId is null | undefined for both new and previous values. A diff check needs to be made // but they also both need to be null when no value is set - const sourceProjectChanged: boolean = this.settingChanged(newValue, 'sourceParatextId'); - if (this.settingChanged(newValue, 'translationSuggestionsEnabled') && this.translationSuggestionsEnabled.enabled) { - // Translation suggestions is set to false or is re-enabled - this.updateSetting(newValue, 'translationSuggestionsEnabled'); - return; - } - // Check if the source project needs to be updated - if (sourceProjectChanged) { + if (this.settingChanged(newValue, 'sourceParatextId')) { + // Check if the source project needs to be updated const settings: SFProjectSettings = { sourceParatextId: - newValue.sourceParatextId != null ? newValue.sourceParatextId : SettingsComponent.projectSettingValueUnset, - // Keep this value consistent with the value of the form - translationSuggestionsEnabled: this.previousFormValues.translationSuggestionsEnabled + newValue.sourceParatextId != null ? newValue.sourceParatextId : SettingsComponent.projectSettingValueUnset }; - if (newValue.sourceParatextId == null) { - settings.translationSuggestionsEnabled = false; - } const updateTaskPromise = this.projectService.onlineUpdateSettings(this.projectDoc.id, settings); this.checkUpdateStatus('sourceParatextId', updateTaskPromise); this.previousFormValues = newValue; @@ -472,7 +454,6 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { return; } this.previousFormValues = { - translationSuggestionsEnabled: this.projectDoc.data.translateConfig.translationSuggestionsEnabled, sourceParatextId: this.projectDoc.data.translateConfig.source?.paratextId, biblicalTermsEnabled: this.projectDoc.data.biblicalTermsConfig.biblicalTermsEnabled, checkingEnabled: this.projectDoc.data.checkingConfig.checkingEnabled, @@ -506,10 +487,6 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { } private setIndividualControlDisabledStates(): void { - if (!this.isLoggedInToParatext && !this.isTranslationSuggestionsEnabled) { - this.translationSuggestionsEnabled.disable(); - } - if (this.projectDoc?.data?.biblicalTermsConfig.errorMessage == null) { this.biblicalTermsEnabled.enable({ onlySelf: true }); } else { @@ -520,7 +497,6 @@ export class SettingsComponent extends DataLoadingComponent implements OnInit { } private setAllControlsToInSync(): void { - this.controlStates.set('translationSuggestionsEnabled', ElementState.InSync); this.controlStates.set('sourceParatextId', ElementState.InSync); this.controlStates.set('biblicalTermsEnabled', ElementState.InSync); this.controlStates.set('checkingEnabled', ElementState.InSync); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/sync/sync-progress/sync-progress.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/sync/sync-progress/sync-progress.component.spec.ts index 8c9f4327977..92db685cda2 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/sync/sync-progress/sync-progress.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/sync/sync-progress/sync-progress.component.spec.ts @@ -84,8 +84,7 @@ describe('SyncProgressComponent', () => { it('show progress as source and target combined', fakeAsync(() => { const env = new TestEnvironment({ userId: 'user01', - sourceProject: 'sourceProject02', - translationSuggestionsEnabled: true + sourceProject: 'sourceProject02' }); env.setupProjectDoc(); env.checkCombinedProgress(); @@ -96,8 +95,7 @@ describe('SyncProgressComponent', () => { it('show source and target progress combined when translation suggestions disabled', fakeAsync(() => { const env = new TestEnvironment({ userId: 'user01', - sourceProject: 'sourceProject02', - translationSuggestionsEnabled: false + sourceProject: 'sourceProject02' }); env.setupProjectDoc(); env.checkCombinedProgress(); @@ -149,7 +147,6 @@ class HostComponent { interface TestEnvArgs { userId: string; sourceProject?: string; - translationSuggestionsEnabled?: boolean; isInProgress?: boolean; } @@ -170,7 +167,6 @@ class TestEnvironment { data: createTestProject( { translateConfig: { - translationSuggestionsEnabled: !!args.translationSuggestionsEnabled, source: args.sourceProject != null ? { diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-term-dialog.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-term-dialog.component.spec.ts index 65353edf4f3..ebdf14f9aa2 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-term-dialog.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-term-dialog.component.spec.ts @@ -190,9 +190,6 @@ class TestEnvironment { constructor() { this.setProjectUserConfig({ - confidenceThreshold: 0.5, - translationSuggestionsEnabled: true, - numSuggestions: 1, transliterateBiblicalTerms: false }); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-terms.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-terms.component.spec.ts index 3a02f6aa8bc..62a34c1b290 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-terms.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/biblical-terms/biblical-terms.component.spec.ts @@ -711,7 +711,6 @@ class TestEnvironment { data: createTestProjectUserConfig({ projectRef: 'project01', ownerRef: 'user01', - translationSuggestionsEnabled: false, questionRefsRead: ['question01'], answerRefsRead: ['answer01'], commentRefsRead: ['comment01'] @@ -723,7 +722,6 @@ class TestEnvironment { projectRef: 'project02', ownerRef: 'user01', transliterateBiblicalTerms: true, - translationSuggestionsEnabled: false, questionRefsRead: ['question01'], answerRefsRead: ['answer01'], commentRefsRead: ['comment01'] diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.component.spec.ts index cc7a9b3d201..d04ec48a8e9 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.component.spec.ts @@ -776,7 +776,6 @@ class TestEnvironment { sfProject0.translateConfig.source = usersSFResources[0]; sfProject0.translateConfig.draftConfig.draftingSources = [usersSFProjects[1]]; sfProject0.translateConfig.draftConfig.trainingSources = [usersSFResources[2], usersSFProjects[2]]; - sfProject0.translateConfig.translationSuggestionsEnabled = false; sfProject0.translateConfig.preTranslate = true; // Use a promise that resolves after the component is created to simulate the loading of projects diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.stories.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.stories.ts index 34decbc4398..2efbcfd9212 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.stories.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/configure-sources/configure-sources.stories.ts @@ -43,7 +43,6 @@ const projectDocWithExistingSources = { name: 'Russian Project', paratextId: 'project-5', translateConfig: { - translationSuggestionsEnabled: false, preTranslate: true, draftConfig: { draftingSources: [ diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.spec.ts index e8a9a7aee03..40587bf3cfb 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.spec.ts @@ -129,9 +129,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/id:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/id:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush(buildDto); tick(); @@ -360,9 +358,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/project:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/project:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush([buildDto]); tick(); @@ -384,9 +380,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/project:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/project:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush([legacyBuildDto, buildDto]); tick(); @@ -401,9 +395,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/project:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/project:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush(null, { status: HttpStatusCode.Unauthorized, statusText: 'Unauthorized' }); tick(); @@ -418,9 +410,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/project:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/project:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush(null, { status: HttpStatusCode.NotFound, statusText: 'Not Found' }); tick(); @@ -540,9 +530,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/id:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/id:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush(buildDto); tick(); @@ -557,9 +545,7 @@ describe('DraftGenerationService', () => { tick(); // Setup the HTTP request - const req = httpTestingController.expectOne( - `${MACHINE_API_BASE_URL}translation/builds/id:${projectId}?preTranslate=true` - ); + const req = httpTestingController.expectOne(`${MACHINE_API_BASE_URL}translation/builds/id:${projectId}`); expect(req.request.method).toEqual('GET'); req.flush(faultedBuild); tick(); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.ts index 1bf720cdd2c..2949e5c8511 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/draft-generation.service.ts @@ -70,7 +70,7 @@ export class DraftGenerationService { if (!this.onlineStatusService.isOnline) { return of(undefined); } - return this.httpClient.get(`translation/builds/id:${projectId}?preTranslate=true`).pipe( + return this.httpClient.get(`translation/builds/id:${projectId}`).pipe( map(res => res.data), catchError(err => { // If no build has ever been started, return undefined @@ -118,7 +118,7 @@ export class DraftGenerationService { if (!this.onlineStatusService.isOnline) { return of(undefined); } - return this.httpClient.get(`translation/builds/project:${projectId}?preTranslate=true`).pipe( + return this.httpClient.get(`translation/builds/project:${projectId}`).pipe( map(res => res.data), map(res => res?.filter( @@ -227,23 +227,21 @@ export class DraftGenerationService { if (!this.onlineStatusService.isOnline) { return of(undefined); } - return this.httpClient.get(`translation/builds/id:${buildId}/raw?preTranslate=true`).pipe( + return this.httpClient.get(`translation/builds/id:${buildId}/raw`).pipe( map(res => res.data), catchError(() => of(undefined)) ); } /** Gets the engine exactly as Serval returns it */ - getRawEngine(projectId: string, preTranslate: boolean): Observable { + getRawEngine(projectId: string): Observable { if (!this.onlineStatusService.isOnline) { return of(undefined); } - return this.httpClient - .get(`translation/engines/project:${projectId}/raw?pretranslate=${preTranslate}`) - .pipe( - map(res => res.data), - catchError(() => of(undefined)) - ); + return this.httpClient.get(`translation/engines/project:${projectId}/raw`).pipe( + map(res => res.data), + catchError(() => of(undefined)) + ); } /** diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/mock-pretranslation-machine-api.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/mock-pretranslation-machine-api.ts index 16b78dec097..d1f1e24eb5d 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/mock-pretranslation-machine-api.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/draft-generation/mock-pretranslation-machine-api.ts @@ -68,7 +68,7 @@ export class MockPreTranslationHttpClient { } get(url: string): Observable> { - const GET_BUILD_PROGRESS_URL_REGEX: RegExp = /^translation\/builds\/id:[^\/?]+\?preTranslate=true$/i; + const GET_BUILD_PROGRESS_URL_REGEX: RegExp = /^translation\/builds\/id:[^\/?]+$/i; const GET_LAST_COMPLETED_BUILD_URL_REGEX: RegExp = /^translation\/engines\/project:[^\/]+\/actions\/getLastCompletedPreTranslationBuild$/i; diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.html index e499a4e20ef..77a75e205fe 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.html +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.html @@ -1,7 +1,4 @@ - @if (translationSuggestionsEnabled && userHasGeneralEditRight) { - - }
@@ -196,14 +193,6 @@ [selectableVerses]="showAddCommentUI" [ngClass]="{ 'comment-enabled-editor': showAddCommentUI }" > -
{{ currentSegmentReference }} @@ -293,5 +282,4 @@ }
- diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.spec.ts index 14a13e5f5b1..916728493dc 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.spec.ts @@ -2,7 +2,6 @@ import { BreakpointObserver } from '@angular/cdk/layout'; import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { Location } from '@angular/common'; -import { HttpErrorResponse } from '@angular/common/http'; import { DebugElement, NgZone } from '@angular/core'; import { ComponentFixture, discardPeriodicTasks, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material/dialog'; @@ -10,17 +9,6 @@ import { MatTooltipHarness } from '@angular/material/tooltip/testing'; import { By } from '@angular/platform-browser'; import { provideNoopAnimations } from '@angular/platform-browser/animations'; import { ActivatedRoute, Params, provideRouter, Route, Router } from '@angular/router'; -import { - createRange, - InteractiveTranslatorFactory, - LatinWordDetokenizer, - LatinWordTokenizer, - ProgressStatus, - TranslationSources, - WordAlignmentMatrix, - WordGraph, - WordGraphArc -} from '@sillsdev/machine'; import { Canon, VerseRef } from '@sillsdev/scripture'; import userEvent, { UserEvent } from '@testing-library/user-event'; import { AngularSplitModule } from 'angular-split'; @@ -63,11 +51,10 @@ import { TextInfoPermission } from 'realtime-server/lib/esm/scriptureforge/model import { fromVerseRef } from 'realtime-server/lib/esm/scriptureforge/models/verse-ref-data'; import * as RichText from 'rich-text'; import { DeltaOperation, StringMap } from 'rich-text'; -import { BehaviorSubject, defer, firstValueFrom, Observable, of, Subject, take } from 'rxjs'; -import { anything, capture, deepEqual, instance, mock, resetCalls, verify, when } from 'ts-mockito'; +import { BehaviorSubject, firstValueFrom, Observable, of, Subject, take } from 'rxjs'; +import { anything, capture, deepEqual, instance, mock, verify, when } from 'ts-mockito'; import { ActivatedProjectService } from 'xforge-common/activated-project.service'; import { AuthService } from 'xforge-common/auth.service'; -import { CONSOLE } from 'xforge-common/browser-globals'; import { BugsnagService } from 'xforge-common/bugsnag.service'; import { GenericDialogComponent, GenericDialogOptions } from 'xforge-common/generic-dialog/generic-dialog.component'; import { UserDoc } from 'xforge-common/models/user-doc'; @@ -94,11 +81,8 @@ import { PermissionsService } from '../../core/permissions.service'; import { ProjectNotificationService } from '../../core/project-notification.service'; import { SFProjectService } from '../../core/sf-project.service'; import { TextDocService } from '../../core/text-doc.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; import { BuildDto } from '../../machine-api/build-dto'; import { BuildStates } from '../../machine-api/build-states'; -import { HttpClient } from '../../machine-api/http-client'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; import { CopyrightBannerComponent } from '../../shared/copyright-banner/copyright-banner.component'; import { provideCustomIcons } from '../../shared/custom-icons'; import { @@ -118,20 +102,17 @@ import { BiblicalTermsComponent } from '../biblical-terms/biblical-terms.compone import { DraftGenerationService } from '../draft-generation/draft-generation.service'; import { DraftOptionsService } from '../draft-generation/draft-options.service'; import { DraftPreviewBooksComponent } from '../draft-generation/draft-preview-books/draft-preview-books.component'; -import { TrainingProgressComponent } from '../training-progress/training-progress.component'; import { EditorDraftComponent } from './editor-draft/editor-draft.component'; import { HistoryRevisionFormatPipe } from './editor-history/history-chooser/history-revision-format.pipe'; -import { EditorComponent, UPDATE_SUGGESTIONS_TIMEOUT } from './editor.component'; +import { EditorComponent } from './editor.component'; import { LynxInsightEditorObjectsComponent } from './lynx/insights/lynx-insight-editor-objects/lynx-insight-editor-objects.component'; import { LynxInsightsPanelComponent } from './lynx/insights/lynx-insights-panel/lynx-insights-panel.component'; import { provideLynxInsights } from './lynx/insights/lynx-insights-providers'; import { LynxWorkspaceService } from './lynx/insights/lynx-workspace.service'; import { NoteDialogComponent, NoteDialogData, NoteDialogResult } from './note-dialog/note-dialog.component'; -import { SuggestionsComponent } from './suggestions.component'; import { EditorTabFactoryService } from './tabs/editor-tab-factory.service'; import { EditorTabMenuService } from './tabs/editor-tab-menu.service'; import { EditorTabInfo } from './tabs/editor-tabs.types'; -import { ACTIVE_EDIT_TIMEOUT } from './translate-metrics-session'; const mockedAuthService = mock(AuthService); const mockedSFProjectService = mock(SFProjectService); @@ -140,9 +121,7 @@ const mockedNoticeService = mock(NoticeService); const mockedActivatedRoute = mock(ActivatedRoute); const mockedBugsnagService = mock(BugsnagService); const mockedCookieService = mock(CookieService); -const mockedTranslationEngineService = mock(TranslationEngineService); const mockedMatDialog = mock(MatDialog); -const mockedHttpClient = mock(HttpClient); const mockedDraftGenerationService = mock(DraftGenerationService); const mockedDraftOptionsService = mock(DraftOptionsService); const mockedParatextService = mock(ParatextService); @@ -159,26 +138,12 @@ const ROUTES: Route[] = [ { path: 'projects', component: MockComponent } ]; -class MockConsole { - log(val: any): void { - if ( - typeof val !== 'string' || - (!/(Translated|Trained) segment, length: \d+, time: \d+\.\d+ms/.test(val) && - !/Segment \w+ of document \w+ was trained successfully\./.test(val)) - ) { - console.log(val); - } - } -} - describe('EditorComponent', () => { configureTestingModule(() => ({ imports: [ - SuggestionsComponent, HistoryRevisionFormatPipe, EditorComponent, EditorDraftComponent, - TrainingProgressComponent, BiblicalTermsComponent, CopyrightBannerComponent, DraftPreviewBooksComponent, @@ -204,14 +169,11 @@ describe('EditorComponent', () => { { provide: UserService, useMock: mockedUserService }, { provide: NoticeService, useMock: mockedNoticeService }, { provide: ActivatedRoute, useMock: mockedActivatedRoute }, - { provide: CONSOLE, useValue: new MockConsole() }, { provide: BugsnagService, useMock: mockedBugsnagService }, { provide: CookieService, useMock: mockedCookieService }, { provide: OnlineStatusService, useClass: TestOnlineStatusService }, - { provide: TranslationEngineService, useMock: mockedTranslationEngineService }, { provide: MatDialog, useMock: mockedMatDialog }, { provide: BreakpointObserver, useClass: TestBreakpointObserver }, - { provide: HttpClient, useMock: mockedHttpClient }, { provide: DraftGenerationService, useMock: mockedDraftGenerationService }, { provide: DraftOptionsService, useMock: mockedDraftOptionsService }, { provide: ParatextService, useMock: mockedParatextService }, @@ -283,9 +245,7 @@ describe('EditorComponent', () => { it('shows warning to users in Chrome when translation is Korean, Japanese, or Chinese', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ - writingSystem: { tag: 'ko' } - }); + env.setupProject({ writingSystem: { tag: 'ko' } }); env.wait(); expect(env.component.canEdit).toBe(true); @@ -303,9 +263,7 @@ describe('EditorComponent', () => { it('does not show warning to users when translation is not Korean, Japanese, or Chinese', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ - writingSystem: { tag: 'en' } - }); + env.setupProject({ writingSystem: { tag: 'en' } }); env.wait(); expect(env.component.canEdit).toBe(true); @@ -317,10 +275,7 @@ describe('EditorComponent', () => { it('does not show warning to users if they do not have edit permissions on the selected book', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ - writingSystem: { tag: 'ko' }, - translateConfig: defaultTranslateConfig - }); + env.setupProject({ writingSystem: { tag: 'ko' } }); // user03 only has read permissions on Luke 1 // As the editor is disabled, we do not need to show the writing system warning // The no_permission_edit_chapter message will be displayed instead @@ -382,7 +337,7 @@ describe('EditorComponent', () => { expect(env.component.chapters.length).toEqual(50); })); - describe('Translation Suggestions enabled', () => { + describe('Editing', () => { it('start with no previous selection', fakeAsync(() => { const env = new TestEnvironment(); env.setProjectUserConfig(); @@ -395,6 +350,7 @@ describe('EditorComponent', () => { const selection = env.targetEditor.getSelection(); expect(selection).toBeNull(); expect(env.invalidWarning).toBeNull(); + env.dispose(); })); @@ -406,12 +362,10 @@ describe('EditorComponent', () => { expect(env.component.chapter).toBe(2); expect(env.component.verse).toBe('1'); expect(env.component.target!.segmentRef).toEqual('verse_2_1'); - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).never(); const selection = env.targetEditor.getSelection(); expect(selection!.index).toBe(30); expect(selection!.length).toBe(0); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(false); + env.dispose(); })); @@ -423,14 +377,10 @@ describe('EditorComponent', () => { env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_2' }); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_2'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - expect(env.component.showSuggestions).toBe(false); resolve!(env.getTextDoc(sourceId)); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_2'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(true); env.dispose(); })); @@ -440,10 +390,7 @@ describe('EditorComponent', () => { env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(false); - resetCalls(env.mockedRemoteTranslationEngine); const range = env.component.target!.getSegmentRange('verse_1_3'); env.targetEditor.setSelection(range!.index, 0, 'user'); env.wait(); @@ -453,8 +400,6 @@ describe('EditorComponent', () => { expect(selection!.index).toBe(range!.index + 1); expect(selection!.length).toBe(0); expect(env.getProjectUserConfigDoc().data!.selectedSegment).toBe('verse_1_3'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(false); env.dispose(); })); @@ -465,7 +410,6 @@ describe('EditorComponent', () => { env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_1'); - resetCalls(env.mockedRemoteTranslationEngine); const range = env.component.target!.getSegmentRange('verse_1_2'); env.targetEditor.setSelection(range!.index + 1, 0, 'user'); env.wait(); @@ -474,9 +418,6 @@ describe('EditorComponent', () => { expect(selection!.index).toBe(33); expect(selection!.length).toBe(0); expect(env.getProjectUserConfigDoc().data!.selectedSegment).toBe('verse_1_2'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(true); - expect(env.component.suggestions[0].words).toEqual(['target']); env.dispose(); })); @@ -568,418 +509,22 @@ describe('EditorComponent', () => { env.dispose(); })); - it('selection not at end of incomplete segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - expect(env.component.target!.segmentRef).toBe(''); - - const range = env.component.target!.getSegmentRange('verse_1_5'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(false); - - env.dispose(); - })); - - it('selection at end of incomplete segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - expect(env.component.target!.segmentRef).toBe(''); - - const range = env.component.target!.getSegmentRange('verse_1_5'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(true); - expect(env.component.suggestions[0].words).toEqual(['verse', '5']); - - env.dispose(); - })); - - it('should increment offered suggestion count when inserting suggestion', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - expect(env.component.target!.segmentRef).toBe(''); - const range = env.component.target!.getSegmentRange('verse_1_5'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.component.showSuggestions).toBe(true); - expect(env.component.suggestions[0].words).toEqual(['verse', '5']); - expect(env.component.metricsSession?.metrics.type).toEqual('navigate'); - - env.insertSuggestion(); - - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - expect(env.component.showSuggestions).toBe(false); - expect(env.component.metricsSession?.metrics.type).toEqual('edit'); - expect(env.component.metricsSession?.metrics.suggestionTotalCount).toBe(1); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.component.metricsSession?.metrics.type).toEqual('edit'); - expect(env.component.metricsSession?.metrics.suggestionAcceptedCount).toBe(1); - expect(env.component.metricsSession?.metrics.suggestionTotalCount).toBe(1); - env.dispose(); - })); - - it("should not increment accepted suggestion if the content doesn't change", fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - expect(env.component.target!.segmentRef).toBe(''); - const range = env.component.target!.getSegmentRange('verse_1_5'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - env.typeCharacters('verse 5'); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - expect(env.component.showSuggestions).toBe(true); - expect(env.component.suggestions[0].words).toEqual(['5']); - expect(env.component.metricsSession?.metrics.type).toEqual('edit'); - expect(env.component.metricsSession?.metrics.suggestionTotalCount).toBe(1); - expect(env.component.metricsSession?.metrics.suggestionAcceptedCount).toBeUndefined(); - - env.insertSuggestion(); - - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - expect(env.component.showSuggestions).toBe(false); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.component.metricsSession?.metrics.type).toEqual('edit'); - expect(env.component.metricsSession?.metrics.suggestionTotalCount).toBe(1); - expect(env.component.metricsSession?.metrics.suggestionAcceptedCount).toBeUndefined(); - env.dispose(); - })); - - it('should display the verse too long error', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - // Change to the long verse - const range = env.component.target!.getSegmentRange('verse_1_6'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - - // Verify an error displayed - expect(env.component.target!.segmentRef).toBe('verse_1_6'); - expect(env.component.showSuggestions).toBe(false); - verify(mockedNoticeService.show(anything())).once(); - - env.dispose(); - })); - - it('should not display the verse too long error if user has suggestions disabled', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ - selectedBookNum: 40, - selectedChapterNum: 1, - selectedSegment: 'verse_1_5', - translationSuggestionsEnabled: false - }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(false); - - // Change to the long verse - const range = env.component.target!.getSegmentRange('verse_1_6'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - - // Verify an error did not display - expect(env.component.target!.segmentRef).toBe('verse_1_6'); - expect(env.component.showSuggestions).toBe(false); - verify(mockedNoticeService.show(anything())).never(); - - env.dispose(); - })); - - it('should not call getWordGraph if user has suggestions disabled', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ - selectedBookNum: 40, - selectedChapterNum: 1, - selectedSegment: 'verse_1_5', - translationSuggestionsEnabled: false - }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(false); - - // Change to the long verse - const range = env.component.target!.getSegmentRange('verse_1_6'); - env.targetEditor.setSelection(range!.index + range!.length, 0, 'user'); - env.wait(); - - // Verify an error did not display - expect(env.component.target!.segmentRef).toBe('verse_1_6'); - expect(env.component.showSuggestions).toBe(false); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - - env.dispose(); - })); - - it('insert suggestion in non-blank segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - expect(env.component.showSuggestions).toBe(false); - - env.dispose(); - })); - - it('insert second suggestion in non-blank segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ - selectedBookNum: 40, - selectedChapterNum: 1, - selectedSegment: 'verse_1_5', - numSuggestions: 2 - }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.downArrow(); - env.insertSuggestion(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, versa 5'); - expect(env.component.showSuggestions).toBe(false); - - env.dispose(); - })); - - it('insert space when typing character after inserting a suggestion', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(1); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse'); - expect(env.component.showSuggestions).toBe(true); - - const selectionIndex = env.typeCharacters('5.'); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5.'); - expect(env.component.showSuggestions).toBe(false); - const selection = env.targetEditor.getSelection(); - expect(selection!.index).toBe(selectionIndex + 1); - expect(selection!.length).toBe(0); - - env.dispose(); - })); - - it('insert space when inserting a suggestion after inserting a previous suggestion', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(1); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse'); - expect(env.component.showSuggestions).toBe(true); - - let selection = env.targetEditor.getSelection(); - const selectionIndex = selection!.index; - env.insertSuggestion(1); - expect(env.component.target!.segmentText).toEqual('target: chapter 1, verse 5'); - expect(env.component.showSuggestions).toBe(false); - selection = env.targetEditor.getSelection(); - expect(selection!.index).toBe(selectionIndex + 2); - expect(selection!.length).toBe(0); - - env.dispose(); - })); - - it('do not insert space when typing punctuation after inserting a suggestion', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(1); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse'); - expect(env.component.showSuggestions).toBe(true); - - const selectionIndex = env.typeCharacters('.'); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse.'); - expect(env.component.showSuggestions).toBe(false); - const selection = env.targetEditor.getSelection(); - expect(selection!.index).toBe(selectionIndex); - expect(selection!.length).toBe(0); - - env.dispose(); - })); - - it('train a modified segment after selecting a different segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - - const range = env.component.target!.getSegmentRange('verse_1_1'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.trainSegment(anything(), 'target: chapter 1, verse 5', true)).once(); - - env.dispose(); - })); - - it('does not train a modified segment after selecting a different segment if offline', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ - selectedTask: 'translate', - selectedBookNum: 40, - selectedChapterNum: 1, - selectedSegment: 'verse_1_5', - projectRef: 'project01' - }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - env.insertSuggestion(); - const text = 'target: chapter 1, verse 5'; - expect(env.component.target!.segmentText).toBe(text); - env.onlineStatus = false; - const range = env.component.target!.getSegmentRange('verse_1_1'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - verify(mockedTranslationEngineService.storeTrainingSegment('project01', 'project02', 40, 1, 'verse_1_5')).once(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.trainSegment(anything(), anything(), anything())).never(); - - env.dispose(); - })); - - it('train a modified segment after switching to another text and back', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - - env.routeWithParams({ projectId: 'project01', bookId: 'MRK' }); - env.wait(); - expect(env.bookName).toEqual('Mark'); - expect(env.component.target!.segmentRef).toEqual('verse_1_5'); - verify(env.mockedRemoteTranslationEngine.trainSegment(anything(), anything(), anything())).never(); - - env.routeWithParams({ projectId: 'project01', bookId: 'MAT' }); - env.wait(); - expect(env.bookName).toEqual('Matthew'); - expect(env.component.target!.segmentRef).toEqual('verse_1_5'); - const range = env.component.target!.getSegmentRange('verse_1_1'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.trainSegment(anything(), 'target: chapter 1, verse 5', true)).once(); - - env.dispose(); - })); - - it('train a modified segment after selecting a segment in a different text', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ - selectedTask: 'translate', - selectedBookNum: 40, - selectedChapterNum: 1, - selectedSegment: 'verse_1_5', - selectedSegmentChecksum: 0 - }); - env.routeWithParams({ projectId: 'project01', bookId: 'MRK' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe(''); - expect(env.component.showSuggestions).toBe(false); - - const range = env.component.target!.getSegmentRange('verse_1_1'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(mockedTranslationEngineService.trainSelectedSegment(anything(), anything())).once(); - - env.dispose(); - })); - - it('do not train an unmodified segment after selecting a different segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_5'); - expect(env.component.showSuggestions).toBe(true); - - env.insertSuggestion(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, verse 5'); - - const selection = env.targetEditor.getSelection(); - env.targetEditor.deleteText(selection!.index - 7, 7, 'user'); - env.wait(); - expect(env.component.target!.segmentText).toBe('target: chapter 1, '); - - const range = env.component.target!.getSegmentRange('verse_1_1'); - env.targetEditor.setSelection(range!.index, 0, 'user'); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.trainSegment(anything(), anything(), anything())).never(); - - env.dispose(); - })); - - it('does not build machine project if no source books exists', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - when(mockedTranslationEngineService.checkHasSourceBooks(anything())).thenReturn(false); - env.wait(); - verify(mockedTranslationEngineService.createTranslationEngine(anything())).never(); - env.routeWithParams({ projectId: 'project02', bookId: 'MAT' }); - env.wait(); - verify(mockedTranslationEngineService.createTranslationEngine(anything())).never(); - expect().nothing(); - env.dispose(); - })); - it('change texts', fakeAsync(() => { const env = new TestEnvironment(); env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); env.wait(); expect(env.bookName).toEqual('Matthew'); expect(env.component.target!.segmentRef).toEqual('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - resetCalls(env.mockedRemoteTranslationEngine); env.routeWithParams({ projectId: 'project01', bookId: 'MRK' }); env.wait(); expect(env.bookName).toEqual('Mark'); expect(env.component.target!.segmentRef).toEqual('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - resetCalls(env.mockedRemoteTranslationEngine); env.routeWithParams({ projectId: 'project01', bookId: 'MAT' }); env.wait(); expect(env.bookName).toEqual('Matthew'); expect(env.component.target!.segmentRef).toEqual('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); env.dispose(); })); @@ -991,23 +536,18 @@ describe('EditorComponent', () => { env.wait(); expect(env.component.chapter).toBe(1); expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - resetCalls(env.mockedRemoteTranslationEngine); env.component.chapter = 2; env.routeWithParams({ projectId: 'project01', bookId: 'MAT', chapter: '2' }); env.wait(); const verseText = env.component.target!.getSegmentText('verse_2_1'); expect(verseText).toBe('target: chapter 2, verse 1.'); expect(env.component.target!.segmentRef).toEqual('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - resetCalls(env.mockedRemoteTranslationEngine); env.component.chapter = 1; env.routeWithParams({ projectId: 'project01', bookId: 'MAT', chapter: '1' }); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_1'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); }); env.dispose(); })); @@ -1033,87 +573,6 @@ describe('EditorComponent', () => { env.dispose(); })); - it('training status', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - expect(env.trainingProgress).toBeNull(); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - - resetCalls(env.mockedRemoteTranslationEngine); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - env.updateTrainingProgress(1); - expect(env.trainingCompleteIcon).not.toBeNull(); - expect(env.trainingProgressSpinner).toBeNull(); - env.completeTrainingProgress(); - expect(env.trainingProgress).not.toBeNull(); - tick(5000); - env.wait(); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - expect(env.trainingProgress).toBeNull(); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - - env.dispose(); - })); - - it('close training status', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - expect(env.trainingProgress).toBeNull(); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - - resetCalls(env.mockedRemoteTranslationEngine); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - env.clickTrainingProgressCloseButton(); - expect(env.trainingProgress).toBeNull(); - env.updateTrainingProgress(1); - env.completeTrainingProgress(); - env.wait(); - verify(mockedNoticeService.show(anything())).once(); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - - env.dispose(); - })); - - it('error in training status', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); - env.wait(); - expect(env.component.target!.segmentRef).toBe('verse_1_1'); - expect(env.trainingProgress).toBeNull(); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - - resetCalls(env.mockedRemoteTranslationEngine); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - env.throwTrainingProgressError(); - expect(env.trainingProgress).toBeNull(); - - tick(30000); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - expect(env.trainingProgressSpinner).not.toBeNull(); - - env.dispose(); - })); - it('source is missing book/text', fakeAsync(() => { const env = new TestEnvironment(); env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 1, selectedSegment: 'verse_1_1' }); @@ -1127,8 +586,6 @@ describe('EditorComponent', () => { const selection = env.targetEditor.getSelection(); expect(selection!.index).toBe(50); expect(selection!.length).toBe(0); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - expect(env.component.showSuggestions).toBe(false); env.dispose(); })); @@ -1275,14 +732,12 @@ describe('EditorComponent', () => { env.targetEditor.setSelection(range!.index + 1, 0, 'user'); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_2'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).once(); // Change user role on the project and run a sync to force remote updates env.changeUserRole(projectId, userId, SFProjectRole.Viewer); env.setDataInSync(projectId, true, false); env.setDataInSync(projectId, false, false); env.wait(); - resetCalls(env.mockedRemoteTranslationEngine); projectDoc = env.getProjectDoc(projectId); expect(projectDoc.data?.userRoles[userId]).toBe(SFProjectRole.Viewer); @@ -1293,7 +748,6 @@ describe('EditorComponent', () => { env.targetEditor.setSelection(range!.index + 1, 0, 'user'); env.wait(); expect(env.component.target!.segmentRef).toBe('verse_1_3'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); env.dispose(); })); @@ -1325,7 +779,6 @@ describe('EditorComponent', () => { const env = new TestEnvironment(); env.setupProject({ translateConfig: { - translationSuggestionsEnabled: true, source: { paratextId: 'resource01', name: 'Resource 1', @@ -1363,8 +816,6 @@ describe('EditorComponent', () => { expect(env.component.chapter).toBe(1); expect(env.component.sourceLabel).toEqual('SRC'); expect(env.component.targetLabel).toEqual('TRG'); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - expect(env.component.showSuggestions).toBe(false); const sourceText = env.sourceTextEditorPlaceholder.getAttribute('data-placeholder'); expect(sourceText).not.toEqual('This book does not exist.'); expect(env.component.target!.readOnlyEnabled).toBe(true); @@ -1592,26 +1043,111 @@ describe('EditorComponent', () => { expect(Object.keys(attributes)).toEqual(['segment']); env.dispose(); })); - }); - describe('Note threads', () => { - it('embeds note on verse segments', fakeAsync(() => { + it('translator cannot edit a chapter without edit permission on chapter', fakeAsync(() => { const env = new TestEnvironment(); - env.addParatextNoteThread(6, 'MAT 1:2', '', { start: 0, length: 0 }, ['user01']); - env.addParatextNoteThread( - 7, - 'LUK 1:0', - 'for chapter', - { start: 6, length: 11 }, - ['user01'], - NoteStatus.Todo, - 'user02' - ); - env.addParatextNoteThread(8, 'LUK 1:2-3', '', { start: 0, length: 0 }, ['user01'], NoteStatus.Todo, 'user01'); - env.addParatextNoteThread( - 9, - 'LUK 1:2-3', - 'section heading', + env.setupProject(); + env.setCurrentUser('user03'); + env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 1 }); + env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); + env.wait(); + expect(env.bookName).toEqual('Luke'); + expect(env.component.chapter).toBe(1); + expect(env.component.sourceLabel).toEqual('SRC'); + expect(env.component.targetLabel).toEqual('TRG'); + expect(env.component.target!.segmentRef).toEqual(''); + const selection = env.targetEditor.getSelection(); + expect(selection).toBeNull(); + expect(env.component.userHasGeneralEditRight).toBe(true); + expect(env.component.hasChapterEditPermission).toBe(false); + expect(env.component.canEdit).toBe(false); + expect(env.isSourceAreaHidden).toBe(false); + expect(env.noChapterEditPermissionMessage).toBeTruthy(); + env.dispose(); + })); + + it('prevents editing and informs user when text doc is corrupted', fakeAsync(() => { + const env = new TestEnvironment(); + env.setupProject(); + env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 3 }); + env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); + env.wait(); + expect(env.component.hasEditRight).toBe(true); + expect(env.component.canEdit).toBe(false); + expect(env.corruptedWarning).not.toBeNull(); + env.dispose(); + })); + + it('shows the copyright banner', fakeAsync(() => { + const env = new TestEnvironment(); + env.setupProject({ copyrightBanner: 'banner text' }); + env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 3 }); + env.routeWithParams({ projectId: 'project01', bookId: 'MAT' }); + env.wait(); + expect(env.copyrightBanner).not.toBeNull(); + env.dispose(); + })); + + it('sets book and chapter according to route', fakeAsync(() => { + const navigationParams: Params = { projectId: 'project01', bookId: 'MAT', chapter: '2' }; + const env = new TestEnvironment(); + + env.setProjectUserConfig(); + env.routeWithParams(navigationParams); + env.wait(); + + expect(env.bookName).toEqual('Matthew'); + expect(env.component.chapter).toBe(2); + + env.dispose(); + })); + + it('source uses font from source project, not target project', fakeAsync(() => { + const env = new TestEnvironment(); + // Set different fonts for target and source projects + env.setupProject({ defaultFont: 'Arial' }, 'project01'); // target project + env.setupProject({ defaultFont: 'Andika' }, 'project02'); // source project + env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1 }); + env.wait(); + + expect(env.component.source).toBeTruthy(); + expect(env.component.sourceProjectDoc?.data?.defaultFont).toBe('Andika'); + expect(env.component.projectDoc?.data?.defaultFont).toBe('Arial'); + + // Get the source app-text element + const sourceTextElement = env.fixture.debugElement.query(By.css('#source-text-area app-text')); + expect(sourceTextElement).toBeTruthy(); + + // Check that the source has the correct CSS custom property set + const sourceStyle = sourceTextElement.nativeElement.style; + const projectFontValue = sourceStyle.getPropertyValue('--project-font'); + + // The source should use Andika (from project02), not Arial (from project01) + expect(projectFontValue).toContain('Andika'); + expect(projectFontValue).not.toContain('Arial'); + + env.dispose(); + })); + }); + + describe('Note threads', () => { + it('embeds note on verse segments', fakeAsync(() => { + const env = new TestEnvironment(); + env.addParatextNoteThread(6, 'MAT 1:2', '', { start: 0, length: 0 }, ['user01']); + env.addParatextNoteThread( + 7, + 'LUK 1:0', + 'for chapter', + { start: 6, length: 11 }, + ['user01'], + NoteStatus.Todo, + 'user02' + ); + env.addParatextNoteThread(8, 'LUK 1:2-3', '', { start: 0, length: 0 }, ['user01'], NoteStatus.Todo, 'user01'); + env.addParatextNoteThread( + 9, + 'LUK 1:2-3', + 'section heading', { start: 38, length: 15 }, ['user01'], NoteStatus.Todo, @@ -3511,463 +3047,156 @@ describe('EditorComponent', () => { env.clickSegmentRef(segmentRef); env.wait(); - // Scroll, keeping selected segment in view - const scrollContainer: Element = env.component['targetScrollContainer'] as Element; - scrollContainer.scrollTop = 20; - scrollContainer.dispatchEvent(new Event('scroll')); - - const segmentElRect = env.getSegmentElement(segmentRef)!.getBoundingClientRect(); - const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); - expect(Math.ceil(fabRect.top)).toEqual(Math.ceil(segmentElRect.top)); - - env.dispose(); - })); - - it('should position FAB within scroll container when scrolling segment above view', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - - // Set window size to be narrow to test scrolling - const contentContainer: HTMLElement = document.getElementsByClassName('content')[0] as HTMLElement; - Object.assign(contentContainer.style, { width: '360px', height: '300px' }); - - // Verse near top of scroll container - const segmentRef = 'verse_1_1'; - - // Select segment - env.clickSegmentRef(segmentRef); - env.wait(); - - const scrollContainer: Element = env.component['targetScrollContainer'] as Element; - const scrollContainerRect: DOMRect = scrollContainer.getBoundingClientRect(); - - // Scroll segment above view - scrollContainer.scrollTop = 200; - scrollContainer.dispatchEvent(new Event('scroll')); - - const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); - expect(Math.ceil(fabRect.top)).toEqual(Math.ceil(scrollContainerRect.top + env.component.fabVerticalCushion)); - - env.dispose(); - })); - - it('should position FAB within scroll container when scrolling segment below view', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig(); - env.wait(); - - // Set window size to be narrow to test scrolling - const contentContainer: HTMLElement = document.getElementsByClassName('content')[0] as HTMLElement; - Object.assign(contentContainer.style, { width: '680px', height: '300px' }); - - // Verse near bottom of scroll container - const segmentRef = 'verse_1_6'; - - // Select segment - env.clickSegmentRef(segmentRef); - env.wait(); - - const scrollContainer: Element = env.component['targetScrollContainer'] as Element; - const scrollContainerRect: DOMRect = scrollContainer.getBoundingClientRect(); - - // Scroll segment below view - scrollContainer.scrollTop = 0; - scrollContainer.dispatchEvent(new Event('scroll')); - - const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); - expect(Math.ceil(fabRect.bottom)).toEqual( - Math.ceil(scrollContainerRect.bottom - env.component.fabVerticalCushion) - ); - - env.dispose(); - })); - }); - - describe('Translator settings enabled/disabled', () => { - it('shows translator settings when translation suggestions are enabled but lynx features are disabled', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: true }, - lynxConfig: { - autoCorrectionsEnabled: false, - assessmentsEnabled: false - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeTruthy(); - env.dispose(); - })); - - it('hides translator settings when suggestions are enabled for the project but user cant edit', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: true } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setCurrentUser('user06'); //has read but not edit - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeFalsy(); - env.dispose(); - })); - - it('hides translator settings when both translation suggestions and lynx features are disabled', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: false }, - lynxConfig: { - autoCorrectionsEnabled: false, - assessmentsEnabled: false - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeFalsy(); - env.dispose(); - })); - - it('hides translator settings when lynx features are enabled but user cant edit', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: false }, - lynxConfig: { - autoCorrectionsEnabled: true, - assessmentsEnabled: true - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setCurrentUser('user06'); //has read but not edit - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeFalsy(); - env.dispose(); - })); - - it('shows translator settings when suggestions are disabled but lynx features are enabled', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: false }, - lynxConfig: { - autoCorrectionsEnabled: true, - assessmentsEnabled: false - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeTruthy(); - env.dispose(); - })); - - it('shows translator settings when both suggestions and lynx features are enabled', fakeAsync(() => { - const projectConfig = { - translateConfig: { ...defaultTranslateConfig, translationSuggestionsEnabled: true }, - lynxConfig: { - autoCorrectionsEnabled: true, - assessmentsEnabled: true - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeTruthy(); - env.dispose(); - })); - - it('shows translator settings when lynx features are enabled but no source access', fakeAsync(() => { - const projectConfig = { - translateConfig: { translationSuggestionsEnabled: false }, - lynxConfig: { - autoCorrectionsEnabled: true, - assessmentsEnabled: false - } - }; - const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - - const env = new TestEnvironment(); - // Remove source from project to simulate no source access - delete env.testProjectProfile.translateConfig.source; - env.setupProject(projectConfig); - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - expect(env.translatorSettingsButton).toBeTruthy(); - env.dispose(); - })); - - it('suggestion-words inherits project font from CSS custom property', fakeAsync(() => { - const env = new TestEnvironment(); - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1, selectedSegment: 'verse_1_5' }); - env.wait(); - expect(env.component.showSuggestions).toBe(true); - - const rootElement = document.documentElement; - rootElement.style.setProperty('--project-font', 'Charis SIL'); - env.fixture.detectChanges(); - tick(); - - const suggestionWords = env.fixture.debugElement.query(By.css('.suggestion-words')); - expect(suggestionWords).toBeTruthy(); - const computedStyle = window.getComputedStyle(suggestionWords.nativeElement); - expect(computedStyle.fontFamily).toContain('Charis SIL'); - - rootElement.style.removeProperty('--project-font'); - env.dispose(); - })); - - it('source uses font from source project, not target project', fakeAsync(() => { - const env = new TestEnvironment(); - // Set different fonts for target and source projects - env.setupProject({ defaultFont: 'Arial' }, 'project01'); // target project - env.setupProject({ defaultFont: 'Andika' }, 'project02'); // source project - env.setProjectUserConfig({ selectedBookNum: 40, selectedChapterNum: 1 }); - env.wait(); - - expect(env.component.source).toBeTruthy(); - expect(env.component.sourceProjectDoc?.data?.defaultFont).toBe('Andika'); - expect(env.component.projectDoc?.data?.defaultFont).toBe('Arial'); - - // Get the source app-text element - const sourceTextElement = env.fixture.debugElement.query(By.css('#source-text-area app-text')); - expect(sourceTextElement).toBeTruthy(); - - // Check that the source has the correct CSS custom property set - const sourceStyle = sourceTextElement.nativeElement.style; - const projectFontValue = sourceStyle.getPropertyValue('--project-font'); - - // The source should use Andika (from project02), not Arial (from project01) - expect(projectFontValue).toContain('Andika'); - expect(projectFontValue).not.toContain('Arial'); - - env.dispose(); - })); - }); - - describe('Translation Suggestions disabled', () => { - it('start with no previous selection', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setProjectUserConfig(); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); - env.wait(); - expect(env.bookName).toEqual('Luke'); - expect(env.component.chapter).toBe(1); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - env.dispose(); - })); - - it('start with previously selected segment', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 2, selectedSegment: 'verse_2_1' }); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); - env.wait(); - expect(env.bookName).toEqual('Luke'); - expect(env.component.chapter).toBe(2); - expect(env.component.verse).toBe('1'); - expect(env.component.target!.segmentRef).toEqual('verse_2_1'); - const selection = env.targetEditor.getSelection(); - expect(selection!.index).toBe(50); - expect(selection!.length).toBe(0); - verify(env.mockedRemoteTranslationEngine.getWordGraph(anything())).never(); - expect(env.component.showSuggestions).toBe(false); - env.dispose(); - })); - - it('user cannot edit', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setCurrentUser('user02'); - env.setProjectUserConfig(); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); - env.wait(); - expect(env.bookName).toEqual('Luke'); - expect(env.component.chapter).toBe(1); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.canEdit).toBe(false); + // Scroll, keeping selected segment in view + const scrollContainer: Element = env.component['targetScrollContainer'] as Element; + scrollContainer.scrollTop = 20; + scrollContainer.dispatchEvent(new Event('scroll')); + + const segmentElRect = env.getSegmentElement(segmentRef)!.getBoundingClientRect(); + const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); + expect(Math.ceil(fabRect.top)).toEqual(Math.ceil(segmentElRect.top)); + env.dispose(); })); - it('user can edit a chapter with permission', fakeAsync(() => { + it('should position FAB within scroll container when scrolling segment above view', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setCurrentUser('user03'); - env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 2 }); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); + env.setProjectUserConfig(); env.wait(); - expect(env.bookName).toEqual('Luke'); - expect(env.component.chapter).toBe(2); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.canEdit).toBe(true); - env.dispose(); - })); - it('translator cannot edit a chapter without edit permission on chapter', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setCurrentUser('user03'); - env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 1 }); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); + // Set window size to be narrow to test scrolling + const contentContainer: HTMLElement = document.getElementsByClassName('content')[0] as HTMLElement; + Object.assign(contentContainer.style, { width: '360px', height: '300px' }); + + // Verse near top of scroll container + const segmentRef = 'verse_1_1'; + + // Select segment + env.clickSegmentRef(segmentRef); env.wait(); - expect(env.bookName).toEqual('Luke'); - expect(env.component.chapter).toBe(1); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.userHasGeneralEditRight).toBe(true); - expect(env.component.hasChapterEditPermission).toBe(false); - expect(env.component.canEdit).toBe(false); - expect(env.isSourceAreaHidden).toBe(false); - expect(env.noChapterEditPermissionMessage).toBeTruthy(); + + const scrollContainer: Element = env.component['targetScrollContainer'] as Element; + const scrollContainerRect: DOMRect = scrollContainer.getBoundingClientRect(); + + // Scroll segment above view + scrollContainer.scrollTop = 200; + scrollContainer.dispatchEvent(new Event('scroll')); + + const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); + expect(Math.ceil(fabRect.top)).toEqual(Math.ceil(scrollContainerRect.top + env.component.fabVerticalCushion)); + env.dispose(); })); - it('user has no resource access', fakeAsync(() => { - when(mockedSFProjectService.getProfile('resource01')).thenResolve({ - id: 'resource01', - data: createTestProjectProfile() - } as SFProjectProfileDoc); - + it('should position FAB within scroll container when scrolling segment below view', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ - translateConfig: { - translationSuggestionsEnabled: false, - source: { - paratextId: 'resource01', - name: 'Resource 1', - shortName: 'SRC', - projectRef: 'resource01', - writingSystem: { - tag: 'qaa' - } - } - } - }); - env.setCurrentUser('user01'); env.setProjectUserConfig(); - env.routeWithParams({ projectId: 'project01', bookId: 'ACT' }); env.wait(); - verify(mockedSFProjectService.get('resource01')).never(); - expect(env.bookName).toEqual('Acts'); - expect(env.component.chapter).toBe(1); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.canEdit).toBe(true); + + // Set window size to be narrow to test scrolling + const contentContainer: HTMLElement = document.getElementsByClassName('content')[0] as HTMLElement; + Object.assign(contentContainer.style, { width: '680px', height: '300px' }); + + // Verse near bottom of scroll container + const segmentRef = 'verse_1_6'; + + // Select segment + env.clickSegmentRef(segmentRef); + env.wait(); + + const scrollContainer: Element = env.component['targetScrollContainer'] as Element; + const scrollContainerRect: DOMRect = scrollContainer.getBoundingClientRect(); + + // Scroll segment below view + scrollContainer.scrollTop = 0; + scrollContainer.dispatchEvent(new Event('scroll')); + + const fabRect = env.insertNoteFab.nativeElement.getBoundingClientRect(); + expect(Math.ceil(fabRect.bottom)).toEqual( + Math.ceil(scrollContainerRect.bottom - env.component.fabVerticalCushion) + ); + env.dispose(); })); + }); + + describe('Translator settings enabled/disabled', () => { + it('hides translator settings when lynx features are disabled', fakeAsync(() => { + const projectConfig = { + lynxConfig: { + autoCorrectionsEnabled: false, + assessmentsEnabled: false + } + }; + const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; - it('chapter is invalid', fakeAsync(() => { const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); + env.setupProject(projectConfig); env.setProjectUserConfig(); - env.routeWithParams({ projectId: 'project01', bookId: 'MRK' }); + env.routeWithParams(navigationParams); env.wait(); - expect(env.bookName).toEqual('Mark'); - expect(env.component.chapter).toBe(1); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.canEdit).toBe(false); - expect(env.invalidWarning).not.toBeNull(); + expect(env.translatorSettingsButton).toBeFalsy(); env.dispose(); })); - it('first chapter is missing', fakeAsync(() => { + it('hides translator settings when lynx features are enabled but user cant edit', fakeAsync(() => { + const projectConfig = { + lynxConfig: { + autoCorrectionsEnabled: true, + assessmentsEnabled: true + } + }; + const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; + const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); + env.setCurrentUser('user06'); //has read but not edit + env.setupProject(projectConfig); env.setProjectUserConfig(); - env.routeWithParams({ projectId: 'project01', bookId: 'ROM' }); + env.routeWithParams(navigationParams); env.wait(); - expect(env.bookName).toEqual('Romans'); - expect(env.component.chapter).toBe(2); - expect(env.component.sourceLabel).toEqual('SRC'); - expect(env.component.targetLabel).toEqual('TRG'); - expect(env.component.target!.segmentRef).toEqual(''); - const selection = env.targetEditor.getSelection(); - expect(selection).toBeNull(); - expect(env.component.canEdit).toBe(true); + expect(env.translatorSettingsButton).toBeFalsy(); env.dispose(); })); - it('prevents editing and informs user when text doc is corrupted', fakeAsync(() => { + it('shows translator settings when lynx features are enabled', fakeAsync(() => { + const projectConfig = { + lynxConfig: { + autoCorrectionsEnabled: true, + assessmentsEnabled: true + } + }; + const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; + const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig }); - env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 3 }); - env.routeWithParams({ projectId: 'project01', bookId: 'LUK' }); + env.setupProject(projectConfig); + env.setProjectUserConfig(); + env.routeWithParams(navigationParams); env.wait(); - expect(env.component.hasEditRight).toBe(true); - expect(env.component.canEdit).toBe(false); - expect(env.corruptedWarning).not.toBeNull(); + expect(env.translatorSettingsButton).toBeTruthy(); env.dispose(); })); - it('shows the copyright banner', fakeAsync(() => { + it('shows translator settings when lynx features are enabled but no source access', fakeAsync(() => { + const projectConfig = { + lynxConfig: { + autoCorrectionsEnabled: true, + assessmentsEnabled: false + } + }; + const navigationParams: Params = { projectId: 'project01', bookId: 'MRK' }; + const env = new TestEnvironment(); - env.setupProject({ translateConfig: defaultTranslateConfig, copyrightBanner: 'banner text' }); - env.setProjectUserConfig({ selectedBookNum: 42, selectedChapterNum: 3 }); - env.routeWithParams({ projectId: 'project01', bookId: 'MAT' }); + // Remove source from project to simulate no source access + delete env.testProjectProfile.translateConfig.source; + env.setupProject(projectConfig); + env.setProjectUserConfig(); + env.routeWithParams(navigationParams); env.wait(); - expect(env.copyrightBanner).not.toBeNull(); + expect(env.translatorSettingsButton).toBeTruthy(); env.dispose(); })); }); - it('sets book and chapter according to route', fakeAsync(() => { - const navigationParams: Params = { projectId: 'project01', bookId: 'MAT', chapter: '2' }; - const env = new TestEnvironment(); - - env.setProjectUserConfig(); - env.routeWithParams(navigationParams); - env.wait(); - - expect(env.bookName).toEqual('Matthew'); - expect(env.component.chapter).toBe(2); - - env.dispose(); - })); - describe('tabs', () => { describe('blank tab', () => { it('should add a blank tab when no source', fakeAsync(() => { @@ -4676,14 +3905,9 @@ describe('EditorComponent', () => { }); }); -const defaultTranslateConfig = { - translationSuggestionsEnabled: false -}; - class TestEnvironment { readonly component: EditorComponent; readonly fixture: ComponentFixture; - readonly mockedRemoteTranslationEngine = mock(RemoteTranslationEngine); readonly activatedProjectService: ActivatedProjectService; readonly router: Router; readonly location: Location; @@ -4705,11 +3929,8 @@ class TestEnvironment { user07: SFProjectRole.Viewer }; private paratextUsersOnProject = paratextUsersFromRoles(this.userRolesOnProject); - private tokenizer = new LatinWordTokenizer(); - private detokenizer = new LatinWordDetokenizer(); private readonly realtimeService: TestRealtimeService; private readonly params$: BehaviorSubject; - private trainingProgress$ = new Subject(); private textInfoPermissions = { user01: TextInfoPermission.Write, user02: TextInfoPermission.None, @@ -4731,7 +3952,6 @@ class TestEnvironment { isRightToLeft: false, userRoles: this.userRolesOnProject, translateConfig: { - translationSuggestionsEnabled: true, defaultNoteTagId: 2, source: { paratextId: 'source01', @@ -4856,21 +4076,6 @@ class TestEnvironment { when(mockedActivatedRoute.params).thenReturn(this.params$); when(mockedActivatedRoute.snapshot).thenReturn({ queryParams: {} } as any); - when(mockedTranslationEngineService.createTranslationEngine('project01')).thenReturn( - instance(this.mockedRemoteTranslationEngine) - ); - when(mockedTranslationEngineService.createTranslationEngine('project02')).thenReturn( - instance(this.mockedRemoteTranslationEngine) - ); - when(mockedTranslationEngineService.createInteractiveTranslatorFactory(anything())).thenReturn( - new InteractiveTranslatorFactory(instance(this.mockedRemoteTranslationEngine), this.tokenizer, this.detokenizer) - ); - when(mockedTranslationEngineService.checkHasSourceBooks(anything())).thenReturn(true); - when(this.mockedRemoteTranslationEngine.getWordGraph(anything())).thenCall(segment => - Promise.resolve(this.createWordGraph(segment)) - ); - when(this.mockedRemoteTranslationEngine.trainSegment(anything(), anything(), anything())).thenResolve(); - when(this.mockedRemoteTranslationEngine.listenForTrainingStatus()).thenReturn(defer(() => this.trainingProgress$)); when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenResolve(); when(mockedSFProjectService.getProfile('project01')).thenCall(() => this.realtimeService.subscribe(SFProjectProfileDoc.COLLECTION, 'project01') @@ -5063,26 +4268,6 @@ class TestEnvironment { return this.fixture.debugElement.query(By.css('app-share-button')); } - get suggestions(): DebugElement { - return this.fixture.debugElement.query(By.css('app-suggestions')); - } - - get trainingProgress(): DebugElement { - return this.fixture.debugElement.query(By.css('.training-progress')); - } - - get trainingProgressSpinner(): DebugElement { - return this.trainingProgress.query(By.css('#training-progress-spinner')); - } - - get trainingCompleteIcon(): DebugElement { - return this.trainingProgress.query(By.css('#training-complete-icon')); - } - - get trainingProgressCloseButton(): DebugElement { - return this.trainingProgress.query(By.css('#training-close-button')); - } - get targetTextEditor(): HTMLElement { return this.fixture.debugElement.query(By.css('#target-text-area .ql-container')).nativeElement; } @@ -5204,10 +4389,6 @@ class TestEnvironment { if (data.writingSystem != null) { projectProfileData.writingSystem = data.writingSystem as WritingSystem; } - if (data.translateConfig?.translationSuggestionsEnabled != null) { - projectProfileData.translateConfig.translationSuggestionsEnabled = - data.translateConfig.translationSuggestionsEnabled; - } if (data.translateConfig?.preTranslate != null) { projectProfileData.translateConfig.preTranslate = data.translateConfig.preTranslate; } @@ -5380,39 +4561,15 @@ class TestEnvironment { wait(): void { this.fixture.detectChanges(); - tick(); - this.fixture.detectChanges(); - tick(UPDATE_SUGGESTIONS_TIMEOUT); + tick(100); // Give the editor time to respond this.fixture.detectChanges(); tick(); - this.fixture.detectChanges(); } waitForPresenceTimer(): void { tick(PRESENCE_EDITOR_ACTIVE_TIMEOUT); } - insertSuggestion(i: number = 0): void { - const keydownEvent: any = document.createEvent('CustomEvent'); - if (i === 0) { - keydownEvent.key = 'Enter'; - } else { - keydownEvent.key = i.toString(); - keydownEvent.ctrlKey = true; - } - keydownEvent.initEvent('keydown', true, true); - this.component.target!.editor!.root.dispatchEvent(keydownEvent); - this.wait(); - } - - downArrow(): void { - const keydownEvent: any = document.createEvent('CustomEvent'); - keydownEvent.key = 'ArrowDown'; - keydownEvent.initEvent('keydown', true, true); - this.component.target!.editor!.root.dispatchEvent(keydownEvent); - this.wait(); - } - changeUserRole(projectId: string, userId: string, role: SFProjectRole): void { const projectDoc: SFProjectProfileDoc = this.getProjectDoc(projectId); const userRoles = cloneDeep(this.userRolesOnProject); @@ -5422,11 +4579,6 @@ class TestEnvironment { this.wait(); } - clickTrainingProgressCloseButton(): void { - this.trainingProgressCloseButton.nativeElement.click(); - this.fixture.detectChanges(); - } - routeWithParams(params: Params): void { this.ngZone.run(() => { // Need to both update ActivatedRoute params and navigate route because ActivatedRoute @@ -5441,26 +4593,6 @@ class TestEnvironment { this.fixture.detectChanges(); } - throwTrainingProgressError(): void { - const trainingProgress$ = this.trainingProgress$; - this.trainingProgress$ = new Subject(); - trainingProgress$.error(new HttpErrorResponse({ status: 404 })); - this.fixture.detectChanges(); - } - - updateTrainingProgress(percentCompleted: number): void { - this.trainingProgress$.next({ percentCompleted, message: 'message' }); - this.fixture.detectChanges(); - } - - completeTrainingProgress(): void { - const trainingProgress$ = this.trainingProgress$; - this.trainingProgress$ = new Subject(); - trainingProgress$.complete(); - this.fixture.detectChanges(); - tick(); - } - typeCharacters(str: string, attributes?: StringMap): number { const selection = this.targetEditor.getSelection()!; const delta = new Delta().retain(selection.index).insert(str, attributes).delete(selection.length); @@ -5516,7 +4648,6 @@ class TestEnvironment { dispose(): void { this.wait(); - this.component.metricsSession?.dispose(); this.waitForPresenceTimer(); } @@ -5728,9 +4859,6 @@ class TestEnvironment { } private addProjectUserConfig(userConfig: SFProjectUserConfig): void { - userConfig.translationSuggestionsEnabled ??= true; - userConfig.numSuggestions ??= 1; - userConfig.confidenceThreshold ??= 0.2; this.realtimeService.addSnapshot(SFProjectUserConfigDoc.COLLECTION, { id: getSFProjectUserConfigDocId('project01', userConfig.ownerRef), data: userConfig @@ -5744,28 +4872,6 @@ class TestEnvironment { data: new Delta() }); } - - private createWordGraph(segment: string): WordGraph { - const segments = Array.from(this.tokenizer.tokenize(segment)); - const arcs: WordGraphArc[] = []; - for (let i = 0; i < segments.length; i++) { - let targetWord = segments[i]; - if (targetWord === 'source') { - targetWord = 'target'; - } - const alignment = new WordAlignmentMatrix(1, 1); - alignment.set(0, 0, true); - arcs.push( - new WordGraphArc(i, i + 1, -10, [targetWord], alignment, createRange(i, i + 1), [TranslationSources.Smt], [0.5]) - ); - if (targetWord === 'verse') { - arcs.push( - new WordGraphArc(i, i + 1, -11, ['versa'], alignment, createRange(i, i + 1), [TranslationSources.Smt], [0.4]) - ); - } - } - return new WordGraph(segments, arcs, [segments.length - 1]); - } } export class MockNoteDialogRef { diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.ts index 65866df3be1..7cbb5990a25 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/editor.component.ts @@ -8,7 +8,6 @@ import { Component, DestroyRef, ElementRef, - Inject, OnDestroy, OnInit, QueryList, @@ -26,19 +25,10 @@ import { MatInput } from '@angular/material/input'; import { MatTooltip } from '@angular/material/tooltip'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslocoModule } from '@ngneat/transloco'; -import { - InteractiveTranslator, - InteractiveTranslatorFactory, - LatinWordDetokenizer, - LatinWordTokenizer, - PhraseTranslationSuggester, - RangeTokenizer, - TranslationSuggester -} from '@sillsdev/machine'; import { Canon, VerseRef } from '@sillsdev/scripture'; import { AngularSplitModule } from 'angular-split'; import { isEqual } from 'lodash-es'; -import Quill, { Bounds, Delta, Range } from 'quill'; +import { Bounds, Delta, Range } from 'quill'; import { Operation } from 'realtime-server/lib/esm/common/models/project-rights'; import { User } from 'realtime-server/lib/esm/common/models/user'; import { EditorTabGroupType, editorTabGroupTypes } from 'realtime-server/lib/esm/scriptureforge/models/editor-tab'; @@ -72,28 +62,13 @@ import { Observable, of, Subject, - Subscription, - timer + Subscription } from 'rxjs'; -import { - debounceTime, - filter, - first, - map, - repeat, - retry, - startWith, - switchMap, - take, - tap, - throttleTime -} from 'rxjs/operators'; +import { filter, map, startWith, switchMap, take, tap, throttleTime } from 'rxjs/operators'; import { ActivatedProjectService } from 'xforge-common/activated-project.service'; import { BlurOnClickDirective } from 'xforge-common/blur-on-click.directive'; -import { CONSOLE, ConsoleInterface } from 'xforge-common/browser-globals'; import { DataLoadingComponent } from 'xforge-common/data-loading-component'; import { DialogService } from 'xforge-common/dialog.service'; -import { ErrorReportingService } from 'xforge-common/error-reporting.service'; import { FontService } from 'xforge-common/font.service'; import { I18nService } from 'xforge-common/i18n.service'; import { Breakpoint, MediaBreakpointService } from 'xforge-common/media-breakpoints/media-breakpoint.service'; @@ -119,9 +94,7 @@ import { Revision } from '../../core/paratext.service'; import { PermissionsService } from '../../core/permissions.service'; import { SFProjectService } from '../../core/sf-project.service'; import { TextDocService } from '../../core/text-doc.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; import { BuildDto } from '../../machine-api/build-dto'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; import { BookChapterChooserComponent } from '../../shared/book-chapter-chooser/book-chapter-chooser.component'; import { CopyrightBannerComponent } from '../../shared/copyright-banner/copyright-banner.component'; import { NoticeComponent } from '../../shared/notice/notice.component'; @@ -165,8 +138,6 @@ import { import { BiblicalTermsComponent } from '../biblical-terms/biblical-terms.component'; import { DraftGenerationService } from '../draft-generation/draft-generation.service'; import { DraftOptionsService } from '../draft-generation/draft-options.service'; -import { SmtRetirementNoticeComponent } from '../smt-retirement-notice/smt-retirement-notice.component'; -import { TrainingProgressComponent } from '../training-progress/training-progress.component'; import { EditorDraftComponent } from './editor-draft/editor-draft.component'; import { EditorHistoryComponent } from './editor-history/editor-history.component'; import { EditorHistoryService } from './editor-history/editor-history.service'; @@ -176,21 +147,16 @@ import { LynxInsightsPanelComponent } from './lynx/insights/lynx-insights-panel/ import { MultiCursorViewer, MultiViewerComponent } from './multi-viewer/multi-viewer.component'; import { NoteDialogComponent, NoteDialogData, NoteDialogResult } from './note-dialog/note-dialog.component'; import { SaveNoteParameters } from './save-note-parameters'; -import { Suggestion, SuggestionsComponent } from './suggestions.component'; import { EditorTabAddRequestService } from './tabs/editor-tab-add-request.service'; import { EditorTabFactoryService } from './tabs/editor-tab-factory.service'; import { EditorTabMenuService } from './tabs/editor-tab-menu.service'; import { EditorTabPersistenceService } from './tabs/editor-tab-persistence.service'; import { EditorTabInfo } from './tabs/editor-tabs.types'; -import { TranslateMetricsSession } from './translate-metrics-session'; import { TranslatorSettingsDialogComponent, TranslatorSettingsDialogData } from './translator-settings-dialog.component'; -export const UPDATE_SUGGESTIONS_TIMEOUT = 100; - -const PUNCT_SPACE_REGEX = /^(?:\p{P}|\p{S}|\p{Cc}|\p{Z})+$/u; const UNSUPPORTED_LANGUAGE_CODES = [ 'ko', 'kor', @@ -275,21 +241,15 @@ const UNSUPPORTED_LANGUAGE_CODES = [ EditorHistoryComponent, EditorResourceComponent, LynxInsightsPanelComponent, - SuggestionsComponent, - TextDocIdPipe, - TrainingProgressComponent, - SmtRetirementNoticeComponent + TextDocIdPipe ] }) export class EditorComponent extends DataLoadingComponent implements OnDestroy, OnInit, AfterViewInit { addingMobileNote: boolean = false; - suggestions: Suggestion[] = []; - showSuggestions: boolean = false; books: number[] = []; chapters: number[] = []; text?: TextInfo; isProjectAdmin: boolean = false; - metricsSession?: TranslateMetricsSession; mobileNoteControl: UntypedFormControl = new UntypedFormControl(''); multiCursorViewers: MultiCursorViewer[] = []; target: TextComponent | undefined; @@ -306,15 +266,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, private sourceScrollContainer: Element | undefined; private targetScrollContainer: Element | undefined; - private interactiveTranslatorFactory?: InteractiveTranslatorFactory; - private translationEngine?: RemoteTranslationEngine; - private isTranslating: boolean = false; - private readonly detokenizer = new LatinWordDetokenizer(); - private readonly sourceWordTokenizer: RangeTokenizer; - private readonly targetWordTokenizer: RangeTokenizer; - private translator?: InteractiveTranslator; - private readonly translationSuggester: TranslationSuggester = new PhraseTranslationSuggester(0.2); - private insertSuggestionEnd: number = -1; private bottomSheetRef?: MatBottomSheetRef; private currentUserDoc?: UserDoc; projectDoc?: SFProjectProfileDoc; @@ -330,10 +281,7 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, private _targetFocused: boolean = false; private chapter$ = new BehaviorSubject(undefined); private _verse: string = '0'; - private lastShownSuggestions: Suggestion[] = []; - private readonly segmentUpdated$: Subject; private onTargetDeleteSub?: Subscription; - private trainingSub?: Subscription; private projectDataChangesSub?: Subscription; private clickSubs: Map = new Map(); private selectionClickSubs: Subscription[] = []; @@ -365,12 +313,9 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, private readonly changeDetector: ChangeDetectorRef, private readonly onlineStatusService: OnlineStatusService, - private readonly translationEngineService: TranslationEngineService, readonly i18n: I18nService, readonly fontService: FontService, - private readonly reportingService: ErrorReportingService, private readonly activatedProject: ActivatedProjectService, - @Inject(CONSOLE) private readonly console: ConsoleInterface, private readonly router: Router, private bottomSheet: MatBottomSheet, readonly tabState: TabStateService, @@ -387,14 +332,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, readonly editorInsightState: LynxInsightStateService ) { super(noticeService, 'EditorComponent'); - const wordTokenizer = new LatinWordTokenizer(); - this.sourceWordTokenizer = wordTokenizer; - this.targetWordTokenizer = wordTokenizer; - - this.segmentUpdated$ = new Subject(); - this.segmentUpdated$ - .pipe(debounceTime(UPDATE_SUGGESTIONS_TIMEOUT), quietTakeUntilDestroyed(this.destroyRef)) - .subscribe(() => this.updateSuggestions()); this.mobileNoteControl.setValidators([Validators.required, XFValidators.someNonWhitespace]); } @@ -421,20 +358,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, } } - get translationSuggestionsEnabled(): boolean { - return this.hasSource && this.translationSuggestionsProjectEnabled && this.translationSuggestionsUserEnabled; - } - - get translationSuggestionsUserEnabled(): boolean { - return this.projectUserConfigDoc == null || this.projectUserConfigDoc.data == null - ? true - : this.projectUserConfigDoc.data.translationSuggestionsEnabled; - } - - get translationSuggestionsProjectEnabled(): boolean { - return this.projectDoc?.data?.translateConfig.translationSuggestionsEnabled === true; - } - get lynxProjectEnabled(): boolean { return ( !!this.projectDoc?.data?.lynxConfig.assessmentsEnabled || @@ -443,17 +366,7 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, } get translatorSettingsEnabled(): boolean { - return ( - ((this.hasSource && this.hasSourceViewRight && this.translationSuggestionsProjectEnabled) || - this.lynxProjectEnabled) && - this.userHasGeneralEditRight - ); - } - - get numSuggestions(): number { - return this.projectUserConfigDoc == null || this.projectUserConfigDoc.data == null - ? 1 - : this.projectUserConfigDoc.data.numSuggestions; + return this.lynxProjectEnabled && this.userHasGeneralEditRight; } get noteTags(): NoteTag[] { @@ -767,7 +680,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, .pipe(quietTakeUntilDestroyed(this.destroyRef)) .subscribe(async ([params, targetViewChildren]) => { this.target = targetViewChildren.first; - this.showSuggestions = false; this.sourceLoaded = false; this.targetLoaded = false; this.bottomSheet.dismiss(); @@ -804,13 +716,13 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, this.projectUserConfigChangesSub?.unsubscribe(); this.projectUserConfigChangesSub = this.projectUserConfigDoc.remoteChanges$.subscribe(async () => { - if (this.projectUserConfigDoc?.data != null) { + if ( + this.projectUserConfigDoc?.data != null && + this.projectUserConfigDoc.data.selectedSegmentChecksum == null && + this._bookNum != null + ) { // Reload config if the checksum has been reset on the server - if (this.projectUserConfigDoc.data.selectedSegmentChecksum == null && this._bookNum != null) { - await this.loadProjectUserConfig(this._bookNum); - } else { - this.loadTranslateSuggesterConfidence(); - } + await this.loadProjectUserConfig(this._bookNum); } }); } @@ -841,7 +753,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, this.initLynxFeatureStates(this.projectUserConfigDoc); if (this.projectDoc.id !== prevProjectId) { - this.setupTranslationEngine(); this.projectDataChangesSub?.unsubscribe(); this.projectDataChangesSub = this.projectDoc.remoteChanges$.subscribe(async () => { let sourceId: TextDocId | undefined; @@ -861,32 +772,8 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, this.source.id = sourceId; } - if (this.translationEngine == null || !this.translationSuggestionsProjectEnabled || !this.hasEditRight) { - this.setupTranslationEngine(); - } - await this.addRemoveSourceTabAsync(this.projectDoc!); }); - - if (this.metricsSession != null) { - this.metricsSession.dispose(); - } - if ( - this.target != null && - this.source != null && - this.sourceProjectDoc?.data?.userRoles[this.userService.currentUserId] != null - ) { - this.metricsSession = new TranslateMetricsSession( - this.projectService, - this.projectDoc.id, - this.source, - this.target, - this.sourceWordTokenizer, - this.targetWordTokenizer, - this.onlineStatusService, - this.reportingService - ); - } } }); @@ -941,10 +828,8 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, ngOnDestroy(): void { this.projectUserConfigChangesSub?.unsubscribe(); - this.trainingSub?.unsubscribe(); this.projectDataChangesSub?.unsubscribe(); this.initializeLynxStateSub?.unsubscribe(); - this.metricsSession?.dispose(); this.onTargetDeleteSub?.unsubscribe(); this.bottomSheet?.dismiss(); this.resizeObserver?.disconnect(); @@ -963,7 +848,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, } if (segment !== prevSegment) { - this.lastShownSuggestions = []; if (this.source != null) { this.source.setSegment(this.target.segmentRef); this.syncScrollRequested$.next(); @@ -972,77 +856,39 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, this.resetCommenterVerseSelection(); } - this.insertSuggestionEnd = -1; - this.onStartTranslating(); - try { - if ( - this.projectUserConfigDoc?.data != null && - this.text != null && - this.target.segmentRef !== '' && - (this.projectUserConfigDoc.data.selectedBookNum !== this.text.bookNum || - this.projectUserConfigDoc.data.selectedChapterNum !== this.chapter || - this.projectUserConfigDoc.data.selectedSegment !== this.target.segmentRef) - ) { - if ((prevSegment == null || this.translator == null) && this.sourceProjectId !== undefined) { - await this.translationEngineService.trainSelectedSegment( - this.projectUserConfigDoc.data, - this.sourceProjectId - ); - } else { - await this.trainSegment(prevSegment, this.sourceProjectId); - } - await this.projectUserConfigDoc.submitJson0Op(op => { - op.set(puc => puc.selectedSegment, this.target!.segmentRef); - op.set(puc => puc.selectedSegmentChecksum!, this.target!.segmentChecksum); - }); - } - if (this.bookNum != null && this.hasEditRight) { - const verseRef: VerseRef | undefined = getVerseRefFromSegmentRef(this.bookNum, this.target.segmentRef); - this.toggleVerseRefElement(verseRef); - } - await this.translateSegment(); - } finally { - this.onFinishTranslating(); + if ( + this.projectUserConfigDoc?.data != null && + this.text != null && + this.target.segmentRef !== '' && + (this.projectUserConfigDoc.data.selectedBookNum !== this.text.bookNum || + this.projectUserConfigDoc.data.selectedChapterNum !== this.chapter || + this.projectUserConfigDoc.data.selectedSegment !== this.target.segmentRef) + ) { + await this.projectUserConfigDoc.submitJson0Op(op => { + op.set(puc => puc.selectedSegment, this.target!.segmentRef); + op.set(puc => puc.selectedSegmentChecksum!, this.target!.segmentChecksum); + }); + } + if (this.bookNum != null && this.hasEditRight) { + const verseRef: VerseRef | undefined = getVerseRefFromSegmentRef(this.bookNum, this.target.segmentRef); + this.toggleVerseRefElement(verseRef); } } else { if (this.source != null && this.source.segmentRef !== this.target.segmentRef) { this.source.setSegment(this.target.segmentRef); } - if (delta?.ops != null) { - const retainCount: number | undefined = getRetainCount(delta.ops[0]); - const insertText: string | undefined = isString(delta.ops[1]?.insert) ? delta.ops[1].insert : undefined; - // insert a space if the user just inserted a suggestion and started typing - if ( - delta.ops.length === 2 && - retainCount === this.insertSuggestionEnd && - insertText != null && - insertText.length > 0 && - !PUNCT_SPACE_REGEX.test(insertText) - ) { - this.target.editor.insertText(this.insertSuggestionEnd, ' ', 'user'); - const selectIndex = this.insertSuggestionEnd + insertText.length + 1; - this.insertSuggestionEnd = -1; - this.target.editor.setSelection(selectIndex, 0, 'user'); - } - if ( - segment != null && - preDeltaAffectedEmbeds != null && - this.shouldNoteThreadsRespondToEdits && - !!isLocalUpdate - ) { - // only update the note anchors if the update is local, otherwise remote edits will mess up the note anchors - await this.updateVerseNoteThreadAnchors(preDeltaAffectedEmbeds, delta); - } + if ( + delta?.ops != null && + segment != null && + preDeltaAffectedEmbeds != null && + this.shouldNoteThreadsRespondToEdits && + !!isLocalUpdate + ) { + // only update the note anchors if the update is local, otherwise remote edits will mess up the note anchors + await this.updateVerseNoteThreadAnchors(preDeltaAffectedEmbeds, delta); } - if (this.insertSuggestionEnd !== -1) { - const selection = this.target.editor.getSelection(); - if (selection == null || selection.length > 0 || selection.index !== this.insertSuggestionEnd) { - this.insertSuggestionEnd = -1; - } - } - this.segmentUpdated$.next(); this.syncScrollRequested$.next(); } @@ -1070,20 +916,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, } this.syncScrollRequested$.next(); - - if ( - this.target != null && - this.target.segment != null && - this.target.segment.bookNum === this.bookNum && - this.target.segment.chapter === this.chapter - ) { - this.onStartTranslating(); - try { - await this.translateSegment(); - } finally { - this.onFinishTranslating(); - } - } } onTextLoaded(textType: TextType): void { @@ -1164,79 +996,17 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, this._verse = verseRef.verse; } - insertSuggestion(suggestionIndex: number, wordIndex: number, event: Event): void { - if (this.target == null || this.target.editor == null || suggestionIndex >= this.suggestions.length) { - return; - } - - const suggestion = this.suggestions[suggestionIndex]; - if (wordIndex >= suggestion.words.length) { - return; - } - - this.target.focus(); - let range = this.target.editor.getSelection(); - if (range == null) { - return; - } - range = this.skipInitialWhitespace(this.target.editor, range); - - const delta = new Delta(); - delta.retain(range.index); - if (range.length > 0) { - delta.delete(range.length); - } - - const words = wordIndex === -1 ? suggestion.words : suggestion.words.slice(0, wordIndex + 1); - let insertText: string = this.detokenizer.detokenize(words); - if (this.translator != null && !this.translator.isLastWordComplete) { - const lastWord = this.translator.prefixWordRanges[this.translator.prefixWordRanges.length - 1]; - insertText = insertText.substring(lastWord.length); - } - if (this.insertSuggestionEnd !== -1) { - insertText = ' ' + insertText; - } - delta.insert(insertText); - this.showSuggestions = false; - - const selectIndex = range.index + insertText.length; - this.insertSuggestionEnd = selectIndex; - // If the segment is blank, then the selection is after the blank. The blank will be deleted, so we need - // to shift end of the inserted suggestion back one. - if (this.target.segmentText === '') { - this.insertSuggestionEnd--; - } - const previousContents = this.target.editor.getContents(); - this.target.editor.updateContents(delta, 'user'); - const updatedContents = this.target.editor.getContents(); - this.target.editor.setSelection(selectIndex, 0, 'user'); - - if (this.metricsSession != null && !isEqual(updatedContents.ops, previousContents.ops)) { - this.metricsSession.onSuggestionAccepted(event); - } - } - openTranslatorSettings(): void { if (this.projectDoc == null || this.projectUserConfigDoc == null) { return; } - const dialogRef = this.openMatDialog( + this.openMatDialog( TranslatorSettingsDialogComponent, { data: { projectDoc: this.projectDoc, projectUserConfigDoc: this.projectUserConfigDoc } } ); - dialogRef - .afterClosed() - .pipe(first()) - .subscribe(() => { - if (this.projectUserConfigDoc != null && this.projectUserConfigDoc.data != null) { - const pcnt = Math.round(this.projectUserConfigDoc.data.confidenceThreshold * 100); - this.translationSuggester.confidenceThreshold = pcnt / 100; - } - this.updateSuggestions(); - }); } insertNote(): void { @@ -1766,50 +1536,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, await this.projectUserConfigDoc.submitJson0Op(op => op.add(puc => puc.noteRefsRead, noteId)); } - private setupTranslationEngine(): void { - if (this.trainingSub != null) { - this.trainingSub.unsubscribe(); - this.trainingSub = undefined; - } - this.translator = undefined; - this.translationEngine = undefined; - if (this.projectDoc?.data == null) { - return; - } - const hasSourceBooks: boolean = this.translationEngineService.checkHasSourceBooks(this.projectDoc.data); - if (!this.translationSuggestionsProjectEnabled || !this.hasEditRight || !hasSourceBooks) { - return; - } - - this.translationEngine = this.translationEngineService.createTranslationEngine(this.projectDoc.id); - this.trainingSub = this.translationEngine - .listenForTrainingStatus() - .pipe( - tap({ - complete: async () => { - // ensure that any changes to the segment will be trained - if (this.target != null && this.target.segment != null) { - this.target.segment.acceptChanges(); - } - // re-translate current segment - this.onStartTranslating(); - try { - await this.translateSegment(); - } finally { - this.onFinishTranslating(); - } - } - }), - repeat(), - filter(progress => progress.percentCompleted > 0), - retry({ delay: () => timer(30000) }) - ) - .subscribe(); - this.interactiveTranslatorFactory = this.translationEngineService.createInteractiveTranslatorFactory( - this.projectDoc.id - ); - } - private async changeText(): Promise { if (this.projectDoc == null || this.text == null || this.chapter == null) { if (this.source != null) this.source.id = undefined; @@ -1853,12 +1579,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, await this.loadNoteThreadDocs(this.projectDoc.id, this.text.bookNum, this.chapter); } - private onStartTranslating(): void { - this.isTranslating = true; - this.suggestions = []; - this.showSuggestions = this.target != null && this.target.isSelectionAtSegmentEnd; - } - private setSegment(selectedSegment?: string, selectedSegmentChecksum?: number): void { if (this.target == null || this.text == null) return; if ( @@ -1881,154 +1601,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, } } - private async translateSegment(): Promise { - this.translator = undefined; - if (this.translationEngine == null || this.source == null || !this.onlineStatusService.isOnline) { - return; - } - const sourceSegment = this.source.segmentText; - if (sourceSegment.length === 0) { - return; - } - - let translator: InteractiveTranslator | undefined; - if (this.translationSuggestionsEnabled) { - translator = await this.interactiveTranslatorFactory?.create(sourceSegment); - } - if (translator == null) { - this.translator = undefined; - return; - } else if (!translator.isSegmentValid) { - this.translator = undefined; - if (this.translationSuggestionsEnabled) { - this.noticeService.show(this.i18n.translateStatic('editor.verse_too_long_for_suggestions')); - } - return; - } - if (sourceSegment === this.source.segmentText) { - this.translator = translator; - } - } - - private onFinishTranslating(): void { - this.isTranslating = false; - this.updateSuggestions(); - } - - private updateSuggestions(): void { - if (this.target == null || this.target.editor == null || this.target.segment == null) { - return; - } - - // only bother updating the suggestion if the cursor is at the end of the segment - let suggestionsUpdated = false; - if (!this.isTranslating && this.target.isSelectionAtSegmentEnd) { - if (this.translator == null) { - if (this.suggestions.length > 0) { - suggestionsUpdated = true; - } - this.suggestions = []; - } else { - const range = this.skipInitialWhitespace(this.target.editor, this.target.editor.getSelection()!); - const text = this.target.editor.getText( - this.target.segment.range.index, - range.index - this.target.segment.range.index - ); - // Only specify IsLastWordComplete if insertSuggestionEnd is not -1 - let isLastWordComplete: boolean | undefined; - if (this.insertSuggestionEnd !== -1) { - isLastWordComplete = true; - } - this.translator.setPrefix(text, isLastWordComplete); - const machineSuggestions = this.translationSuggester.getSuggestions( - this.numSuggestions, - this.translator.prefixWordRanges.length, - this.translator.isLastWordComplete, - this.translator.getCurrentResults() - ); - if (machineSuggestions.length === 0) { - if (this.suggestions.length > 0) { - suggestionsUpdated = true; - } - this.suggestions = []; - } else { - const suggestions: Suggestion[] = []; - let confidence = 1; - for (const machineSuggestion of machineSuggestions) { - const words = machineSuggestion.targetWords; - // for display purposes, we ensure that the confidence is less than or equal to "better" suggestions - confidence = Math.min(confidence, machineSuggestion.confidence); - suggestions.push({ words, confidence }); - } - this.suggestions = suggestions; - suggestionsUpdated = true; - if (this.suggestions.length > 0 && !isEqual(this.lastShownSuggestions, this.suggestions)) { - if (this.metricsSession != null) { - this.metricsSession.onSuggestionShown(); - } - this.lastShownSuggestions = this.suggestions; - } - } - } - } - const newShowSuggestionsValue = - (this.isTranslating || this.suggestions.length > 0) && this.target.isSelectionAtSegmentEnd; - if (this.showSuggestions !== newShowSuggestionsValue) { - suggestionsUpdated = true; - } - this.showSuggestions = newShowSuggestionsValue; - if (suggestionsUpdated) { - // Trigger detect changes so the suggestion list will update - this.changeDetector.detectChanges(); - } - } - - private skipInitialWhitespace(editor: Quill, range: Range): Range { - let i: number; - for (i = range.index; i < range.index + range.length; i++) { - const ch = editor.getText(i, 1); - if (ch === '' || !/\s/.test(ch)) { - return { index: i, length: range.length - (i - range.index) }; - } - } - return { index: i, length: 0 }; - } - - private async trainSegment(segment: Segment | undefined, sourceProjectRef: string | undefined): Promise { - if (segment == null || !this.canTrainSegment(segment)) { - return; - } - if ( - !this.onlineStatusService.isOnline && - sourceProjectRef != null && - this.projectUserConfigDoc?.data != null && - this.projectUserConfigDoc.data.selectedBookNum != null && - this.projectUserConfigDoc.data.selectedChapterNum != null - ) { - void this.translationEngineService.storeTrainingSegment( - this.projectUserConfigDoc.data.projectRef, - sourceProjectRef, - this.projectUserConfigDoc.data.selectedBookNum, - this.projectUserConfigDoc.data.selectedChapterNum, - this.projectUserConfigDoc.data.selectedSegment - ); - return; - } - - if (this.translator == null) { - return; - } - await this.translator.approve(true); - segment.acceptChanges(); - this.console.log( - 'Segment ' + segment.ref + ' of document ' + Canon.bookNumberToId(segment.bookNum) + ' was trained successfully.' - ); - } - - private canTrainSegment(segment: Segment): boolean { - return segment.range.length > 0 && segment.text !== '' && segment.isChanged; - } - private subscribeClickEvents(segments: string[]): void { if (this.target == null) { return; @@ -2125,7 +1697,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, private async loadProjectUserConfig(bookNum: number, chapterFromUrl?: number): Promise { let chapter: number = chapterFromUrl ?? this.projectDoc?.data?.texts.find(t => t.bookNum === bookNum)?.chapters[0].number ?? 1; - this.loadTranslateSuggesterConfidence(); if (chapterFromUrl == null && this.projectUserConfigDoc?.data != null) { if (this.text != null && this.projectUserConfigDoc.data.selectedBookNum === this.text.bookNum) { @@ -2151,13 +1722,6 @@ export class EditorComponent extends DataLoadingComponent implements OnDestroy, await this.updateBiblicalTermsTabVisibility(); } - private loadTranslateSuggesterConfidence(): void { - if (this.projectUserConfigDoc?.data != null) { - const pcnt = Math.round(this.projectUserConfigDoc.data.confidenceThreshold * 100); - this.translationSuggester.confidenceThreshold = pcnt / 100; - } - } - /** * Opens a MAT dialog and records the current editor selection if one exists * and return the cursor to that position on dialog close. diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/note-dialog/note-dialog.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/note-dialog/note-dialog.component.spec.ts index ba8c9d9926f..dfbb8e2ba90 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/note-dialog/note-dialog.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/note-dialog/note-dialog.component.spec.ts @@ -753,7 +753,6 @@ class TestEnvironment { projectRef: TestEnvironment.PROJECT01, ownerRef: 'user01', isTargetTextRight: true, - translationSuggestionsEnabled: false, selectedSegment: 'verse_1_1' }); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.html deleted file mode 100644 index e35b5f9d700..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.html +++ /dev/null @@ -1,14 +0,0 @@ -@if (isLoading) { -
-} @else { - - @for (suggestion of suggestions; track $index; let i = $index) { - -
- {{ suggestion.words.join(" ") }} - {{ getPercentage(suggestion.confidence) }}% -
-
- } -
-} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.scss deleted file mode 100644 index e8d07a0d95b..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.scss +++ /dev/null @@ -1,79 +0,0 @@ -@use 'src/variables' as *; - -:host { - background-color: var(--sf-suggestions-background-color); - position: absolute; - z-index: 2; - border-radius: 2px; - overflow: hidden; -} - -:host(.hidden) { - visibility: hidden; -} - -.loading-indicator { - display: table; - padding: 8px 7px 9px 7px; - - span { - height: 10px; - width: 10px; - float: left; - margin: 0 1px; - background-color: var(--sf-suggestions-loading-dot-color); - display: block; - border-radius: 50%; - opacity: 0.4; - @for $i from 1 through 3 { - &:nth-of-type(#{$i}) { - animation: 1s blink infinite ($i * 0.3333s); - } - } - } -} - -@keyframes blink { - 50% { - opacity: 1; - } -} - -mat-selection-list[dense] { - padding: 0; - - > mat-list-option { - height: auto; - } -} - -mat-list-option { - padding: 6px 8px !important; - // Background color of selected item in suggestion list. - --mat-list-list-item-selected-container-color: var(--sf-suggestions-selected-item-background-color); -} - -:host ::ng-deep .mdc-list-item__content { - overflow: visible; -} - -.suggestion-words { - font-family: var(--project-font); -} - -.suggestion-confidence { - font-size: smaller; - color: var(--sf-suggestions-confidence-color); -} - -.suggestion { - display: flex; - column-gap: 5px; - align-items: baseline; - justify-content: space-between; - - font-size: 12px; - line-height: 12px; - letter-spacing: initial; - white-space: normal; -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.ts deleted file mode 100644 index 6ae817b1e84..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.component.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { Component, DestroyRef, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; -import { MatListOption, MatSelectionList } from '@angular/material/list'; -import { isEqual } from 'lodash-es'; -import Quill from 'quill'; -import { fromEvent } from 'rxjs'; -import { filter, first } from 'rxjs/operators'; -import { quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; -import { TextComponent } from '../../shared/text/text.component'; -export interface SuggestionSelectedEvent { - suggestionIndex: number; - wordIndex: number; - event: Event; -} - -export interface Suggestion { - words: string[]; - confidence: number; -} - -@Component({ - selector: 'app-suggestions', - templateUrl: './suggestions.component.html', - styleUrls: ['./suggestions.component.scss'], - imports: [MatSelectionList, MatListOption] -}) -export class SuggestionsComponent { - @Output() selected = new EventEmitter(); - @Output() showChange = new EventEmitter(); - - @ViewChild('list') list?: MatSelectionList; - - private _text?: TextComponent; - private _suggestions: Suggestion[] = []; - private resizeObserver?: ResizeObserver; - private top: number = 0; - - constructor( - private readonly elemRef: ElementRef, - private destroyRef: DestroyRef - ) { - this.show = false; - this.root.style.left = '0px'; - this.root.style.top = '0px'; - } - - get text(): TextComponent | undefined { - return this._text; - } - - @Input() - set text(value: TextComponent | undefined) { - if (this._text !== value) { - this._text = value; - this.initText(); - } - } - - get suggestions(): Suggestion[] { - return this._suggestions; - } - - @Input() - set suggestions(value: Suggestion[]) { - if (!isEqual(this._suggestions, value)) { - this._suggestions = value; - setTimeout(() => { - this.setPosition(); - }); - } - } - - private getSelectedIndex(): number { - if (this.list != null) { - const selected = this.list.selectedOptions.selected[0]; - return this.list.options.toArray().indexOf(selected); - } - - return -1; - } - - private setSelectedIndex(index: number): void { - const option: MatListOption | undefined = this.list?.options.get(index); - if (option != null) option.selected = true; - } - - get show(): boolean { - return !this.root.classList.contains('hidden'); - } - - @Input() - set show(value: boolean) { - if (value !== this.show) { - if (value) { - this.root.classList.remove('hidden'); - } else { - this.root.classList.add('hidden'); - } - this.showChange.emit(value); - } - } - - get isLoading(): boolean { - return this._suggestions.length === 0; - } - - private get editor(): Quill | undefined { - return this.text == null ? undefined : this.text.editor; - } - - private get root(): HTMLElement { - return this.elemRef.nativeElement; - } - - selectAll(event: Event): void { - if (this.list == null) { - return; - } - this.selected.emit({ suggestionIndex: this.getSelectedIndex(), wordIndex: -1, event }); - } - - getPercentage(num: number): number { - return Math.round(num * 100); - } - - private initText(): void { - if (this.text == null) { - return; - } - - this.text.updated.pipe(quietTakeUntilDestroyed(this.destroyRef)).subscribe(() => this.setPosition()); - - this.initEditor(); - if (this.editor == null) { - this.text.loaded.pipe(first()).subscribe(() => this.initEditor()); - } - } - - private initEditor(): void { - if (this.editor == null) { - return; - } - - this.observeResize(this.editor); - fromEvent(this.editor.root, 'scroll') - .pipe(quietTakeUntilDestroyed(this.destroyRef)) - .subscribe(() => this.setPosition()); - fromEvent(this.editor.root, 'keydown') - .pipe( - filter(event => this.isSuggestionEvent(event)), - quietTakeUntilDestroyed(this.destroyRef) - ) - .subscribe(event => { - if (this.list == null) { - return; - } - let selectedIndex; - switch (event.key) { - case 'ArrowDown': - selectedIndex = this.getSelectedIndex(); - if (selectedIndex === this.list.options.length - 1) { - selectedIndex = 0; - } else { - selectedIndex++; - } - this.setSelectedIndex(selectedIndex); - break; - - case 'ArrowUp': - selectedIndex = this.getSelectedIndex(); - if (selectedIndex === 0) { - selectedIndex = this.list.options.length - 1; - } else { - selectedIndex--; - } - this.setSelectedIndex(selectedIndex); - break; - - case 'Enter': - this.selected.emit({ suggestionIndex: this.getSelectedIndex(), wordIndex: -1, event }); - break; - - case 'Escape': - this.show = false; - break; - - default: - this.selected.emit({ - suggestionIndex: this.getSelectedIndex(), - wordIndex: parseInt(event.key, 10) - 1, - event - }); - break; - } - event.preventDefault(); - }); - } - - private observeResize(editor: Quill): void { - this.resizeObserver?.unobserve(editor.root); - this.resizeObserver = new ResizeObserver(entries => { - entries.forEach(_ => { - this.setPosition(); - }); - }); - this.resizeObserver.observe(editor.root); - } - - private setPosition(): void { - if (this.editor == null) { - return; - } - const selection = this.editor.getSelection(); - if (selection == null) { - // Reset to the top left/right, as the suggestions are hidden - this.root.style.left = ''; - this.root.style.right = ''; - this.root.style.top = ''; - return; - } - // If the segment is blank, then the selection is after the blank. We want to align the suggestion to the beginning - // of the segment, so we shift the selection back one index. - if (this.text?.segmentText === '') { - selection.index--; - } - const reference = this.editor.getBounds(selection.index, selection.length); - // root.scrollTop should be 0 if scrollContainer !== root - this.top = reference!.bottom + this.editor.root.scrollTop + 5; - const suggestionBounds = this.root.getBoundingClientRect(); - const editorBounds = this.editor.root.getBoundingClientRect(); - - let newLeft: number | undefined = reference!.left + 1; - let newRight: number | undefined = editorBounds.width - reference!.left - 1; - const leftExceedsBounds = newLeft + suggestionBounds.width > editorBounds.width; - const rightExceedsBounds = newRight + suggestionBounds.width > editorBounds.width; - if ((this.text?.isRtl && !rightExceedsBounds) || (leftExceedsBounds && newRight < newLeft)) { - newLeft = undefined; - } else { - newRight = undefined; - } - this.root.style.left = newLeft ? newLeft + 'px' : ''; - this.root.style.right = newRight ? newRight + 'px' : ''; - this.root.style.top = this.top + 'px'; - - const marginTop = -this.editor.root.scrollTop; - const offsetTop = marginTop + this.top; - const offsetBottom = offsetTop + this.root.clientHeight - 10; - if (offsetTop < 0 || offsetBottom > this.editor.root.clientHeight) { - if (this.root.style.visibility !== 'hidden') { - this.root.style.visibility = 'hidden'; - this.root.style.marginTop = -this.top + 'px'; - } - } else { - this.root.style.marginTop = marginTop + 'px'; - this.root.style.visibility = ''; - } - } - - private isSuggestionEvent(event: KeyboardEvent): boolean { - if (!this.show) { - return false; - } - - switch (event.key) { - case 'Enter': - case 'ArrowDown': - case 'ArrowUp': - case 'Escape': - return true; - default: - if (event.key?.length !== 1) { - return false; - } - const keyCode = event.key.charCodeAt(0); - return (event.ctrlKey || event.metaKey) && keyCode >= 48 && keyCode <= 57; - } - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.stories.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.stories.ts deleted file mode 100644 index 9cb73c0a004..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/suggestions.stories.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; -import { expect, within } from 'storybook/test'; -import { SuggestionsComponent } from './suggestions.component'; - -const meta: Meta = { - title: 'Translate/Suggestions', - component: SuggestionsComponent, - decorators: [ - moduleMetadata({ - imports: [SuggestionsComponent] - }) - ] -}; -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - args: { - show: true, - suggestions: [ - { - words: ['there', 'was', 'dearth', 'in', 'the', 'earth'], - confidence: 0.29 - }, - { - words: ['there', 'was', 'a', 'famine', 'in', 'the', 'land'], - confidence: 0.21 - } - ] - }, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const options: HTMLElement[] = canvas.getAllByRole('option'); - expect(options[0].getAttribute('aria-selected')).toBe('true'); - expect(options[1].getAttribute('aria-selected')).toBe('false'); - } -}; - -export const RTLSuggestions: Story = { - args: { - show: true, - suggestions: [ - { - words: ' وَعَمَّتْ تِلْكَ الْبِلادَ مَجَاعَةٌ'.split(' '), - confidence: 0.29 - }, - { - words: 'ثُمَّ حَدَثْتْ مَجَاعَةٌ فِي الأرْضِ'.split(' '), - confidence: 0.21 - } - ] - }, - parameters: { locale: 'ar' } -}; - -export const Loading: Story = { - args: { - ...Default.args, - suggestions: [] - } -}; diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.spec.ts deleted file mode 100644 index 99d9986fccb..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.spec.ts +++ /dev/null @@ -1,568 +0,0 @@ -import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { LatinWordTokenizer } from '@sillsdev/machine'; -import { QuillModule, QuillService } from 'ngx-quill'; -import { User } from 'realtime-server/lib/esm/common/models/user'; -import { createTestUser } from 'realtime-server/lib/esm/common/models/user-test-data'; -import { createTestProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-test-data'; -import { TextInfo } from 'realtime-server/lib/esm/scriptureforge/models/text-info'; -import * as RichText from 'rich-text'; -import { firstValueFrom } from 'rxjs'; -import { anything, deepEqual, instance, mock, objectContaining, resetCalls, verify, when } from 'ts-mockito'; -import { CommandError, CommandErrorCode } from 'xforge-common/command.service'; -import { ErrorReportingService } from 'xforge-common/error-reporting.service'; -import { UserDoc } from 'xforge-common/models/user-doc'; -import { OnlineStatusService } from 'xforge-common/online-status.service'; -import { provideTestOnlineStatus } from 'xforge-common/test-online-status-providers'; -import { TestOnlineStatusService } from 'xforge-common/test-online-status.service'; -import { provideTestRealtime } from 'xforge-common/test-realtime-providers'; -import { TestRealtimeService } from 'xforge-common/test-realtime.service'; -import { configureTestingModule, getTestTranslocoModule } from 'xforge-common/test-utils'; -import { UserService } from 'xforge-common/user.service'; -import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; -import { SF_TYPE_REGISTRY } from '../../core/models/sf-type-registry'; -import { TextDoc, TextDocId } from '../../core/models/text-doc'; -import { TranslateMetrics } from '../../core/models/translate-metrics'; -import { SFProjectService } from '../../core/sf-project.service'; -import { getTextDoc } from '../../shared/test-utils'; -import { provideQuillRegistrations } from '../../shared/text/quill-editor-registration/quill-providers'; -import { EDITOR_READY_TIMEOUT, TextComponent } from '../../shared/text/text.component'; -import { - ACTIVE_EDIT_TIMEOUT, - EDIT_TIMEOUT, - SEND_METRICS_INTERVAL, - TranslateMetricsSession -} from './translate-metrics-session'; - -const mockedSFProjectService = mock(SFProjectService); -const mockedUserService = mock(UserService); -const mockedReportingService = mock(ErrorReportingService); - -describe('TranslateMetricsSession', () => { - configureTestingModule(() => ({ - imports: [TextComponent, QuillModule.forRoot(), getTestTranslocoModule()], - providers: [ - provideQuillRegistrations(), - provideTestOnlineStatus(), - provideTestRealtime(SF_TYPE_REGISTRY), - { provide: OnlineStatusService, useClass: TestOnlineStatusService }, - { provide: SFProjectService, useMock: mockedSFProjectService }, - { provide: UserService, useMock: mockedUserService } - ] - })); - - beforeEach(async () => { - // Pre-load Quill before each test to avoid async Quill import issues - const quillService = TestBed.inject(QuillService); - await firstValueFrom(quillService.getQuill()); - }); - - describe('edit', () => { - it('start with edit keystroke', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('ArrowRight'); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.keyNavigationCount).toBe(1); - - env.keyPress('a'); - const expectedMetrics: TranslateMetrics = { - id: env.session.prevMetricsId, - type: 'navigate', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - keyNavigationCount: 1 - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', deepEqual(expectedMetrics))).once(); - env.keyPress('Backspace'); - env.keyPress('b'); - env.keyPress('Delete'); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(2); - expect(env.session.metrics.keyBackspaceCount).toBe(1); - expect(env.session.metrics.keyDeleteCount).toBe(1); - - env.sessionDispose(); - })); - - it('start with accepted suggestion', fakeAsync(() => { - const env = new TestEnvironment(); - - env.mouseClick(); - env.showSuggestion(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.mouseClickCount).toBe(1); - - env.mouseClick(); - env.showSuggestion(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.mouseClickCount).toBe(2); - - env.clickSuggestion(); - const expectedMetrics: TranslateMetrics = { - id: env.session.prevMetricsId, - type: 'navigate', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - mouseClickCount: 2 - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', deepEqual(expectedMetrics))).once(); - env.keyPress('a'); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - expect(env.session.metrics.mouseClickCount).toBe(1); - expect(env.session.metrics.suggestionTotalCount).toBe(1); - expect(env.session.metrics.suggestionAcceptedCount).toBe(1); - - env.sessionDispose(); - })); - - it('navigate keystroke', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('a'); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - - env.keyPress('ArrowRight'); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.keyNavigationCount).toBe(1); - - env.sessionDispose(); - })); - - it('mouse click', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('a'); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - - env.mouseClick(); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.mouseClickCount).toBe(1); - env.sessionDispose(); - })); - - it('editing increases activity timespan', fakeAsync(() => { - const env = new TestEnvironment(); - // Milliseconds delay between key down and key up, to make sure the timespan between them is not rounded down - // to 0. But not greater than the timeout. - const momentaryDelay = ACTIVE_EDIT_TIMEOUT * 0.5; - - expect(env.session.metrics.timeEditActive).toBeUndefined(); - env.keyPress('a', momentaryDelay); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toEqual(momentaryDelay); - env.keyPress('b', momentaryDelay); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.timeEditActive).toEqual(2 * momentaryDelay); - env.sessionDispose(); - })); - - it('timeout', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('a'); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - - tick(SEND_METRICS_INTERVAL); - resetCalls(mockedSFProjectService); - - tick(EDIT_TIMEOUT); - const expectedMetrics: TranslateMetrics = { - id: env.session.prevMetricsId, - type: 'edit', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - keyCharacterCount: 1, - segment: 'verse_1_1', - sourceWordCount: 8, - targetWordCount: 8, - editEndEvent: 'timeout' - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', objectContaining(expectedMetrics))).once(); - - env.keyPress('b'); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - - env.sessionDispose(); - })); - - it('segment change', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('a'); - tick(ACTIVE_EDIT_TIMEOUT); - expect(env.session.metrics.type).toBe('edit'); - expect(env.session.metrics.timeEditActive).toBeDefined(); - expect(env.session.metrics.keyCharacterCount).toBe(1); - - const range = env.target.getSegmentRange('verse_1_2'); - env.target.editor!.setSelection(range!.index, 0, 'user'); - env.targetFixture.detectChanges(); - tick(); - const expectedMetrics: TranslateMetrics = { - id: env.session.prevMetricsId, - type: 'edit', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - keyCharacterCount: 1, - segment: 'verse_1_1', - sourceWordCount: 8, - targetWordCount: 8, - editEndEvent: 'segment-change' - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', objectContaining(expectedMetrics))).once(); - expect(env.session.metrics.type).toBe('navigate'); - - env.sessionDispose(); - })); - }); - - describe('navigate', () => { - it('navigate keystroke', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('ArrowRight'); - env.keyPress('ArrowLeft'); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.keyNavigationCount).toBe(2); - - env.sessionDispose(); - })); - - it('mouse click', fakeAsync(() => { - const env = new TestEnvironment(); - - env.mouseClick(); - env.mouseClick(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.mouseClickCount).toBe(2); - - env.sessionDispose(); - })); - - it('segment change', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('ArrowDown'); - env.mouseClick(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.keyNavigationCount).toBe(1); - expect(env.session.metrics.mouseClickCount).toBe(1); - - env.target.segmentRef = 'verse_1_2'; - env.targetFixture.detectChanges(); - tick(); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - expect(env.session.metrics.type).toBe('navigate'); - - env.keyPress('ArrowDown'); - env.mouseClick(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.keyNavigationCount).toBe(2); - expect(env.session.metrics.mouseClickCount).toBe(2); - - env.sessionDispose(); - })); - }); - - it('dispose', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('a'); - env.keyPress('b'); - expect(env.session.metrics.type).toBe('edit'); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - - const sessionId = env.session.id; - const metricsId = env.session.metrics.id; - env.sessionDispose(); - const expectedMetrics: TranslateMetrics = { - id: metricsId, - type: 'edit', - sessionId: sessionId, - bookNum: 40, - chapterNum: 1, - keyCharacterCount: 2, - segment: 'verse_1_1', - sourceWordCount: 8, - targetWordCount: 8, - editEndEvent: 'task-exit' - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', objectContaining(expectedMetrics))).once(); - })); - - it('periodic send', fakeAsync(() => { - const env = new TestEnvironment(); - - env.keyPress('ArrowRight'); - env.keyPress('ArrowLeft'); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.keyNavigationCount).toBe(2); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - - tick(SEND_METRICS_INTERVAL); - let expectedMetrics: TranslateMetrics = { - id: env.session.metrics.id, - type: 'navigate', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - keyNavigationCount: 2 - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', deepEqual(expectedMetrics))).once(); - - resetCalls(mockedSFProjectService); - env.mouseClick(); - expect(env.session.metrics.type).toBe('navigate'); - expect(env.session.metrics.mouseClickCount).toBe(1); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - - tick(SEND_METRICS_INTERVAL); - expectedMetrics = { - id: env.session.metrics.id, - type: 'navigate', - sessionId: env.session.id, - bookNum: 40, - chapterNum: 1, - keyNavigationCount: 2, - mouseClickCount: 1 - }; - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', deepEqual(expectedMetrics))).once(); - - env.sessionDispose(); - })); - - it('handles errors in sendMetrics', fakeAsync(() => { - const env = new TestEnvironment(); - - // No error, no throw. - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenResolve(); - env.keyPress('a'); - expect(env.session.metrics.type).toBe('edit'); - tick(SEND_METRICS_INTERVAL); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).once(); - - // CommandError is re-thrown when online - resetCalls(mockedSFProjectService); - const commandError: CommandError = new CommandError(CommandErrorCode.InternalError, 'error'); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenReject(commandError); - verify(mockedReportingService.silentError(anything(), anything())).never(); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).once(); - verify(mockedReportingService.silentError(anything(), commandError)).once(); - - // Non-CommandError error is re-thrown when online - resetCalls(mockedSFProjectService); - resetCalls(mockedReportingService); - const otherError: Error = new Error('problem'); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenReject(otherError); - verify(mockedReportingService.silentError(anything(), anything())).never(); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).once(); - verify(mockedReportingService.silentError(anything(), otherError)).once(); - - // CommandError NotFound is ignored - resetCalls(mockedSFProjectService); - resetCalls(mockedReportingService); - const notFoundError: CommandError = new CommandError(CommandErrorCode.NotFound, 'error'); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenReject(notFoundError); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).once(); - verify(mockedReportingService.silentError(anything(), anything())).never(); - - // CommandError Forbidden is ignored - resetCalls(mockedSFProjectService); - const forbiddenError: CommandError = new CommandError(CommandErrorCode.Forbidden, 'error'); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenReject(forbiddenError); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).once(); - verify(mockedReportingService.silentError(anything(), anything())).never(); - - // CommandError is ignored when offline - resetCalls(mockedSFProjectService); - env.testOnlineStatusService.setIsOnline(false); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenReject(commandError); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - // Not calling since offline - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - verify(mockedReportingService.silentError(anything(), anything())).never(); - - // Non-CommandError error is ignored when offline - resetCalls(mockedSFProjectService); - env.keyPress('a'); - tick(SEND_METRICS_INTERVAL); - // Not calling since offline - verify(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).never(); - verify(mockedReportingService.silentError(anything(), anything())).never(); - - env.sessionDispose(); - })); -}); - -class TestEnvironment { - readonly source: TextComponent; - readonly sourceFixture: ComponentFixture; - readonly target: TextComponent; - readonly targetFixture: ComponentFixture; - readonly session: TranslateMetricsSession; - readonly testOnlineStatusService: TestOnlineStatusService = TestBed.inject( - OnlineStatusService - ) as TestOnlineStatusService; - - private readonly realtimeService: TestRealtimeService = TestBed.inject(TestRealtimeService); - private readonly tokenizer = new LatinWordTokenizer(); - - constructor() { - const textDocId1 = new TextDocId('project01', 40, 1, 'target'); - const textDocId2 = new TextDocId('project02', 40, 1, 'target'); - this.addTextDoc(textDocId1); - this.addTextDoc(textDocId2); - const textInfos: TextInfo[] = [ - { - bookNum: 40, - hasSource: false, - chapters: [{ number: 1, lastVerse: 7, isValid: true, permissions: {} }], - permissions: {} - } - ]; - [textDocId1, textDocId2].forEach(textDocId => { - this.realtimeService.addSnapshot(SFProjectProfileDoc.COLLECTION, { - id: textDocId.projectId, - data: createTestProjectProfile({ texts: textInfos }) - }); - }); - - this.realtimeService.addSnapshot(UserDoc.COLLECTION, { - id: 'user01', - data: createTestUser({ - sites: { - sf: { - projects: ['project01', 'project02'] - } - } - }) - }); - - when(mockedSFProjectService.getText(anything())).thenCall(id => - this.realtimeService.subscribe(TextDoc.COLLECTION, id.toString()) - ); - when(mockedSFProjectService.onlineAddTranslateMetrics('project01', anything())).thenResolve(); - when(mockedSFProjectService.getProfile(anything())).thenCall(id => - this.realtimeService.subscribe(SFProjectProfileDoc.COLLECTION, id.toString()) - ); - when(mockedUserService.getCurrentUser()).thenCall(() => - this.realtimeService.subscribe(UserDoc.COLLECTION, 'user01') - ); - - this.sourceFixture = TestBed.createComponent(TextComponent); - - // Initialize the source text component. - // When run for the first time in a test run, this will load Quill - this.sourceFixture.detectChanges(); - tick(EDITOR_READY_TIMEOUT); - this.sourceFixture.detectChanges(); - - this.source = this.sourceFixture.componentInstance; - this.source.id = new TextDocId('project02', 40, 1, 'target'); - this.source.segmentRef = 'verse_1_1'; - this.targetFixture = TestBed.createComponent(TextComponent); - this.target = this.targetFixture.componentInstance; - this.target.id = new TextDocId('project01', 40, 1, 'target'); - this.target.segmentRef = 'verse_1_1'; - this.session = new TranslateMetricsSession( - instance(mockedSFProjectService), - 'project01', - this.source, - this.target, - this.tokenizer, - this.tokenizer, - this.testOnlineStatusService, - instance(mockedReportingService) - ); - this.targetFixture.detectChanges(); - tick(EDITOR_READY_TIMEOUT); - } - - /** @param timeSpanMs Optional milliseconds delay between pressing and releasing key. */ - keyPress(key: string, timeSpanMs: number = 0): void { - const keydownEvent: any = document.createEvent('CustomEvent'); - keydownEvent.key = key; - keydownEvent.ctrlKey = false; - keydownEvent.metaKey = false; - keydownEvent.initEvent('keydown', true, true); - this.target.editor!.root.dispatchEvent(keydownEvent); - - tick(timeSpanMs); - const keyupEvent: any = document.createEvent('CustomEvent'); - keyupEvent.key = key; - keyupEvent.ctrlKey = false; - keyupEvent.metaKey = false; - keyupEvent.initEvent('keyup', true, true); - this.target.editor!.root.dispatchEvent(keyupEvent); - } - - mouseClick(): void { - const mousedownEvent: any = document.createEvent('CustomEvent'); - mousedownEvent.initEvent('mousedown', true, true); - this.target.editor!.root.dispatchEvent(mousedownEvent); - - const mouseupEvent: any = document.createEvent('CustomEvent'); - mouseupEvent.initEvent('mouseup', true, true); - this.target.editor!.root.dispatchEvent(mouseupEvent); - } - - showSuggestion(): void { - this.session.onSuggestionShown(); - } - - clickSuggestion(): void { - this.mouseClick(); - const clickEvent: any = document.createEvent('CustomEvent'); - clickEvent.initEvent('click', true, true); - this.target.editor!.root.dispatchEvent(clickEvent); - this.session.onSuggestionAccepted(clickEvent); - } - - sessionDispose(): void { - this.session.dispose(); - tick(); - } - - private addTextDoc(id: TextDocId): void { - this.realtimeService.addSnapshot(TextDoc.COLLECTION, { - id: id.toString(), - type: RichText.type.name, - data: getTextDoc(id) - }); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.ts deleted file mode 100644 index b7eefd3ad51..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translate-metrics-session.ts +++ /dev/null @@ -1,338 +0,0 @@ -import { RangeTokenizer } from '@sillsdev/machine'; -import { cloneDeep, isEqual } from 'lodash-es'; -import { fromEvent, interval, merge, Subject } from 'rxjs'; -import { buffer, debounceTime, filter, map, tap } from 'rxjs/operators'; -import { CommandError, CommandErrorCode } from 'xforge-common/command.service'; -import { ErrorReportingService } from 'xforge-common/error-reporting.service'; -import { OnlineStatusService } from 'xforge-common/online-status.service'; -import { SubscriptionDisposable } from 'xforge-common/subscription-disposable'; -import { objectId } from 'xforge-common/utils'; -import { EditEndEvent, TranslateMetrics, TranslateMetricsType } from '../../core/models/translate-metrics'; -import { SFProjectService } from '../../core/sf-project.service'; -import { Segment } from '../../shared/text/segment'; -import { TextComponent } from '../../shared/text/text.component'; - -export const ACTIVE_EDIT_TIMEOUT = 2000; // 2 seconds -export const EDIT_TIMEOUT = 10 * 60 * 1000; // 10 minutes -export const SEND_METRICS_INTERVAL = 30 * 1000; // 30 seconds - -function getKeyActivityType(event: KeyboardEvent): ActivityType { - let type = ActivityType.Unknown; - switch (event.key) { - case 'ArrowUp': - case 'ArrowDown': - case 'ArrowRight': - case 'ArrowLeft': - case 'Home': - case 'End': - case 'PageUp': - case 'PageDown': - type = ActivityType.Navigation; - break; - - case 'Delete': - type = ActivityType.Delete; - break; - - case 'Backspace': - type = ActivityType.Backspace; - break; - - default: - if (event.key?.length === 1 && !event.ctrlKey && !event.metaKey) { - type = ActivityType.Char; - } - break; - } - return type; -} - -function createKeyActivity(event: KeyboardEvent): Activity { - return { type: getKeyActivityType(event), event, whenStarted: Date.now() }; -} - -function isActiveEditKeyActivity(type: ActivityType): boolean { - return type === ActivityType.Backspace || type === ActivityType.Delete || type === ActivityType.Char; -} - -enum ActivityType { - Unknown, - Delete, - Backspace, - Char, - Navigation, - Click, - Suggestion -} - -interface Activity { - type: ActivityType; - event: Event; - /** In ms since start of UNIX epoch. */ - whenStarted: number; -} - -/** - * This records and submits usage information for a visit to the editor component. - */ -export class TranslateMetricsSession extends SubscriptionDisposable { - readonly id: string; - metrics!: TranslateMetrics; - - private prevMetrics?: TranslateMetrics; - private readonly suggestionAccepted$ = new Subject(); - private readonly endActiveEdit$ = new Subject(); - private navigateSuggestionShown: boolean = false; - - constructor( - private readonly projectService: SFProjectService, - private readonly projectId: string, - private readonly source: TextComponent, - private readonly target: TextComponent, - private readonly sourceWordTokenizer: RangeTokenizer, - private readonly targetWordTokenizer: RangeTokenizer, - private readonly onlineStatusService: OnlineStatusService, - private readonly reportingService: ErrorReportingService - ) { - super(); - this.id = objectId(); - this.projectId = projectId; - this.source = source; - this.target = target; - this.sourceWordTokenizer = sourceWordTokenizer; - this.targetWordTokenizer = targetWordTokenizer; - this.createMetrics('navigate'); - - if (this.target.editor != null) { - this.setupSubscriptions(); - } else { - this.subscribe(this.target.loaded, () => this.setupSubscriptions()); - } - } - - get prevMetricsId(): string { - return this.prevMetrics == null ? '' : this.prevMetrics.id; - } - - private get isMetricsEmpty(): boolean { - return ( - this.metrics.keyBackspaceCount == null && - this.metrics.keyCharacterCount == null && - this.metrics.keyDeleteCount == null && - this.metrics.keyNavigationCount == null && - this.metrics.mouseClickCount == null && - this.metrics.productiveCharacterCount == null && - this.metrics.suggestionAcceptedCount == null && - this.metrics.suggestionTotalCount == null && - this.metrics.timeEditActive == null - ); - } - - dispose(): void { - this.endActiveEdit$.next(); - super.dispose(); - if (this.metrics != null && this.metrics.type === 'edit') { - this.metrics.editEndEvent = 'task-exit'; - } - void this.sendMetrics(this.target == null ? undefined : this.target.segment); - } - - onSuggestionShown(): void { - if (this.metrics.type === 'navigate') { - this.navigateSuggestionShown = true; - } else { - this.incrementMetric('suggestionTotalCount'); - } - } - - onSuggestionAccepted(event: Event): void { - this.suggestionAccepted$.next({ type: ActivityType.Suggestion, event, whenStarted: Date.now() }); - } - - private setupSubscriptions(): void { - if (this.target.editor == null) { - return; - } - - const keyDowns$ = fromEvent(this.target.editor.root, 'keydown').pipe( - filter(event => getKeyActivityType(event) !== ActivityType.Unknown), - map(event => createKeyActivity(event)) - ); - const keyUps$ = fromEvent(this.target.editor.root, 'keyup').pipe( - filter(event => getKeyActivityType(event) !== ActivityType.Unknown), - map(event => createKeyActivity(event)) - ); - const mouseClicks$ = fromEvent(window.document, 'mousedown').pipe( - map(event => ({ type: ActivityType.Click, event, whenStarted: Date.now() })) - ); - - // navigation keystrokes - const navigationKeyDowns$ = keyDowns$.pipe(filter(activity => activity.type === ActivityType.Navigation)); - this.subscribe(navigationKeyDowns$, () => this.onNavigationKey()); - - // mouse clicks - this.subscribe(mouseClicks$, () => this.onMouseDown()); - - // edit activity - const editActivity$ = merge(keyDowns$, mouseClicks$); - this.subscribe(editActivity$.pipe(debounceTime(EDIT_TIMEOUT)), () => - this.endEditIfNecessary('timeout', this.target.segment) - ); - - // segment changes - this.subscribe(this.target.updated.pipe(filter(event => event.prevSegment !== event.segment)), event => - this.endEditIfNecessary('segment-change', event.prevSegment) - ); - - // active edit activity - const activeEditKeyDowns$ = keyDowns$.pipe(filter(activity => isActiveEditKeyActivity(activity.type))); - const activeEditKeyUps$ = keyUps$.pipe(filter(activity => isActiveEditKeyActivity(activity.type))); - const activeEditActivity$ = merge(activeEditKeyDowns$, activeEditKeyUps$, this.suggestionAccepted$); - this.subscribe( - activeEditActivity$.pipe( - tap(activity => this.startEditIfNecessary(activity)), - buffer(merge(activeEditActivity$.pipe(debounceTime(ACTIVE_EDIT_TIMEOUT)), this.endActiveEdit$)) - ), - activities => this.onActiveEdit(activities) - ); - - // periodic send via a timeout callback because this can produce an error when going offline or coming online - this.subscribe(interval(SEND_METRICS_INTERVAL), () => setTimeout(() => this.sendMetrics(this.target.segment))); - } - - private async sendMetrics(segment: Segment | undefined): Promise { - if (this.metrics == null || !this.onlineStatusService.isOnline) { - return; - } - - if (this.metrics.type === 'edit' && segment != null) { - const prodCharCount = this.target.segment == null ? 0 : this.target.segment.productiveCharacterCount; - if (prodCharCount !== 0) { - this.metrics.productiveCharacterCount = prodCharCount; - } - const sourceText = this.source.getSegmentText(segment.ref); - this.metrics.sourceWordCount = Array.from(this.sourceWordTokenizer.tokenize(sourceText)).length; - this.metrics.targetWordCount = Array.from(this.targetWordTokenizer.tokenize(segment.text)).length; - } - if (!this.isMetricsEmpty && !isEqual(this.prevMetrics, this.metrics)) { - this.prevMetrics = cloneDeep(this.metrics); - try { - await this.projectService.onlineAddTranslateMetrics(this.projectId, this.metrics); - } catch (err) { - // Ignore "not found" and "forbidden" command errors, or errors caused by being offline. - - if (!this.onlineStatusService.isOnline) { - return; - } - if (!(err instanceof CommandError)) { - this.reportingService.silentError( - 'Error when adding translation metrics', - ErrorReportingService.normalizeError(err) - ); - return; - } - const commandError: CommandError = err; - if (commandError.code === CommandErrorCode.NotFound || commandError.code === CommandErrorCode.Forbidden) { - return; - } - this.reportingService.silentError( - 'Error when adding translation metrics', - ErrorReportingService.normalizeError(err) - ); - } - } - } - - private onActiveEdit(activities: Activity[]): void { - for (const activity of activities) { - if (activity.event.type === 'click' || activity.event.type === 'keydown') { - switch (activity.type) { - case ActivityType.Delete: - this.incrementMetric('keyDeleteCount'); - break; - case ActivityType.Backspace: - this.incrementMetric('keyBackspaceCount'); - break; - case ActivityType.Char: - this.incrementMetric('keyCharacterCount'); - break; - case ActivityType.Suggestion: - this.incrementMetric('suggestionAcceptedCount'); - break; - } - } - } - - let timeSpan = 30; - if (activities.length > 1) { - timeSpan = activities[activities.length - 1].whenStarted - activities[0].whenStarted; - } - this.incrementMetric('timeEditActive', Math.round(timeSpan)); - } - - private onNavigationKey(): void { - this.incrementMetric('keyNavigationCount'); - } - - private onMouseDown(): void { - this.incrementMetric('mouseClickCount'); - } - - private startEditIfNecessary(activity: Activity): void { - if (this.metrics.type === 'navigate') { - if (activity.event.type === 'click') { - this.decrementMetric('mouseClickCount'); - } - void this.sendMetrics(this.target.segment); - this.createMetrics('edit'); - if (activity.event.type === 'click') { - this.incrementMetric('mouseClickCount'); - } - } - } - - private endEditIfNecessary(editEndEvent: EditEndEvent, segment: Segment | undefined): void { - if (this.metrics.type === 'edit') { - this.metrics.editEndEvent = editEndEvent; - void this.sendMetrics(segment); - this.createMetrics('navigate'); - this.navigateSuggestionShown = false; - } - } - - private createMetrics(type: TranslateMetricsType): void { - this.metrics = { - id: objectId(), - type, - sessionId: this.id, - bookNum: this.target.id == null ? 0 : this.target.id.bookNum, - chapterNum: this.target.id == null ? 0 : this.target.id.chapterNum - }; - if (type === 'edit') { - if (this.target.segment != null) { - this.metrics.segment = this.target.segment.ref; - } - if (this.navigateSuggestionShown) { - this.metrics.suggestionTotalCount = 1; - } - } - this.navigateSuggestionShown = false; - } - - private incrementMetric(metric: Extract, amount: number = 1): void { - if (this.metrics[metric] == null) { - (this.metrics[metric] as unknown as number) = 0; - } - (this.metrics[metric] as number) += amount; - } - - private decrementMetric(metric: Extract, amount: number = 1): void { - if (this.metrics[metric] == null) { - return; - } - (this.metrics[metric] as number) -= amount; - if ((this.metrics[metric] as number) <= 0) { - delete this.metrics[metric]; - } - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.html index be659597835..9c21fb054b6 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.html +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.html @@ -1,66 +1,6 @@

{{ t("translator_settings") }}

- @if (showSuggestionsSettings) { - - - @if (!onlineStatusService.isOnline) { - - {{ t("settings_not_available_offline") }} - - } - -
- - {{ t("translation_suggestions_settings_title") }} - -
- -
- - {{ t("number_of_suggestions") }} - - @for (value of ["1", "2", "3", "4", "5"]; track value) { - {{ value }} - } - - -
- {{ - t("suggestion_confidence") - }} -
- {{ t("more") }} - {{ confidenceThreshold$ | async }}% - {{ t("better") }} -
- - - -
-
-
-
- } @if (showLynxSettings) { diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.scss index e41e05b5f50..e71594119fa 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.scss +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.scss @@ -26,12 +26,6 @@ mat-card:last-of-type { } } -.offline { - .card-title { - opacity: $disabledTextOpacity; - } -} - .settings-content { padding-inline-start: 1em; } @@ -46,28 +40,6 @@ mat-card:last-of-type { } } -.slider-labels { - margin-top: 15px; - display: flex; - justify-content: space-between; - font-size: 0.75rem; -} - -.suggestions-confidence-field { - display: flex; - flex-direction: column; - margin-top: 1em; -} - -.minor-header { - font-size: 0.875rem; - font-weight: 500; - - &.disabled { - opacity: $disabledTextOpacity; - } -} - app-notice { margin-bottom: 1em; } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.spec.ts index cad831e9676..dccb8a2c483 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.spec.ts @@ -1,12 +1,8 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; -import { DebugElement } from '@angular/core'; import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; -import { MatSelect } from '@angular/material/select'; import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing'; -import { MatSlider } from '@angular/material/slider'; -import { By } from '@angular/platform-browser'; import { SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; import { SFProjectRole } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-role'; import { createTestProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-test-data'; @@ -16,9 +12,7 @@ import { SFProjectUserConfig } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-user-config'; import { createTestProjectUserConfig } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-user-config-test-data'; -import { OnlineStatusService } from 'xforge-common/online-status.service'; import { provideTestOnlineStatus } from 'xforge-common/test-online-status-providers'; -import { TestOnlineStatusService } from 'xforge-common/test-online-status.service'; import { provideTestRealtime } from 'xforge-common/test-realtime-providers'; import { TestRealtimeService } from 'xforge-common/test-realtime.service'; import { @@ -32,7 +26,6 @@ import { SFProjectUserConfigDoc } from '../../core/models/sf-project-user-config import { SF_TYPE_REGISTRY } from '../../core/models/sf-type-registry'; import { NoticeComponent } from '../../shared/notice/notice.component'; import { - CONFIDENCE_THRESHOLD_TIMEOUT, TranslatorSettingsDialogComponent, TranslatorSettingsDialogData } from './translator-settings-dialog.component'; @@ -40,119 +33,7 @@ import { describe('TranslatorSettingsDialogComponent', () => { configureTestingModule(() => ({ imports: [getTestTranslocoModule(), NoticeComponent, TranslatorSettingsDialogComponent], - providers: [ - provideTestOnlineStatus(), - provideTestRealtime(SF_TYPE_REGISTRY), - { provide: OnlineStatusService, useClass: TestOnlineStatusService } - ] - })); - - it('update confidence threshold', fakeAsync(() => { - const env = new TestEnvironment(); - env.openDialog(); - expect(env.component!.confidenceThreshold$.value).toEqual(50); - - env.updateConfidenceThresholdSlider(60); - expect(env.component!.confidenceThreshold$.value).toEqual(60); - const userConfigDoc = env.getProjectUserConfigDoc(); - expect(userConfigDoc.data!.confidenceThreshold).toEqual(0.6); - env.closeDialog(); - })); - - it('update suggestions enabled', fakeAsync(async () => { - const env = new TestEnvironment(); - env.openDialog(); - expect(env.component!['translationSuggestionsUserEnabled']).toBe(true); - - const suggestionsToggle = await env.getSuggestionsEnabledToggle(); - expect(suggestionsToggle).not.toBeNull(); - expect(await env.isToggleChecked(suggestionsToggle!)).toBe(true); - - await env.toggleSlideToggle(suggestionsToggle!); - expect(env.component!['translationSuggestionsUserEnabled']).toBe(false); - expect(await env.isToggleChecked(suggestionsToggle!)).toBe(false); - - const userConfigDoc = env.getProjectUserConfigDoc(); - expect(userConfigDoc.data!.translationSuggestionsEnabled).toBe(false); - env.closeDialog(); - })); - - it('update num suggestions', fakeAsync(() => { - const env = new TestEnvironment(); - env.openDialog(); - expect(env.component!.numSuggestions).toEqual('1'); - - env.changeSelectValue(env.numSuggestionsSelect, 2); - expect(env.component!.numSuggestions).toEqual('2'); - const userConfigDoc = env.getProjectUserConfigDoc(); - expect(userConfigDoc.data!.numSuggestions).toEqual(2); - env.closeDialog(); - })); - - it('shows correct confidence threshold even when suggestions disabled', fakeAsync(() => { - const env = new TestEnvironment({ translationSuggestionsEnabled: false }); - env.openDialog(); - expect(env.component?.confidenceThreshold$.value).toEqual(50); - env.closeDialog(); - })); - - it('disables settings when offline', fakeAsync(() => { - const env = new TestEnvironment(); - env.openDialog(); - - expect(env.offlineAppNotice == null).toBeTrue(); - expect(env.suggestionsEnabledCheckbox.disabled).toBe(false); - expect(env.confidenceThresholdSlider.disabled).toBe(false); - expect(env.numSuggestionsSelect.disabled).toBe(false); - - env.isOnline = false; - - expect(env.offlineAppNotice == null).toBeFalse(); - expect(env.suggestionsEnabledCheckbox.disabled).toBe(true); - expect(env.confidenceThresholdSlider.disabled).toBe(true); - expect(env.numSuggestionsSelect.disabled).toBe(true); - env.closeDialog(); - })); - - it('should hide translation suggestions section when project has translation suggestions disabled', fakeAsync(async () => { - const env = new TestEnvironment(); - const projectDoc = env.getProjectProfileDoc(); - - env.setupProject({ - userConfig: { - translationSuggestionsEnabled: true - } - }); - projectDoc.submitJson0Op(op => { - op.set(p => p.translateConfig!.translationSuggestionsEnabled, false); - }); - env.fixture.detectChanges(); - - env.openDialog(); - - expect(env.component!.showSuggestionsSettings).toBe(false); - expect(env.suggestionsSection == null).toBeTrue(); - env.closeDialog(); - })); - - it('should show translation suggestions section when project has translation suggestions enabled', fakeAsync(async () => { - const env = new TestEnvironment(); - env.openDialog(); - - expect(env.component!.showSuggestionsSettings).toBe(true); - expect(env.suggestionsSection == null).toBeFalse(); - env.closeDialog(); - })); - - it('the suggestions toggle is switched on when the dialog opens while offline', fakeAsync(async () => { - const env = new TestEnvironment(); - env.isOnline = false; - env.openDialog(); - - const suggestionsToggle = await env.getSuggestionsEnabledToggle(); - expect(await env.isToggleDisabled(suggestionsToggle!)).toBe(true); - expect(await env.isToggleChecked(suggestionsToggle!)).toBe(true); - env.closeDialog(); + providers: [provideTestOnlineStatus(), provideTestRealtime(SF_TYPE_REGISTRY)] })); describe('Lynx Settings', () => { @@ -271,64 +152,17 @@ describe('TranslatorSettingsDialogComponent', () => { expect(userConfigDoc.data!.lynxInsightState?.assessmentsEnabled).toBe(false); env.closeDialog(); })); - - it('should enable Lynx settings even when offline', fakeAsync(async () => { - const env = new TestEnvironment(); - env.setupProject({ - projectConfig: { - lynxConfig: { - autoCorrectionsEnabled: true, - assessmentsEnabled: true, - punctuationCheckerEnabled: false, - allowedCharacterCheckerEnabled: false - } - } - }); - env.isOnline = false; - env.openDialog(); - - const lynxMasterToggle = await env.getLynxMasterToggle(); - const lynxAssessmentsToggle = await env.getLynxAssessmentsToggle(); - const lynxAutoCorrectToggle = await env.getLynxAutoCorrectToggle(); - const suggestionsToggle = await env.getSuggestionsEnabledToggle(); - - expect(lynxMasterToggle).not.toBeNull(); - expect(lynxAssessmentsToggle).not.toBeNull(); - expect(lynxAutoCorrectToggle).not.toBeNull(); - expect(suggestionsToggle).not.toBeNull(); - - expect(await env.isToggleDisabled(lynxMasterToggle!)).toBe(false); - expect(await env.isToggleDisabled(lynxAssessmentsToggle!)).toBe(false); - expect(await env.isToggleDisabled(lynxAutoCorrectToggle!)).toBe(false); - - // But translation suggestions should be disabled - expect(await env.isToggleDisabled(suggestionsToggle!)).toBe(true); - env.closeDialog(); - })); }); }); -interface TestEnvironmentConstructorArgs { - translationSuggestionsEnabled?: boolean; -} - class TestEnvironment { readonly fixture: ComponentFixture; component?: TranslatorSettingsDialogComponent; loader?: HarnessLoader; - readonly testOnlineStatusService: TestOnlineStatusService = TestBed.inject( - OnlineStatusService - ) as TestOnlineStatusService; - private readonly realtimeService: TestRealtimeService = TestBed.inject(TestRealtimeService); - constructor({ translationSuggestionsEnabled = true }: TestEnvironmentConstructorArgs = {}) { - this.setProjectUserConfig({ - confidenceThreshold: 0.5, - translationSuggestionsEnabled, - numSuggestions: 1 - }); - + constructor() { + this.setProjectUserConfig(); this.fixture = TestBed.createComponent(ChildViewContainerComponent); } @@ -336,38 +170,10 @@ class TestEnvironment { return this.fixture.nativeElement.parentElement.querySelector('.cdk-overlay-container'); } - get confidenceThresholdSlider(): MatSlider { - return this.fixture.debugElement.query(By.css('#confidence-threshold-slider')).componentInstance; - } - - get suggestionsEnabledSwitch(): HTMLElement { - return this.overlayContainerElement.querySelector('#translation-suggestions-master-switch') as HTMLElement; - } - - get suggestionsEnabledCheckbox(): HTMLInputElement { - return this.suggestionsEnabledSwitch.querySelector('button[role=switch]') as HTMLInputElement; - } - - get numSuggestionsSelect(): MatSelect { - return this.fixture.debugElement.query(By.css('#num-suggestions-select')).componentInstance; - } - - get offlineAppNotice(): DebugElement { - return this.fixture.debugElement.query(By.css('app-notice[icon="cloud_off"]')); - } - get closeButton(): HTMLElement { return this.overlayContainerElement.querySelector('button[mat-dialog-close]') as HTMLElement; } - get suggestionsSection(): HTMLElement | null { - // Look for the card containing the translation suggestions master switch - const suggestionsCard = this.overlayContainerElement - .querySelector('#translation-suggestions-master-switch') - ?.closest('mat-card'); - return suggestionsCard as HTMLElement | null; - } - get lynxSettingsSection(): HTMLElement | null { // Look for the card containing the lynx master switch const lynxCard = this.overlayContainerElement.querySelector('#lynx-master-switch')?.closest('mat-card'); @@ -386,11 +192,6 @@ class TestEnvironment { return this.overlayContainerElement.querySelector('#lynx-autocorrect-enabled') as HTMLElement | null; } - set isOnline(value: boolean) { - this.testOnlineStatusService.setIsOnline(value); - this.wait(); - } - closeDialog(): void { this.click(this.closeButton); tick(matDialogCloseDelay); @@ -416,12 +217,6 @@ class TestEnvironment { this.wait(); } - updateConfidenceThresholdSlider(value: number): void { - this.component!.confidenceThreshold$.next(value); - tick(CONFIDENCE_THRESHOLD_TIMEOUT); - this.fixture.detectChanges(); - } - setProjectUserConfig(userConfig: Partial = {}): void { const user1Config = createTestProjectUserConfig({ ownerRef: 'user01', @@ -433,12 +228,7 @@ class TestEnvironment { }); this.realtimeService.addSnapshot(SFProjectProfileDoc.COLLECTION, { id: 'project01', - data: createTestProjectProfile({ - translateConfig: { - translationSuggestionsEnabled: user1Config.translationSuggestionsEnabled - }, - userRoles: { user01: SFProjectRole.ParatextTranslator } - }) + data: createTestProjectProfile({ userRoles: { user01: SFProjectRole.ParatextTranslator } }) }); } @@ -451,7 +241,6 @@ class TestEnvironment { } = {}): void { const user1Config: SFProjectUserConfig = createTestProjectUserConfig({ ownerRef: 'user01', - confidenceThreshold: 0.5, ...userConfig }); @@ -462,9 +251,6 @@ class TestEnvironment { const projectProfile = { ...createTestProjectProfile({ - translateConfig: { - translationSuggestionsEnabled: user1Config.translationSuggestionsEnabled - }, userRoles: { user01: SFProjectRole.ParatextTranslator } }), ...projectConfig @@ -494,12 +280,6 @@ class TestEnvironment { tick(); } - changeSelectValue(matSelect: MatSelect, option: number): void { - matSelect.value = option; - this.fixture.detectChanges(); - tick(); - } - wait(): void { this.fixture.detectChanges(); tick(); @@ -511,13 +291,6 @@ class TestEnvironment { this.fixture.detectChanges(); } - async getSuggestionsEnabledToggle(): Promise { - if (!this.loader) return null; - return await this.loader.getHarnessOrNull( - MatSlideToggleHarness.with({ selector: '#translation-suggestions-master-switch' }) - ); - } - async getLynxMasterToggle(): Promise { if (!this.loader) return null; return await this.loader.getHarnessOrNull(MatSlideToggleHarness.with({ selector: '#lynx-master-switch' })); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.ts index 889a59624e8..7e84d8fda0d 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/editor/translator-settings-dialog.component.ts @@ -1,8 +1,6 @@ import { CdkScrollable } from '@angular/cdk/scrolling'; -import { AsyncPipe } from '@angular/common'; import { Component, DestroyRef, Inject, OnInit } from '@angular/core'; import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatOption } from '@angular/material/autocomplete'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; import { @@ -12,20 +10,12 @@ import { MatDialogContent, MatDialogTitle } from '@angular/material/dialog'; -import { MatFormField, MatLabel } from '@angular/material/form-field'; -import { MatSelect } from '@angular/material/select'; import { MatSlideToggle } from '@angular/material/slide-toggle'; -import { MatSlider, MatSliderThumb } from '@angular/material/slider'; import { TranslocoModule } from '@ngneat/transloco'; -import { BehaviorSubject } from 'rxjs'; -import { debounceTime, map, skip, startWith } from 'rxjs/operators'; -import { OnlineStatusService } from 'xforge-common/online-status.service'; +import { startWith } from 'rxjs/operators'; import { quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; import { SFProjectUserConfigDoc } from '../../core/models/sf-project-user-config-doc'; -import { NoticeComponent } from '../../shared/notice/notice.component'; - -export const CONFIDENCE_THRESHOLD_TIMEOUT = 500; export interface TranslatorSettingsDialogData { projectDoc: SFProjectProfileDoc; @@ -42,56 +32,34 @@ export interface TranslatorSettingsDialogData { MatDialogContent, MatCard, MatCardContent, - NoticeComponent, MatSlideToggle, FormsModule, ReactiveFormsModule, - MatFormField, - MatLabel, - MatSelect, - MatOption, - MatSlider, - MatSliderThumb, MatDialogActions, MatButton, - MatDialogClose, - AsyncPipe + MatDialogClose ] }) export class TranslatorSettingsDialogComponent implements OnInit { - readonly suggestionsEnabledSwitch = new FormControl({ - value: false, - disabled: !this.onlineStatusService.isOnline - }); readonly lynxMasterSwitch = new FormControl(false); readonly lynxAssessmentsEnabled = new FormControl(false); readonly lynxAutoCorrectEnabled = new FormControl(false); - showSuggestionsSettings = false; showLynxSettings = false; - translationSuggestionsDisabled = false; lynxAssessmentsProjectEnabled = false; lynxAutoCorrectProjectEnabled = false; - numSuggestions = '1'; - - readonly confidenceThreshold$ = new BehaviorSubject(20); private readonly projectDoc: SFProjectProfileDoc = this.data.projectDoc; private readonly projectUserConfigDoc: SFProjectUserConfigDoc = this.data.projectUserConfigDoc; constructor( @Inject(MAT_DIALOG_DATA) private readonly data: TranslatorSettingsDialogData, - readonly onlineStatusService: OnlineStatusService, private readonly destroyRef: DestroyRef ) {} ngOnInit(): void { this.updateComponentState(); - this.onlineStatusService.onlineStatus$ - .pipe(quietTakeUntilDestroyed(this.destroyRef)) - .subscribe(() => this.onOnlineStatusChange()); - this.projectDoc.changes$ .pipe(startWith(null), quietTakeUntilDestroyed(this.destroyRef)) .subscribe(() => this.updateComponentState()); @@ -99,33 +67,6 @@ export class TranslatorSettingsDialogComponent implements OnInit { this.projectUserConfigDoc.changes$ .pipe(quietTakeUntilDestroyed(this.destroyRef)) .subscribe(() => this.updateComponentState()); - - this.confidenceThreshold$ - .pipe( - skip(1), - debounceTime(CONFIDENCE_THRESHOLD_TIMEOUT), - map(value => value / 100), - quietTakeUntilDestroyed(this.destroyRef) - ) - .subscribe( - threshold => - void this.projectUserConfigDoc.submitJson0Op(op => op.set(puc => puc.confidenceThreshold, threshold)) - ); - } - - setConfidenceThreshold(value: number): void { - this.confidenceThreshold$.next(value); - } - - setNumSuggestions(value: string): void { - this.numSuggestions = value; - void this.projectUserConfigDoc.submitJson0Op(op => op.set(puc => puc.numSuggestions, parseInt(value, 10))); - } - - setTranslationSettingsEnabled(value: boolean): void { - void this.projectUserConfigDoc.submitJson0Op(op => - op.set(puc => puc.translationSuggestionsEnabled, value) - ); } setLynxAssessmentsEnabled(value: boolean): void { @@ -142,9 +83,6 @@ export class TranslatorSettingsDialogComponent implements OnInit { autoCorrectionsEnabled: value }); } - private get translationSuggestionsUserEnabled(): boolean { - return this.projectUserConfigDoc.data?.translationSuggestionsEnabled ?? true; - } private get lynxAssessmentsUserEnabled(): boolean { return this.projectUserConfigDoc.data?.lynxInsightState?.assessmentsEnabled ?? true; @@ -161,31 +99,12 @@ export class TranslatorSettingsDialogComponent implements OnInit { ); } - private onOnlineStatusChange(): void { - if (this.onlineStatusService.isOnline) { - this.suggestionsEnabledSwitch.enable(); - this.translationSuggestionsDisabled = !this.translationSuggestionsUserEnabled; - } else { - this.suggestionsEnabledSwitch.disable(); - this.translationSuggestionsDisabled = true; - } - } - private updateComponentState(): void { - this.showSuggestionsSettings = !!this.projectDoc.data?.translateConfig.translationSuggestionsEnabled; this.lynxAssessmentsProjectEnabled = !!this.projectDoc.data?.lynxConfig?.assessmentsEnabled; this.lynxAutoCorrectProjectEnabled = !!this.projectDoc.data?.lynxConfig?.autoCorrectionsEnabled; this.showLynxSettings = this.lynxAssessmentsProjectEnabled || this.lynxAutoCorrectProjectEnabled; - this.translationSuggestionsDisabled = !this.translationSuggestionsUserEnabled || !this.onlineStatusService.isOnline; - - if (this.projectUserConfigDoc.data != null) { - const percent = Math.round(this.projectUserConfigDoc.data.confidenceThreshold * 100); - this.numSuggestions = this.projectUserConfigDoc.data.numSuggestions.toString(); - this.confidenceThreshold$.next(percent); - } // Update form control state - this.suggestionsEnabledSwitch.setValue(this.translationSuggestionsUserEnabled, { emitEvent: false }); this.lynxAssessmentsEnabled.setValue(this.lynxAssessmentsUserEnabled, { emitEvent: false }); this.lynxAutoCorrectEnabled.setValue(this.lynxAutoCorrectUserEnabled, { emitEvent: false }); this.lynxMasterSwitch.setValue(this.lynxMasterEnabled, { emitEvent: false }); diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.html deleted file mode 100644 index 92f6bdcfc5e..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.html +++ /dev/null @@ -1,17 +0,0 @@ - - @for ( - line of i18n.interpolateVariables("translate_overview.translation_suggestions_will_be_removed", { - email: issueEmail, - date: i18n.formatDate(smtRetirementDate, { showTime: false }) - }); - track $index - ) { - @if (line.id === "email") { - {{ line.text }} - } - - @else if (line.id === "date") {{{ line.text }}} - - @else {{{ line.text }}} - } - diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.ts deleted file mode 100644 index 3876dbc8243..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/smt-retirement-notice/smt-retirement-notice.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component } from '@angular/core'; -import { I18nService } from 'xforge-common/i18n.service'; -import { environment } from '../../../environments/environment'; -import { NoticeComponent } from '../../shared/notice/notice.component'; - -@Component({ - selector: 'app-smt-retirement-notice', - imports: [NoticeComponent], - templateUrl: './smt-retirement-notice.component.html' -}) -export class SmtRetirementNoticeComponent { - readonly issueEmail = environment.issueEmail; - readonly smtRetirementDate = new Date('2026-08-04'); - - constructor(readonly i18n: I18nService) {} -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/_training-progress-theme.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/_training-progress-theme.scss deleted file mode 100644 index d55b4a72e5f..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/_training-progress-theme.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use 'sass:color'; -@use '@angular/material' as mat; -@use 'src/variables' as *; - -@mixin color($theme) { - $is-dark: mat.get-theme-type($theme) == dark; - - --sf-training-progress-background: #{mat.get-theme-color($theme, neutral, if($is-dark, 17, 100))}; - --sf-training-progress-header-background: #{if($is-dark, #{mat.get-theme-color($theme, neutral, 30)}, $sf_grey)}; - --sf-training-progress-header-text: #{mat.get-theme-color($theme, neutral, if($is-dark, 98, 100))}; - --sf-training-progress-text: #{mat.get-theme-color($theme, neutral, if($is-dark, 90, 20))}; - --sf-training-progress-complete: #{if($is-dark, mat.get-theme-color($theme, tertiary, 70), #b8d332)}; - --sf-training-progress-remaining: #{if($is-dark, color.change(mat.get-theme-color($theme, neutral, 40)), #ececec)}; - // The donut background functions both as a background color for the circle as well as an inside and outside edge - // color. - --sf-training-progress-track: #00000000; // transparent -} - -@mixin theme($theme) { - @if mat.theme-has($theme, color) { - @include color($theme); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.html deleted file mode 100644 index e1bd220dcbe..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.html +++ /dev/null @@ -1,30 +0,0 @@ - - @if (showTrainingProgress) { -
-
-
{{ t("training") }}
- -
-
-
{{ trainingMessage }}
-
- @if (trainingPercentage < 100) { - - } @else if (trainingPercentage === 100) { - check_circle_outline - } -
-
-
- } -
diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.scss deleted file mode 100644 index 6e615bcff37..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.scss +++ /dev/null @@ -1,44 +0,0 @@ -.training-progress { - position: fixed; - display: flex; - flex-direction: column; - inset-inline-end: 15px; - bottom: 10px; - border-radius: 4px; - width: 300px; - padding: 0; - background-color: var(--sf-training-progress-background); - overflow: hidden; - z-index: 3; - color: var(--sf-training-progress-text); - - > .training-title { - padding: 2px; - padding-inline-start: 10px; - display: flex; - justify-content: space-between; - align-items: center; - - > div { - color: var(--sf-training-progress-header-text); - } - background-color: var(--sf-training-progress-header-background); - } - - > .training-content { - padding: 10px; - height: 44px; - display: flex; - justify-content: space-between; - column-gap: 5px; - } -} - -#training-progress-spinner { - width: 24px; - height: 24px; -} - -#training-close-button mat-icon { - color: var(--sf-training-progress-header-text); -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.spec.ts deleted file mode 100644 index 22fb9a63e0d..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.spec.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { provideHttpClientTesting } from '@angular/common/http/testing'; -import { ComponentFixture, fakeAsync, flush, TestBed, tick } from '@angular/core/testing'; -import { ProgressStatus } from '@sillsdev/machine'; -import { Delta } from 'quill'; -import { SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; -import { SFProjectRole } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-role'; -import { createTestProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-test-data'; -import * as RichText from 'rich-text'; -import { defer, Subject } from 'rxjs'; -import { anything, instance, mock, verify, when } from 'ts-mockito'; -import { provideTestRealtime } from 'xforge-common/test-realtime-providers'; -import { TestRealtimeService } from 'xforge-common/test-realtime.service'; -import { configureTestingModule, getTestTranslocoModule } from 'xforge-common/test-utils'; -import { UserService } from 'xforge-common/user.service'; -import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; -import { SF_TYPE_REGISTRY } from '../../core/models/sf-type-registry'; -import { TextDoc, TextDocId } from '../../core/models/text-doc'; -import { TranslationEngineService } from '../../core/translation-engine.service'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; -import { TrainingProgressComponent } from './training-progress.component'; - -const mockedTranslationEngineService = mock(TranslationEngineService); -const mockedUserService = mock(UserService); - -describe('TrainingProgressComponent', () => { - configureTestingModule(() => ({ - imports: [TrainingProgressComponent, getTestTranslocoModule()], - providers: [ - provideTestRealtime(SF_TYPE_REGISTRY), - { provide: TranslationEngineService, useMock: mockedTranslationEngineService }, - { provide: UserService, useMock: mockedUserService }, - provideHttpClient(withInterceptorsFromDi()), - provideHttpClientTesting() - ] - })); - - it('should setup translation engine', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(true); - env.wait(); - - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).once(); - expect(env.trainingProgress).toBeNull(); - })); - - it('should setup the translation engine if edit permission', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(true); - env.wait(); - - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).once(); - expect(env.trainingProgress).toBeNull(); - })); - - it('should not setup the translation engine if no edit permission', fakeAsync(() => { - const env = new TestEnvironment(); - env.setCurrentUser('user02'); - env.setupProjectData(true); - env.wait(); - - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).never(); - expect(env.trainingProgress).toBeNull(); - })); - - it('should display', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(true); - env.wait(); - - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - })); - - it('should not display if suggestions disabled', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(false); - env.wait(); - - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).toBeNull(); - })); - - it('should close when the button is clicked', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(true); - env.wait(); - - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - - env.clickElement(env.closeButton); - expect(env.trainingProgress).toBeNull(); - })); - - it('should close when completed', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData(true); - env.wait(); - - env.updateTrainingProgress(0.1); - expect(env.trainingProgress).not.toBeNull(); - - env.updateTrainingProgress(1); - env.completeTrainingProgress(); - expect(env.trainingProgress).not.toBeNull(); - tick(5000); - env.wait(); - expect(env.trainingProgress).toBeNull(); - })); -}); - -class TestEnvironment { - readonly component: TrainingProgressComponent; - readonly fixture: ComponentFixture; - readonly mockedRemoteTranslationEngine = mock(RemoteTranslationEngine); - readonly realtimeService: TestRealtimeService = TestBed.inject(TestRealtimeService); - - private trainingProgress$ = new Subject(); - - constructor() { - when(mockedTranslationEngineService.createTranslationEngine('project01')).thenReturn( - instance(this.mockedRemoteTranslationEngine) - ); - when(mockedTranslationEngineService.checkHasSourceBooks(anything())).thenReturn(true); - when(this.mockedRemoteTranslationEngine.listenForTrainingStatus()).thenReturn(defer(() => this.trainingProgress$)); - this.setCurrentUser(); - - this.fixture = TestBed.createComponent(TrainingProgressComponent); - this.component = this.fixture.componentInstance; - this.component.projectId = 'project01'; - } - - get closeButton(): HTMLButtonElement { - return this.fixture.nativeElement.querySelector('#training-close-button') as HTMLButtonElement; - } - - get trainingProgress(): HTMLElement { - return this.fixture.nativeElement.querySelector('.training-progress'); - } - - private addTextDoc(id: TextDocId): void { - const delta = new Delta(); - delta.insert({ chapter: { number: id.chapterNum.toString(), style: 'c' } }); - delta.insert({ blank: true }, { segment: 'p_1' }); - delta.insert({ verse: { number: '1', style: 'v' } }); - delta.insert(`chapter ${id.chapterNum}, verse 1.`, { segment: `verse_${id.chapterNum}_1` }); - delta.insert({ verse: { number: '2', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_2` }); - delta.insert({ verse: { number: '3', style: 'v' } }); - delta.insert(`chapter ${id.chapterNum}, verse 3.`, { segment: `verse_${id.chapterNum}_3` }); - this.realtimeService.addSnapshot(TextDoc.COLLECTION, { - id: id.toString(), - type: RichText.type.name, - data: delta - }); - } - - clickElement(element: HTMLElement): void { - element.click(); - flush(); - this.fixture.detectChanges(); - } - - completeTrainingProgress(): void { - const trainingProgress$ = this.trainingProgress$; - this.trainingProgress$ = new Subject(); - trainingProgress$.complete(); - this.fixture.detectChanges(); - tick(); - } - - setCurrentUser(userId: string = 'user01'): void { - when(mockedUserService.currentUserId).thenReturn(userId); - } - - setupProjectData(translationSuggestionsEnabled: boolean): void { - this.realtimeService.addSnapshot(SFProjectProfileDoc.COLLECTION, { - id: 'project01', - data: createTestProjectProfile({ - translateConfig: { - translationSuggestionsEnabled - }, - userRoles: { - user01: SFProjectRole.ParatextTranslator, - user02: SFProjectRole.ParatextConsultant - }, - texts: [ - { - bookNum: 41, - chapters: [{ number: 1, lastVerse: 3, isValid: true, permissions: {} }], - hasSource: true, - permissions: {} - } - ] - }) - }); - - this.addTextDoc(new TextDocId('project01', 40, 1, 'target')); - } - - updateTrainingProgress(percentCompleted: number): void { - this.trainingProgress$.next({ percentCompleted, message: 'message' }); - this.fixture.detectChanges(); - } - - wait(): void { - this.fixture.detectChanges(); - tick(); - this.fixture.detectChanges(); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.ts deleted file mode 100644 index bbcf6355eab..00000000000 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/training-progress/training-progress.component.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { Component, DestroyRef, Input, OnDestroy, OnInit } from '@angular/core'; -import { MatIconButton } from '@angular/material/button'; -import { MatIcon } from '@angular/material/icon'; -import { TranslocoModule } from '@ngneat/transloco'; -import { Operation } from 'realtime-server/lib/esm/common/models/project-rights'; -import { SF_PROJECT_RIGHTS, SFProjectDomain } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-rights'; -import { BehaviorSubject, Subscription, timer } from 'rxjs'; -import { filter, repeat, retry, tap } from 'rxjs/operators'; -import { DataLoadingComponent } from 'xforge-common/data-loading-component'; -import { DonutChartComponent } from 'xforge-common/donut-chart/donut-chart.component'; -import { I18nService } from 'xforge-common/i18n.service'; -import { NoticeService } from 'xforge-common/notice.service'; -import { UserService } from 'xforge-common/user.service'; -import { quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; -import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; -import { SFProjectService } from '../../core/sf-project.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; - -@Component({ - selector: 'app-training-progress', - templateUrl: './training-progress.component.html', - styleUrls: ['./training-progress.component.scss'], - imports: [TranslocoModule, MatIconButton, MatIcon, DonutChartComponent] -}) -export class TrainingProgressComponent extends DataLoadingComponent implements OnInit, OnDestroy { - showTrainingProgress: boolean = false; - trainingMessage: string = ''; - trainingPercentage: number = 0; - private _projectId?: string; - private projectId$: BehaviorSubject = new BehaviorSubject(''); - private projectDoc?: SFProjectProfileDoc; - private projectDataChangesSub?: Subscription; - private trainingProgressClosed: boolean = false; - private trainingCompletedTimeout: any; - private trainingSub?: Subscription; - private translationEngine?: RemoteTranslationEngine; - - constructor( - noticeService: NoticeService, - private readonly projectService: SFProjectService, - private readonly translationEngineService: TranslationEngineService, - private readonly userService: UserService, - private destroyRef: DestroyRef, - private readonly i18n: I18nService - ) { - super(noticeService, 'TrainingProgressComponent'); - } - - @Input() set projectId(id: string | undefined) { - if (id == null) { - return; - } - this._projectId = id; - this.projectId$.next(id); - } - - ngOnInit(): void { - this.projectId$.pipe(quietTakeUntilDestroyed(this.destroyRef)).subscribe(async projectId => { - if (projectId === '') { - return; - } - if (this.projectDoc == null || projectId !== this._projectId) { - this.loadingStarted(); - try { - this.projectDoc = await this.projectService.getProfile(projectId); - this.setupTranslationEngine(); - } finally { - this.loadingFinished(); - } - - if (this.projectDataChangesSub != null) { - this.projectDataChangesSub.unsubscribe(); - this.projectDataChangesSub = undefined; - } - if (this.projectDoc !== null) { - this.projectDataChangesSub = this.projectDoc.remoteChanges$.subscribe(() => { - if (this.translationEngine == null || !this.translationSuggestionsEnabled) { - this.setupTranslationEngine(); - } - }); - } - } - }); - } - - ngOnDestroy(): void { - if (this.projectDataChangesSub != null) { - this.projectDataChangesSub.unsubscribe(); - } - if (this.trainingSub != null) { - this.trainingSub.unsubscribe(); - } - } - - closeTrainingProgress(): void { - this.showTrainingProgress = false; - this.trainingProgressClosed = true; - } - - /** - * Determines whether the user has the right to edit texts in this project. - */ - private get userHasGeneralEditRight(): boolean { - const project = this.projectDoc?.data; - return ( - project != null && - SF_PROJECT_RIGHTS.hasRight(project, this.userService.currentUserId, SFProjectDomain.Texts, Operation.Edit) - ); - } - - private get translationSuggestionsEnabled(): boolean { - return ( - this.projectDoc != null && - this.projectDoc.data != null && - this.projectDoc.data.translateConfig.translationSuggestionsEnabled - ); - } - - private setupTranslationEngine(): void { - if (this.trainingSub != null) { - this.trainingSub.unsubscribe(); - this.trainingSub = undefined; - } - this.translationEngine = undefined; - if (this.projectDoc?.data == null) { - return; - } - const hasSourceBooks: boolean = this.translationEngineService.checkHasSourceBooks(this.projectDoc.data); - if (!this.translationSuggestionsEnabled || !this.userHasGeneralEditRight || !hasSourceBooks) { - return; - } - - this.translationEngine = this.translationEngineService.createTranslationEngine(this.projectDoc.id); - this.trainingSub = this.translationEngine - .listenForTrainingStatus() - .pipe( - tap({ - error: () => { - // error while listening - this.showTrainingProgress = false; - this.trainingCompletedTimeout = undefined; - this.trainingProgressClosed = false; - }, - complete: () => { - // training completed successfully - if (this.trainingProgressClosed) { - this.noticeService.show(this.i18n.translateStatic('training_progress.training_completed_successfully')); - this.trainingProgressClosed = false; - } else { - this.trainingMessage = this.i18n.translateStatic('training_progress.completed_successfully'); - this.trainingCompletedTimeout = setTimeout(() => { - this.showTrainingProgress = false; - this.trainingCompletedTimeout = undefined; - }, 5000); - } - } - }), - repeat(), - filter(progress => progress.percentCompleted > 0), - retry({ delay: () => timer(30000) }) - ) - .subscribe(progress => { - if (this.trainingCompletedTimeout != null) { - clearTimeout(this.trainingCompletedTimeout); - this.trainingProgressClosed = false; - this.trainingCompletedTimeout = undefined; - } - if (!this.trainingProgressClosed) { - this.showTrainingProgress = true; - } - this.trainingPercentage = Math.round(progress.percentCompleted * 100); - // ToDo: internationalize message - this.trainingMessage = progress.message; - }); - } -} diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/_translate-overview-theme.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/_translate-overview-theme.scss index 47ce797c840..95a5c931189 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/_translate-overview-theme.scss +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/_translate-overview-theme.scss @@ -16,8 +16,6 @@ --sf-translate-progress-complete: #{if($is-dark, mat.get-theme-color($theme, tertiary, 50), #b8d332)}; --sf-translate-progress-remaining: #{if($is-dark, color.change(mat.get-theme-color($theme, neutral, 30)), #ececec)}; --sf-translate-progress-icon-color: #{if($is-dark, mat.get-theme-color($theme, neutral, 87), rgba(0, 0, 0, 0.6))}; - --sf-translate-engine-card-background: #{if($is-dark, mat.get-theme-color($theme, tertiary, 40), $greenLight)}; - --sf-translate-suggestions-info-color: #{if($is-dark, mat.get-theme-color($theme, neutral, 80), $lighterTextColor)}; } @mixin theme($theme) { diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.html b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.html index 06f1d3c82e3..a96aa3435fe 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.html +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.html @@ -5,10 +5,6 @@

{{ t("translate_overview") }}

} - @if (translationSuggestionsEnabled && canEditTexts) { - - } - @if (isOnline) {
@@ -53,67 +49,10 @@

{{ t("translate_overview") }}

}
- - @if (translationSuggestionsEnabled && canEditTexts) { - - - - {{ t("suggestion_engine") }} - - -
-
- @for (star of engineQualityStars; track $index) { - {{ - engineQuality >= star + 1 ? "star" : engineQuality === star + 0.5 ? "star_half" : "star_border" - }} - } -
-
{{ t("quality") }}
-
-
- {{ trainedSegmentCount | l10nNumber }}{{ t("trained_segments") }} -
- @if (showCannotTrainEngineMessage || !hasMinimumSegmentsToTrainStatisticalEngine) { -
- {{ - showCannotTrainEngineMessage ? t("cannot_train_suggestion_engine") : t("not_enough_verses_translated") - }} -
- } -
- - - - -
- }
- } @else { - {{ - translationSuggestionsEnabled && canEditTexts - ? t("progress_and_suggestions_not_available_offline") - : t("progress_not_available_offline") - }} + {{ t("progress_not_available_offline") }} }
diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.scss b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.scss index 50324966208..15a461b9ea0 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.scss +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.scss @@ -25,11 +25,6 @@ padding-block-end: 10px; } - .translation-suggestions-info { - color: var(--sf-translate-suggestions-info-color); - padding: 16px; - } - .books-card { width: 18rem; @@ -38,6 +33,13 @@ place-content: center space-between; } + .progress { + display: flex !important; + align-self: center !important; + width: 32px; + height: 32px; + } + .books-card-title ::ng-deep { margin-top: 4px; padding: 0 16px; @@ -65,71 +67,4 @@ } } } - - .progress { - display: flex !important; - align-self: center !important; - width: 32px; - height: 32px; - } - - .engine-card { - width: 16rem; - overflow: hidden; - - mat-card-header { - padding: 0 16px; - } - - .engine-card-title { - margin-block: 8px; - } - - .engine-card-content { - display: flex; - flex-direction: column; - padding: 0; - font-size: 14px; - - .engine-card-quality { - display: flex; - flex-direction: column; - align-self: stretch; - background-color: var(--sf-translate-engine-card-background); - padding: 26px 16px 15px 16px; - - .engine-card-quality-stars { - align-self: center; - mat-icon { - font-size: 3.5em; - height: unset; - width: unset; - } - - // the half star icon doesn't render reversed in RTL, so render the stars LTR and then rotate them - direction: ltr; - } - - .engine-card-quality-subtitle { - align-self: flex-end; - padding-right: 28px; - } - } - - .engine-card-segments { - align-self: center; - padding: 15px 16px; - - .engine-card-segments-count { - font-size: 2.25em; - margin-right: 8px; - } - } - } - - .mat-card-actions { - margin: 0; - padding: 8px; - } - } } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.spec.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.spec.ts index 20e8f74c6a8..201edbd0fa9 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.spec.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.spec.ts @@ -1,22 +1,14 @@ -import { HttpErrorResponse } from '@angular/common/http'; import { DebugElement } from '@angular/core'; import { ComponentFixture, discardPeriodicTasks, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { MatProgressBar } from '@angular/material/progress-bar'; import { By } from '@angular/platform-browser'; import { ActivatedRoute, Params } from '@angular/router'; -import { ProgressStatus } from '@sillsdev/machine'; -import { Delta } from 'quill'; import { User } from 'realtime-server/lib/esm/common/models/user'; import { createTestUser } from 'realtime-server/lib/esm/common/models/user-test-data'; import { SFProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; import { SFProjectRole } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-role'; import { createTestProjectProfile } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-test-data'; -import { getTextDocId } from 'realtime-server/lib/esm/scriptureforge/models/text-data'; -import { TextInfoPermission } from 'realtime-server/lib/esm/scriptureforge/models/text-info-permission'; -import * as RichText from 'rich-text'; -import { defer, of, Subject } from 'rxjs'; -import { anything, instance, mock, verify, when } from 'ts-mockito'; -import { AuthService } from 'xforge-common/auth.service'; +import { of } from 'rxjs'; +import { anything, mock, when } from 'ts-mockito'; import { L10nPercentPipe } from 'xforge-common/l10n-percent.pipe'; import { UserDoc } from 'xforge-common/models/user-doc'; import { NoticeService } from 'xforge-common/notice.service'; @@ -29,41 +21,24 @@ import { configureTestingModule, getTestTranslocoModule } from 'xforge-common/te import { UserService } from 'xforge-common/user.service'; import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; import { SF_TYPE_REGISTRY } from '../../core/models/sf-type-registry'; -import { TextDoc, TextDocId } from '../../core/models/text-doc'; -import { PermissionsService } from '../../core/permissions.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; import { ProgressService, ProjectProgress } from '../../shared/progress-service/progress.service'; import { FontUnsupportedMessageComponent } from '../font-unsupported-message/font-unsupported-message.component'; -import { TrainingProgressComponent } from '../training-progress/training-progress.component'; import { TranslateOverviewComponent } from './translate-overview.component'; const mockedActivatedRoute = mock(ActivatedRoute); -const mockedAuthService = mock(AuthService); -const mockedTranslationEngineService = mock(TranslationEngineService); const mockedNoticeService = mock(NoticeService); const mockedUserService = mock(UserService); -const mockedPermissionService = mock(PermissionsService); const mockedProgressService = mock(ProgressService); describe('TranslateOverviewComponent', () => { configureTestingModule(() => ({ - imports: [ - TrainingProgressComponent, - TranslateOverviewComponent, - getTestTranslocoModule(), - FontUnsupportedMessageComponent, - L10nPercentPipe - ], + imports: [TranslateOverviewComponent, getTestTranslocoModule(), FontUnsupportedMessageComponent, L10nPercentPipe], providers: [ provideTestOnlineStatus(), provideTestRealtime(SF_TYPE_REGISTRY), - { provide: AuthService, useMock: mockedAuthService }, { provide: ActivatedRoute, useMock: mockedActivatedRoute }, - { provide: TranslationEngineService, useMock: mockedTranslationEngineService }, { provide: NoticeService, useMock: mockedNoticeService }, { provide: UserService, useMock: mockedUserService }, - { provide: PermissionsService, useMock: mockedPermissionService }, { provide: OnlineStatusService, useClass: TestOnlineStatusService }, { provide: ProgressService, useMock: mockedProgressService } ] @@ -76,202 +51,44 @@ describe('TranslateOverviewComponent', () => { // Verify message hidden if offline expect(env.offlineNotice).toBeNull(); expect(env.booksCard).toBeTruthy(); - expect(env.engineCard).toBeTruthy(); // Go offline env.isOnline = false; expect(env.offlineNotice).toBeTruthy(); expect(env.booksCard).toBeNull(); - expect(env.engineCard).toBeNull(); discardPeriodicTasks(); })); - describe('Progress Card', () => { - it('should list all books in project', fakeAsync(() => { - const env = new TestEnvironment(); - env.wait(); - - expect(env.progressTitle.textContent).toContain('Progress'); - expect(env.component.projectProgress?.books.length).toEqual(4); - env.expectContainsTextProgress(0, 'Matthew', '10 of 20 segments'); - env.expectContainsTextProgress(1, 'Mark', '10 of 20 segments'); - env.expectContainsTextProgress(2, 'Luke', '10 of 20 segments'); - env.expectContainsTextProgress(3, 'John', '10 of 20 segments'); - - discardPeriodicTasks(); - })); - }); - - describe('Engine Card', () => { - it('should be hidden when translation suggestions disabled', fakeAsync(() => { - const env = new TestEnvironment(); - env.setupProjectData({ translationSuggestionsEnabled: false }); - env.wait(); - - expect(env.engineCard).toBeNull(); - - discardPeriodicTasks(); - })); - - it('should be hidden when user cannot edit texts', fakeAsync(() => { - const env = new TestEnvironment(); - env.setCurrentUser('user02'); - env.setupProjectData({ translationSuggestionsEnabled: false }); - env.wait(); - - expect(env.engineCard).toBeNull(); - - discardPeriodicTasks(); - })); - - it('should display engine stats', fakeAsync(() => { - const env = new TestEnvironment(); - env.wait(); - - expect(env.qualityStarIcons).toEqual(['star', 'star_half', 'star_border']); - expect(env.segmentsCount.nativeElement.textContent).toBe('100'); - - discardPeriodicTasks(); - })); - - it('should start training engine if not initially enabled', fakeAsync(() => { - const env = new TestEnvironment({ translationSuggestionsEnabled: false }); - env.wait(); - - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).never(); - expect(env.retrainButton).toBeNull(); - env.simulateTranslateSuggestionsEnabled(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - expect(env.retrainButton).toBeTruthy(); - - discardPeriodicTasks(); - })); - - it('training progress status', fakeAsync(() => { - const env = new TestEnvironment(); - env.wait(); - - // We need an extra tick for the TrainingProgress projectId subscription - tick(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - env.updateTrainingProgress(0.1); - expect(env.trainingProgressShown).toBe(true); - expect(env.component.isTraining).toBe(true); - env.updateTrainingProgress(1); - env.completeTrainingProgress(); - expect(env.trainingProgressShown).toBe(false); - expect(env.component.isTraining).toBe(false); - env.updateTrainingProgress(0.1); - expect(env.trainingProgressShown).toBe(true); - expect(env.component.isTraining).toBe(true); - - discardPeriodicTasks(); - })); - - it('error in training status', fakeAsync(() => { - const env = new TestEnvironment(); - env.wait(); - - // We need an extra tick for the TrainingProgress projectId subscription - tick(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - env.updateTrainingProgress(0.1); - expect(env.trainingProgressShown).toBe(true); - expect(env.component.isTraining).toBe(true); - env.throwTrainingProgressError(); - expect(env.trainingProgressShown).toBe(false); - expect(env.component.isTraining).toBe(false); - - tick(30000); - env.updateTrainingProgress(0.1); - expect(env.trainingProgressShown).toBe(true); - expect(env.component.isTraining).toBe(true); - - discardPeriodicTasks(); - })); - - it('retrain', fakeAsync(() => { - const env = new TestEnvironment(); - env.wait(); - - // We need an extra tick for the TrainingProgress projectId subscription - tick(); - verify(env.mockedRemoteTranslationEngine.listenForTrainingStatus()).twice(); - env.clickRetrainButton(); - expect(env.trainingProgressShown).toBe(true); - expect(env.trainingProgress.mode).toBe('indeterminate'); - expect(env.component.isTraining).toBe(true); - env.updateTrainingProgress(0.1); - expect(env.trainingProgress.mode).toBe('determinate'); - - discardPeriodicTasks(); - })); - - it('should display the Paratext credentials update prompt when get projects throws a forbidden error', fakeAsync(() => { - const env = new TestEnvironment(); - when(env.mockedRemoteTranslationEngine.startTraining()).thenReject(new HttpErrorResponse({ status: 401 })); - env.wait(); - - env.clickRetrainButton(); - env.wait(); - - verify(env.mockedRemoteTranslationEngine.startTraining()).once(); - verify(mockedAuthService.requestParatextCredentialUpdate()).once(); - expect(env.trainingProgressShown).toBe(false); - expect(env.component.isTraining).toBe(false); - - discardPeriodicTasks(); - })); + it('progress card should list all books in project', fakeAsync(() => { + const env = new TestEnvironment(); + env.wait(); - it('should not create engine if no source text docs', fakeAsync(() => { - const env = new TestEnvironment({ translationSuggestionsEnabled: false }); - when(mockedTranslationEngineService.checkHasSourceBooks(anything())).thenReturn(false); - verify(mockedTranslationEngineService.createTranslationEngine(anything())).never(); - expect(env.translationSuggestionsInfoMessage).toBeFalsy(); - env.simulateTranslateSuggestionsEnabled(true); - verify(mockedTranslationEngineService.createTranslationEngine(anything())).never(); - expect(env.translationSuggestionsInfoMessage).toBeTruthy(); - env.clickRetrainButton(); - verify(mockedTranslationEngineService.createTranslationEngine(anything())).never(); - expect(env.translationSuggestionsInfoMessage).toBeTruthy(); + expect(env.progressTitle.textContent).toContain('Progress'); + expect(env.component.projectProgress?.books.length).toEqual(4); + env.expectContainsTextProgress(0, 'Matthew', '10 of 20 segments'); + env.expectContainsTextProgress(1, 'Mark', '10 of 20 segments'); + env.expectContainsTextProgress(2, 'Luke', '10 of 20 segments'); + env.expectContainsTextProgress(3, 'John', '10 of 20 segments'); - discardPeriodicTasks(); - })); - }); + discardPeriodicTasks(); + })); }); -interface TestProjectConfiguration { - projectId?: string; - sourceProjectId?: string; - translationSuggestionsEnabled?: boolean; - allSegmentsBlank?: boolean; - textPermission?: TextInfoPermission; -} - class TestEnvironment { readonly component: TranslateOverviewComponent; readonly fixture: ComponentFixture; - readonly mockedRemoteTranslationEngine = mock(RemoteTranslationEngine); readonly testOnlineStatusService: TestOnlineStatusService = TestBed.inject( OnlineStatusService ) as TestOnlineStatusService; private readonly realtimeService: TestRealtimeService = TestBed.inject(TestRealtimeService); - private trainingProgress$ = new Subject(); - constructor(projectConfig: TestProjectConfiguration = {}) { + constructor() { const params = { ['projectId']: 'project01' } as Params; when(mockedActivatedRoute.params).thenReturn(of(params)); when(mockedActivatedRoute.snapshot).thenReturn({} as any); // just needs to not be null/undefined - when(mockedTranslationEngineService.createTranslationEngine('project01')).thenReturn( - instance(this.mockedRemoteTranslationEngine) - ); - when(mockedTranslationEngineService.checkHasSourceBooks(anything())).thenReturn(true); - when(this.mockedRemoteTranslationEngine.getStats()).thenResolve({ confidence: 0.25, trainedSegmentCount: 100 }); - when(this.mockedRemoteTranslationEngine.listenForTrainingStatus()).thenReturn(defer(() => this.trainingProgress$)); - when(this.mockedRemoteTranslationEngine.startTraining()).thenResolve(); when(mockedProgressService.getProgress(anything(), anything())).thenResolve( new ProjectProgress([ { bookId: 'MAT', verseSegments: 20, blankVerseSegments: 10 }, @@ -285,7 +102,7 @@ class TestEnvironment { this.fixture = TestBed.createComponent(TranslateOverviewComponent); this.component = this.fixture.componentInstance; - this.setupProjectData(projectConfig); + this.setupProjectData(); this.setupUserData(); } @@ -305,41 +122,6 @@ class TestEnvironment { return this.fixture.nativeElement.querySelector('#translate-overview-title'); } - get qualityStars(): DebugElement { - return this.fixture.debugElement.query(By.css('.engine-card-quality-stars')); - } - - get qualityStarIcons(): string[] { - const stars = this.qualityStars.queryAll(By.css('mat-icon')); - return stars.map(s => s.nativeElement.textContent); - } - - get segmentsCount(): DebugElement { - return this.fixture.debugElement.query(By.css('.engine-card-segments-count')); - } - - get translationSuggestionsInfoMessage(): DebugElement { - return this.fixture.debugElement.query(By.css('.translation-suggestions-info')); - } - - get trainingProgress(): MatProgressBar { - return this.fixture.debugElement.query(By.css('#training-progress-bar')).componentInstance; - } - - get trainingProgressShown(): boolean { - return !(this.trainingProgress._elementRef.nativeElement as HTMLElement).classList.contains( - 'mat-progress-bar--closed' - ); - } - - get retrainButton(): DebugElement { - return this.fixture.debugElement.query(By.css('#retrain-button')); - } - - get engineCard(): DebugElement { - return this.fixture.debugElement.query(By.css('.engine-card')); - } - set isOnline(value: boolean) { this.testOnlineStatusService.setIsOnline(value); this.wait(); @@ -371,154 +153,15 @@ class TestEnvironment { expect(secondaryElem.textContent).toBe(secondary); } - setupProjectData(projectConfig: TestProjectConfiguration = {}): void { - // Set default configuration values - const projectId: string = projectConfig.projectId ?? 'project01'; - const translationSuggestionsEnabled = projectConfig.translationSuggestionsEnabled ?? true; - const textPermission: TextInfoPermission = projectConfig?.textPermission ?? TextInfoPermission.Write; - when(mockedPermissionService.canAccessTextAsync(anything())).thenResolve( - textPermission !== TextInfoPermission.None - ); - - // Setup the project data + setupProjectData(): void { this.realtimeService.addSnapshot(SFProjectProfileDoc.COLLECTION, { - id: projectId, + id: 'project01', data: createTestProjectProfile({ - translateConfig: { - translationSuggestionsEnabled, - source: { - projectRef: projectConfig.sourceProjectId - } - }, userRoles: { - user01: SFProjectRole.ParatextTranslator, - user02: SFProjectRole.ParatextConsultant - }, - texts: [ - { - bookNum: 41, - chapters: [ - { - number: 1, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - number: 2, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - } - ], - hasSource: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - bookNum: 42, - chapters: [ - { - number: 1, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - number: 2, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - } - ], - hasSource: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - bookNum: 43, - chapters: [ - { - number: 1, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - number: 2, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - } - ], - hasSource: false, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - bookNum: 40, - chapters: [ - { - number: 1, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - }, - { - number: 2, - lastVerse: 3, - isValid: true, - permissions: { - user01: textPermission, - user02: textPermission - } - } - ], - hasSource: true, - permissions: { - user01: textPermission, - user02: textPermission - } - } - ] + user01: SFProjectRole.ParatextTranslator + } }) }); - - this.addTextDoc(new TextDocId(projectId, 40, 1, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 40, 2, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 41, 1, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 41, 2, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 42, 1, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 42, 2, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 43, 1, 'target'), projectConfig.allSegmentsBlank); - this.addTextDoc(new TextDocId(projectId, 43, 2, 'target'), projectConfig.allSegmentsBlank); } setupUserData(userId: string = 'user01', projects: string[] = ['project01']): void { @@ -533,99 +176,4 @@ class TestEnvironment { }) }); } - - updateTrainingProgress(percentCompleted: number): void { - this.trainingProgress$.next({ percentCompleted, message: 'message' }); - this.fixture.detectChanges(); - } - - throwTrainingProgressError(): void { - const trainingProgress$ = this.trainingProgress$; - this.trainingProgress$ = new Subject(); - trainingProgress$.error(new HttpErrorResponse({ status: 404 })); - this.fixture.detectChanges(); - } - - completeTrainingProgress(): void { - const trainingProgress$ = this.trainingProgress$; - this.trainingProgress$ = new Subject(); - trainingProgress$.complete(); - this.fixture.detectChanges(); - tick(); - } - - clickRetrainButton(): void { - this.retrainButton.nativeElement.click(); - this.fixture.detectChanges(); - } - - addVerse(bookNum: number, chapter: number): void { - const delta = new Delta(); - delta.insert(`chapter ${chapter}, verse 22.`, { segment: `verse_${chapter}_22` }); - - const textDoc = this.realtimeService.get(TextDoc.COLLECTION, getTextDocId('project01', bookNum, chapter)); - textDoc.submit({ ops: delta.ops }); - this.waitForProjectDocChanges(); - } - - simulateTranslateSuggestionsEnabled(enabled: boolean = true): void { - const projectDoc: SFProjectProfileDoc = this.realtimeService.get(SFProjectProfileDoc.COLLECTION, 'project01'); - projectDoc.submitJson0Op( - op => op.set(p => p.translateConfig.translationSuggestionsEnabled, enabled), - false - ); - this.waitForProjectDocChanges(); - } - - private addTextDoc(id: TextDocId, allSegmentsBlank?: boolean): void { - const delta = new Delta(); - delta.insert({ chapter: { number: id.chapterNum.toString(), style: 'c' } }); - delta.insert({ blank: true }, { segment: 'p_1' }); - delta.insert({ verse: { number: '1', style: 'v' } }); - if (allSegmentsBlank) { - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_1` }); - } else { - delta.insert(`chapter ${id.chapterNum}, verse 1.`, { segment: `verse_${id.chapterNum}_1` }); - } - delta.insert({ verse: { number: '2', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_2` }); - delta.insert({ verse: { number: '3', style: 'v' } }); - if (allSegmentsBlank) { - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_3` }); - } else { - delta.insert(`chapter ${id.chapterNum}, verse 3.`, { segment: `verse_${id.chapterNum}_3` }); - } - delta.insert({ verse: { number: '4', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_4` }); - delta.insert({ verse: { number: '5', style: 'v' } }); - if (allSegmentsBlank) { - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_5` }); - } else { - delta.insert(`chapter ${id.chapterNum}, verse 5.`, { segment: `verse_${id.chapterNum}_5` }); - } - delta.insert({ verse: { number: '6', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_6` }); - delta.insert({ verse: { number: '7', style: 'v' } }); - if (allSegmentsBlank) { - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_7` }); - } else { - delta.insert(`chapter ${id.chapterNum}, verse 7.`, { segment: `verse_${id.chapterNum}_7` }); - } - delta.insert({ verse: { number: '8', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_8` }); - delta.insert({ verse: { number: '9', style: 'v' } }); - if (allSegmentsBlank) { - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_9` }); - } else { - delta.insert(`chapter ${id.chapterNum}, verse 9.`, { segment: `verse_${id.chapterNum}_9` }); - } - delta.insert({ verse: { number: '10', style: 'v' } }); - delta.insert({ blank: true }, { segment: `verse_${id.chapterNum}_10` }); - delta.insert('\n', { para: { style: 'p' } }); - this.realtimeService.addSnapshot(TextDoc.COLLECTION, { - id: id.toString(), - type: RichText.type.name, - data: delta - }); - } } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.ts b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.ts index 57e046ac7cc..37b8a60b459 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.ts +++ b/src/SIL.XForge.Scripture/ClientApp/src/app/translate/translate-overview/translate-overview.component.ts @@ -1,7 +1,5 @@ -import { HttpErrorResponse } from '@angular/common/http'; -import { Component, DestroyRef, OnDestroy, OnInit } from '@angular/core'; -import { MatButton } from '@angular/material/button'; -import { MatCard, MatCardActions, MatCardContent, MatCardHeader, MatCardTitle } from '@angular/material/card'; +import { Component, DestroyRef, OnInit } from '@angular/core'; +import { MatCard, MatCardHeader, MatCardTitle } from '@angular/material/card'; import { MatDivider } from '@angular/material/divider'; import { MatIcon } from '@angular/material/icon'; import { @@ -12,7 +10,6 @@ import { MatListItemMeta, MatListItemTitle } from '@angular/material/list'; -import { MatProgressBar } from '@angular/material/progress-bar'; import { MatTooltip } from '@angular/material/tooltip'; import { ActivatedRoute } from '@angular/router'; import { TranslocoModule } from '@ngneat/transloco'; @@ -22,10 +19,8 @@ import { ANY_INDEX, obj } from 'realtime-server/lib/esm/common/utils/obj-path'; import { SFProject } from 'realtime-server/lib/esm/scriptureforge/models/sf-project'; import { SF_PROJECT_RIGHTS, SFProjectDomain } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-rights'; import { isParatextRole } from 'realtime-server/lib/esm/scriptureforge/models/sf-project-role'; -import { TextInfo } from 'realtime-server/lib/esm/scriptureforge/models/text-info'; -import { asyncScheduler, Subscription, timer } from 'rxjs'; -import { filter, map, repeat, retry, tap, throttleTime } from 'rxjs/operators'; -import { AuthService } from 'xforge-common/auth.service'; +import { asyncScheduler, Subscription } from 'rxjs'; +import { filter, map, throttleTime } from 'rxjs/operators'; import { DataLoadingComponent } from 'xforge-common/data-loading-component'; import { DonutChartComponent } from 'xforge-common/donut-chart/donut-chart.component'; import { I18nService } from 'xforge-common/i18n.service'; @@ -38,14 +33,9 @@ import { UserService } from 'xforge-common/user.service'; import { quietTakeUntilDestroyed } from 'xforge-common/util/rxjs-util'; import { SFProjectProfileDoc } from '../../core/models/sf-project-profile-doc'; import { SFProjectService } from '../../core/sf-project.service'; -import { TranslationEngineService } from '../../core/translation-engine.service'; -import { RemoteTranslationEngine } from '../../machine-api/remote-translation-engine'; import { NoticeComponent } from '../../shared/notice/notice.component'; import { BookProgress, ProgressService, ProjectProgress } from '../../shared/progress-service/progress.service'; import { FontUnsupportedMessageComponent } from '../font-unsupported-message/font-unsupported-message.component'; -import { SmtRetirementNoticeComponent } from '../smt-retirement-notice/smt-retirement-notice.component'; -import { TrainingProgressComponent } from '../training-progress/training-progress.component'; -const ENGINE_QUALITY_STAR_COUNT = 3; const TEXT_PATH_TEMPLATE = obj().pathTemplate(p => p.texts[ANY_INDEX]); @Component({ @@ -69,51 +59,27 @@ const TEXT_PATH_TEMPLATE = obj().pathTemplate(p => p.texts[ANY_INDEX] MatListItemTitle, MatListItemLine, MatListItemMeta, - MatProgressBar, - MatCardContent, - MatCardActions, - MatButton, - TrainingProgressComponent, - SmtRetirementNoticeComponent, NoticeComponent, L10nNumberPipe, L10nPercentPipe ] }) -export class TranslateOverviewComponent extends DataLoadingComponent implements OnInit, OnDestroy { - trainingPercentage: number = 0; - isTraining: boolean = false; - readonly engineQualityStars: number[]; - engineQuality: number = 0; - engineConfidence: number = 0; - trainedSegmentCount: number = 0; +export class TranslateOverviewComponent extends DataLoadingComponent implements OnInit { projectProgress?: ProjectProgress; - private trainingSub?: Subscription; - private translationEngine?: RemoteTranslationEngine; private projectDoc?: SFProjectProfileDoc; private projectDataChangesSub?: Subscription; constructor( private readonly activatedRoute: ActivatedRoute, - private readonly authService: AuthService, private readonly onlineStatusService: OnlineStatusService, noticeService: NoticeService, private readonly projectService: SFProjectService, - private readonly translationEngineService: TranslationEngineService, private readonly userService: UserService, public readonly progressService: ProgressService, readonly i18n: I18nService, private destroyRef: DestroyRef ) { super(noticeService, 'TranslateOverviewComponent'); - this.engineQualityStars = []; - for (let i = 0; i < ENGINE_QUALITY_STAR_COUNT; i++) { - this.engineQualityStars.push(i); - } - } - - get translationSuggestionsEnabled(): boolean { - return this.projectDoc?.data?.translateConfig.translationSuggestionsEnabled ?? false; } get canEditTexts(): boolean { @@ -128,14 +94,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements return this.onlineStatusService.isOnline; } - get showCannotTrainEngineMessage(): boolean { - if (this.projectDoc?.data == null || !this.isOnline) { - return false; - } - const hasSourceBooks: boolean = this.translationEngineService.checkHasSourceBooks(this.projectDoc.data); - return this.translationSuggestionsEnabled && !hasSourceBooks; - } - get projectId(): string | undefined { return this.projectDoc?.id; } @@ -144,10 +102,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements return isParatextRole(this.projectDoc?.data?.userRoles[this.userService.currentUserId]); } - get hasMinimumSegmentsToTrainStatisticalEngine(): boolean { - return (this.projectProgress?.translatedVerseSegments ?? 0) >= 10; - } - ngOnInit(): void { this.activatedRoute.params .pipe( @@ -161,10 +115,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements void this.onlineStatusService.online.then(async () => { this.loadingStarted(); try { - if (this.translationEngine == null) { - this.setupTranslationEngine(); - } - await this.updateEngineStats(); this.projectProgress = await this.progressService.getProgress(this.projectId!, { maxStalenessMs: 30_000 }); } finally { this.loadingFinished(); @@ -176,11 +126,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements } this.projectDataChangesSub = this.projectDoc.remoteChanges$ .pipe( - tap(() => { - if (this.translationEngine == null || !this.translationSuggestionsEnabled) { - this.setupTranslationEngine(); - } - }), filter(ops => ops.some(op => TEXT_PATH_TEMPLATE.matches(op.p))), // TODO Find a better solution than merely throttling remote changes throttleTime(1000, asyncScheduler, { leading: true, trailing: true }) @@ -188,7 +133,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements .subscribe(async () => { this.loadingStarted(); try { - await this.updateEngineStats(); this.projectProgress = await this.progressService.getProgress(this.projectId!, { maxStalenessMs: 30_000 }); @@ -199,31 +143,6 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements }); } - ngOnDestroy(): void { - if (this.trainingSub != null) { - this.trainingSub.unsubscribe(); - } - } - - startTraining(): void { - if (this.translationEngine == null) { - return; - } - this.trainingPercentage = 0; - this.isTraining = true; - void this.translationEngine - .startTraining() - .catch((error: any) => { - this.isTraining = false; - if (error instanceof HttpErrorResponse && error.status === 401) { - void this.authService.requestParatextCredentialUpdate(); - } else { - this.noticeService.showError(this.i18n.translateStatic('translate_overview.training_unavailable')); - } - }) - .then(() => void this.listenForStatus()); - } - getBookNameFromId(bookId: string): string { const bookNum = Canon.bookIdToNumber(bookId); return this.i18n.localizeBook(bookNum); @@ -239,73 +158,4 @@ export class TranslateOverviewComponent extends DataLoadingComponent implements } return this.bookTranslatedSegments(bookProgress) / bookProgress.verseSegments; } - - getBookName(text: TextInfo): string { - return this.i18n.localizeBook(text.bookNum); - } - - getBookId(text: TextInfo): string { - return Canon.bookNumberToId(text.bookNum); - } - - private setupTranslationEngine(): void { - if (this.trainingSub != null) { - this.trainingSub.unsubscribe(); - this.trainingSub = undefined; - } - this.translationEngine = undefined; - if (this.projectDoc?.data == null) { - return; - } - const hasSourceBooks: boolean = this.translationEngineService.checkHasSourceBooks(this.projectDoc.data); - if (!this.translationSuggestionsEnabled || !this.canEditTexts || !hasSourceBooks) { - return; - } - - this.translationEngine = this.translationEngineService.createTranslationEngine(this.projectDoc.id); - this.listenForStatus(); - } - - private listenForStatus(): void { - if (this.translationEngine == null) { - return; - } - this.trainingSub?.unsubscribe(); - this.trainingSub = this.translationEngine - .listenForTrainingStatus() - .pipe( - tap({ - error: () => { - // error while listening - this.isTraining = false; - }, - complete: () => { - // training completed successfully - this.isTraining = false; - void this.updateEngineStats(); - } - }), - repeat(), - retry({ delay: () => timer(30000) }) - ) - .subscribe(progress => { - this.trainingPercentage = Math.round(progress.percentCompleted * 100); - this.isTraining = true; - }); - } - - private async updateEngineStats(): Promise { - if (this.translationEngine == null) { - return; - } - const stats = await this.translationEngine.getStats(); - - this.engineConfidence = Math.round(stats.confidence * 100) / 100; - - const rescaledConfidence = Math.min(1.0, stats.confidence / 0.6); - const quality = rescaledConfidence * ENGINE_QUALITY_STAR_COUNT; - this.engineQuality = Math.round(quality * 2) / 2; - - this.trainedSegmentCount = stats.trainedSegmentCount; - } } diff --git a/src/SIL.XForge.Scripture/ClientApp/src/assets/i18n/non_checking_en.json b/src/SIL.XForge.Scripture/ClientApp/src/assets/i18n/non_checking_en.json index a6f33b56ff9..d6e0b63852a 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/assets/i18n/non_checking_en.json +++ b/src/SIL.XForge.Scripture/ClientApp/src/assets/i18n/non_checking_en.json @@ -551,7 +551,6 @@ "text_doc_corrupted": "This chapter cannot be edited because the data has become corrupted.", "text_has_been_deleted": "The book has been deleted or is no longer accessible.", "to_report_issue_email": "To report an issue, email {{ issueEmailLink }}.", - "verse_too_long_for_suggestions": "This verse is too long to generate suggestions.", "your_comment": "Your comment" }, "editor_draft_tab": { @@ -864,9 +863,6 @@ "source_projects_cannot_be_deleted": "Another project is based on this project and so it cannot be deleted.", "source_text_placeholder": "Source text (optional)", "translate": "Translate", - "translation_suggestions_require_source_text": "Note: Translation suggestions are only available if a source text is selected.", - "translation_suggestions": "Enable Translation Suggestions", - "translations_will_be_suggested": "Translations for words and phrases will be suggested as you edit Scripture based on the project or resource selected above.", "hide_community_checking_text": "Hide Scripture text", "checkers_listen_to_scripture_audio": "Checkers will need to listen to Scripture audio.", "insights_settings_header": "Insights", @@ -898,16 +894,10 @@ "select": "Select" }, "translator_settings_dialog": { - "better": "Better", "close": "Close", "insights_enable_assessments": "Show assessments", "insights_enable_autocorrect": "Allow auto-corrections", "insights_settings_title": "Insights", - "more": "More", - "number_of_suggestions": "Number of suggestions", - "settings_not_available_offline": "Translation suggestion settings are not available while you are offline.", - "suggestion_confidence": "Suggestion confidence", - "translation_suggestions_settings_title": "Translation suggestions", "translator_settings": "Translator settings" }, "supported_back_translation_languages_dialog": { @@ -976,26 +966,11 @@ "upload_training_data": "Upload Training Data", "uploading": "Uploading..." }, - "training_progress": { - "completed_successfully": "Completed successfully", - "training_completed_successfully": "Training completed successfully", - "training": "Training" - }, "translate_overview": { - "cannot_train_suggestion_engine": "Translation suggestions are unavailable. Please select a source project that shares books in common with this project to get translation suggestions.", - "not_enough_verses_translated": "Translation suggestions are unavailable. Please ensure that there are at least 10 matching verses translated in the source and target projects.", "progress": "Progress", - "progress_and_suggestions_not_available_offline": "Translation progress and suggestions are not available when offline.", "progress_not_available_offline": "Translation progress is not available when offline.", - "quality": "Quality", - "retrain": "Retrain", - "suggestion_engine": "Suggestion Engine", - "trained_segments": "trained segments", - "training": "Training...", - "training_unavailable": "Training is temporarily unavailable", "translate_overview": "Translate Overview", - "translated_segments": "{{ translatedSegments }} of {{ total }} segments", - "translation_suggestions_will_be_removed": "Your project appears to be using the translation suggestions feature. Translation suggestions will be removed {{ date }}. Please contact {{ email }} to discuss alternative ways to translate using Scripture Forge." + "translated_segments": "{{ translatedSegments }} of {{ total }} segments" }, "draft_signup": { "additional_comments_label": "Additional comments", diff --git a/src/SIL.XForge.Scripture/ClientApp/src/material-styles.scss b/src/SIL.XForge.Scripture/ClientApp/src/material-styles.scss index 5e730ee8c49..b948c24284a 100644 --- a/src/SIL.XForge.Scripture/ClientApp/src/material-styles.scss +++ b/src/SIL.XForge.Scripture/ClientApp/src/material-styles.scss @@ -34,7 +34,6 @@ @use 'src/app/translate/biblical-terms/biblical-terms-theme' as sf-biblical-terms; @use 'src/app/translate/font-unsupported-message/font-unsupported-message-theme' as sf-font-unsupported-message; @use 'src/app/translate/translate-overview/translate-overview-theme' as sf-translate-overview; -@use 'src/app/translate/training-progress/training-progress-theme' as sf-training-progress; @use 'src/app/permissions-viewer/permissions-viewer-theme' as sf-permissions-viewer; @use 'src/app/serval-administration/draft-jobs-theme' as sf-draft-jobs; @use 'src/app/serval-administration/job-details-dialog-theme' as sf-job-details-dialog; @@ -81,7 +80,6 @@ @include sf-tab-group.theme($theme); @include sf-text.theme($theme); @include sf-translate-overview.theme($theme); - @include sf-training-progress.theme($theme); @include sf-permissions-viewer.theme($theme); @include sf-draft-jobs.theme($theme); @include sf-job-details-dialog.theme($theme); diff --git a/src/SIL.XForge.Scripture/Controllers/MachineApiController.cs b/src/SIL.XForge.Scripture/Controllers/MachineApiController.cs index 13ea9a50798..177da31c847 100644 --- a/src/SIL.XForge.Scripture/Controllers/MachineApiController.cs +++ b/src/SIL.XForge.Scripture/Controllers/MachineApiController.cs @@ -91,7 +91,6 @@ await _machineApiService.CancelPreTranslationBuildAsync( /// The Scripture Forge project identifier. /// The build identifier. /// The minimum revision. - /// true if the build is a pre-translation build. /// The cancellation token. /// Omitting returns the current build running for the project. /// The build is running. @@ -104,7 +103,6 @@ await _machineApiService.CancelPreTranslationBuildAsync( string sfProjectId, string? buildId, [FromQuery] int? minRevision, - [FromQuery] bool preTranslate, CancellationToken cancellationToken ) { @@ -118,7 +116,6 @@ CancellationToken cancellationToken build = await _machineApiService.GetQueuedStateAsync( _userAccessor.UserId, sfProjectId, - preTranslate, isServalAdmin, cancellationToken ); @@ -136,7 +133,6 @@ CancellationToken cancellationToken _userAccessor.UserId, sfProjectId, minRevision, - preTranslate, isServalAdmin, cancellationToken ) @@ -145,7 +141,6 @@ CancellationToken cancellationToken sfProjectId, buildId, minRevision, - preTranslate, isServalAdmin, cancellationToken ); @@ -179,7 +174,6 @@ CancellationToken cancellationToken /// The Scripture Forge project identifier. /// The build identifier. /// The minimum revision. - /// true if the build is a pre-translation build. /// The cancellation token. /// The build is returned. /// You do not have permission to retrieve builds for this project. @@ -190,7 +184,6 @@ CancellationToken cancellationToken string sfProjectId, string buildId, [FromQuery] int? minRevision, - [FromQuery] bool preTranslate, CancellationToken cancellationToken ) { @@ -202,7 +195,6 @@ CancellationToken cancellationToken sfProjectId, buildId, minRevision, - preTranslate, isServalAdmin, cancellationToken ); @@ -228,7 +220,6 @@ CancellationToken cancellationToken /// Gets the previous and current builds for a project. /// /// The Scripture Forge project identifier. - /// true if the builds are pre-translation builds. /// The cancellation token. /// The builds are returned. /// You do not have permission to retrieve builds for this project. @@ -237,7 +228,6 @@ CancellationToken cancellationToken [HttpGet(MachineApi.GetBuilds)] public async Task>> GetBuildsAsync( string sfProjectId, - [FromQuery] bool preTranslate, CancellationToken cancellationToken ) { @@ -248,7 +238,6 @@ CancellationToken cancellationToken await _machineApiService.GetBuildsAsync( _userAccessor.UserId, sfProjectId, - preTranslate, isServalAdmin, cancellationToken ) @@ -361,50 +350,10 @@ CancellationToken cancellationToken } } - /// - /// Gets a translation engine. - /// - /// The Scripture Forge project identifier. - /// The cancellation token. - /// The translation engine is configured for the project. - /// You do not have permission to retrieve the translation engine for this project. - /// The project does not exist or is not configured on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpGet(MachineApi.GetEngine)] - public async Task> GetEngineAsync( - string sfProjectId, - CancellationToken cancellationToken - ) - { - try - { - ServalEngineDto engine = await _machineApiService.GetEngineAsync( - _userAccessor.UserId, - sfProjectId, - cancellationToken - ); - return Ok(engine); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - } - /// /// Gets a translation engine exactly as Serval provides it. /// /// The Scripture Forge project identifier. - /// true if the engine is a pre-translation engine. /// The cancellation token. /// The engine is returned. /// You do not have permission to retrieve the engine for this project. @@ -413,7 +362,6 @@ CancellationToken cancellationToken [HttpGet(MachineApi.GetRawEngine)] public async Task> GetRawEngineAsync( string sfProjectId, - [FromQuery] bool preTranslate, CancellationToken cancellationToken ) { @@ -423,7 +371,6 @@ CancellationToken cancellationToken TranslationEngine? engine = await _machineApiService.GetRawEngineAsync( _userAccessor.UserId, sfProjectId, - preTranslate, isServalAdmin, cancellationToken ); @@ -913,53 +860,6 @@ CancellationToken cancellationToken } } - /// - /// Gets the word graph that represents all possible translations of a segment of text. - /// - /// The Scripture Forge project identifier. - /// The source segment. - /// The cancellation token. - /// The word graph was successfully generated. - /// You do not have permission to retrieve the word graph for this project. - /// The project does not exist or is not configured on the ML server. - /// The engine has not been built on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpPost(MachineApi.GetWordGraph)] - public async Task> GetWordGraphAsync( - string sfProjectId, - [FromBody] string segment, - CancellationToken cancellationToken - ) - { - try - { - WordGraph wordGraph = await _machineApiService.GetWordGraphAsync( - _userAccessor.UserId, - sfProjectId, - segment, - cancellationToken - ); - return Ok(wordGraph); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - catch (InvalidOperationException) - { - return Conflict(); - } - } - /// /// Retrieves information on whether a language is supported by Serval. /// @@ -985,50 +885,6 @@ CancellationToken cancellationToken } } - /// - /// Starts a build job for a translation engine. - /// - /// The Scripture Forge project identifier. - /// The cancellation token. - /// The build was successfully started. - /// Your Paratext tokens have expired, and you must log in again. - /// You do not have permission to build this project. - /// The project does not exist or is not configured on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpPost(MachineApi.StartBuild)] - public async Task StartBuildAsync([FromBody] string sfProjectId, CancellationToken cancellationToken) - { - try - { - await _machineApiService.StartBuildAsync(_userAccessor.UserId, sfProjectId, cancellationToken); - ServalBuildDto? build = await _machineApiService.GetQueuedStateAsync( - _userAccessor.UserId, - sfProjectId, - preTranslate: false, - isServalAdmin: false, - cancellationToken - ); - return Ok(build); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - catch (UnauthorizedAccessException) - { - return Unauthorized(); - } - } - /// /// Starts a pre-translation build job. /// @@ -1087,135 +943,6 @@ await _machineApiService.StartPreTranslationBuildAsync( } } - /// - /// Incrementally trains a translation engine with a segment pair. - /// - /// The Scripture Forge project identifier. - /// The segment pair. - /// The cancellation token. - /// The segment was successfully trained. - /// You do not have permission to train a segment for this project. - /// The project does not exist or is not configured on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpPost(MachineApi.TrainSegment)] - public async Task TrainSegmentAsync( - string sfProjectId, - [FromBody] SegmentPair segmentPair, - CancellationToken cancellationToken - ) - { - try - { - await _machineApiService.TrainSegmentAsync( - _userAccessor.UserId, - sfProjectId, - segmentPair, - cancellationToken - ); - return Ok(); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - } - - /// - /// Translates a segment of text. - /// - /// The Scripture Forge project identifier. - /// The source segment. - /// The cancellation token. - /// The translation was successfully generated. - /// You do not have permission to translate a segment for this project. - /// The project does not exist or is not configured on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpPost(MachineApi.Translate)] - public async Task> TranslateAsync( - string sfProjectId, - [FromBody] string segment, - CancellationToken cancellationToken - ) - { - try - { - TranslationResult translationResult = await _machineApiService.TranslateAsync( - _userAccessor.UserId, - sfProjectId, - segment, - cancellationToken - ); - return Ok(translationResult); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - } - - /// - /// Translates a segment of text into the top N results. - /// - /// The Scripture Forge project identifier. - /// The number of translations. - /// The source segment. - /// The cancellation token. - /// The translation was successfully generated. - /// You do not have permission to translate a segment for this project. - /// The project does not exist or is not configured on the ML server. - /// The ML server is temporarily unavailable or unresponsive. - [HttpPost(MachineApi.TranslateN)] - public async Task> TranslateNAsync( - string sfProjectId, - int n, - [FromBody] string segment, - CancellationToken cancellationToken - ) - { - try - { - TranslationResult[] translationResults = await _machineApiService.TranslateNAsync( - _userAccessor.UserId, - sfProjectId, - n, - segment, - cancellationToken - ); - return Ok(translationResults); - } - catch (BrokenCircuitException e) - { - _exceptionHandler.ReportException(e); - return StatusCode(StatusCodes.Status503ServiceUnavailable, MachineApiUnavailable); - } - catch (DataNotFoundException) - { - return NotFound(); - } - catch (ForbiddenException) - { - return Forbid(); - } - } - /// /// Constructs a from the supplied format query parameters, or returns /// null if neither is specified. diff --git a/src/SIL.XForge.Scripture/Controllers/SFProjectsRpcController.cs b/src/SIL.XForge.Scripture/Controllers/SFProjectsRpcController.cs index 899c266bcbf..419736beed2 100644 --- a/src/SIL.XForge.Scripture/Controllers/SFProjectsRpcController.cs +++ b/src/SIL.XForge.Scripture/Controllers/SFProjectsRpcController.cs @@ -215,7 +215,6 @@ public async Task UpdateSettings(string projectId, SFProjectSe : string.Join(',', settings.TrainingSourcesParatextIds) }, { "CheckingEnabled", settings?.CheckingEnabled?.ToString() }, - { "TranslationSuggestionsEnabled", settings?.TranslationSuggestionsEnabled?.ToString() }, { "UsersSeeEachOthersResponses", settings?.UsersSeeEachOthersResponses?.ToString() }, { "HideCommunityCheckingText", settings?.HideCommunityCheckingText?.ToString() }, } diff --git a/src/SIL.XForge.Scripture/Models/MachineApi.cs b/src/SIL.XForge.Scripture/Models/MachineApi.cs index 1a97acbca20..4a62dff290c 100644 --- a/src/SIL.XForge.Scripture/Models/MachineApi.cs +++ b/src/SIL.XForge.Scripture/Models/MachineApi.cs @@ -8,19 +8,13 @@ public static class MachineApi public const string HttpClientName = "machine_api"; public const string TokenClientName = "machine_api_token"; public const string Namespace = "machine-api/v3"; - public const string StartBuild = "translation/builds"; public const string GetBuild = "translation/builds/id:{sfProjectId}.{buildId?}"; public const string GetRawBuild = "translation/builds/id:{sfProjectId}.{buildId}/raw"; public const string GetBuilds = "translation/builds/project:{sfProjectId}"; public const string GetBuildsSince = "translation/builds/since:{dateTime}"; public const string GetBuildConfidences = "translation/builds/id:{sfProjectId}.{buildId}/confidences"; - public const string GetEngine = "translation/engines/project:{sfProjectId}"; public const string GetRawEngine = "translation/engines/project:{sfProjectId}/raw"; - public const string GetWordGraph = "translation/engines/project:{sfProjectId}/actions/getWordGraph"; public const string IsLanguageSupported = "translation/languages/{languageCode}"; - public const string TrainSegment = "translation/engines/project:{sfProjectId}/actions/trainSegment"; - public const string Translate = "translation/engines/project:{sfProjectId}/actions/translate"; - public const string TranslateN = "translation/engines/project:{sfProjectId}/actions/translate/{n}"; public const string StartPreTranslationBuild = "translation/pretranslations"; public const string CancelPreTranslationBuild = "translation/pretranslations/cancel"; public const string GetPreTranslationDelta = @@ -47,6 +41,5 @@ public static string GetBuildHref(string sfProjectId, string buildId) return $"{Namespace}/{buildHref}".TrimEnd('.'); } - public static string GetEngineHref(string sfProjectId) => - $"{Namespace}/{GetEngine.Replace("{sfProjectId}", sfProjectId)}"; + public static string GetEngineHref(string sfProjectId) => $"{Namespace}/translation/engines/project:{sfProjectId}"; } diff --git a/src/SIL.XForge.Scripture/Models/SFProjectCreateSettings.cs b/src/SIL.XForge.Scripture/Models/SFProjectCreateSettings.cs index 612857d35da..06c4555a5df 100644 --- a/src/SIL.XForge.Scripture/Models/SFProjectCreateSettings.cs +++ b/src/SIL.XForge.Scripture/Models/SFProjectCreateSettings.cs @@ -21,7 +21,7 @@ public class SFProjectCreateSettings /// The source Paratext project identifier. /// /// - /// This will specify the project to be used for SMT suggestions and the left hand panel in the editor. + /// This will specify the project to be used for the left hand panel in the editor. /// public string? SourceParatextId { get; init; } diff --git a/src/SIL.XForge.Scripture/Models/SFProjectSettings.cs b/src/SIL.XForge.Scripture/Models/SFProjectSettings.cs index 66552837a3a..eef141d54fa 100644 --- a/src/SIL.XForge.Scripture/Models/SFProjectSettings.cs +++ b/src/SIL.XForge.Scripture/Models/SFProjectSettings.cs @@ -10,6 +10,7 @@ namespace SIL.XForge.Scripture.Models; public class SFProjectSettings { // translate settings + [Obsolete("For backwards compatibility with older frontend clients. Deprecated August 2026.")] public bool? TranslationSuggestionsEnabled { get; set; } public string? SourceParatextId { get; set; } public bool? BiblicalTermsEnabled { get; set; } diff --git a/src/SIL.XForge.Scripture/Models/ServalBuildExecutionData.cs b/src/SIL.XForge.Scripture/Models/ServalBuildExecutionData.cs index 2e06d557d36..48c03b40350 100644 --- a/src/SIL.XForge.Scripture/Models/ServalBuildExecutionData.cs +++ b/src/SIL.XForge.Scripture/Models/ServalBuildExecutionData.cs @@ -8,9 +8,14 @@ namespace SIL.XForge.Scripture.Models; /// public class ServalBuildExecutionData { - public int TrainCount { get; set; } - public int PretranslateCount { get; set; } - public string? SourceLanguageTag { get; set; } - public string? TargetLanguageTag { get; set; } - public List Warnings { get; set; } = []; + public double? AveragePretranslationConfidence { get; init; } + public bool? IsPretranslateFilteredByChapter { get; init; } + public bool? IsTrainFilteredByChapter { get; init; } + public int TrainCount { get; init; } + public int PretranslateCount { get; init; } + public string? ResolvedSourceLanguage { get; init; } + public string? ResolvedTargetLanguage { get; init; } + public string? SourceLanguageTag { get; init; } + public string? TargetLanguageTag { get; init; } + public required IReadOnlyList Warnings { get; init; } } diff --git a/src/SIL.XForge.Scripture/Models/ServalCorpus.cs b/src/SIL.XForge.Scripture/Models/ServalCorpus.cs index 7bb189abce7..88eff224106 100644 --- a/src/SIL.XForge.Scripture/Models/ServalCorpus.cs +++ b/src/SIL.XForge.Scripture/Models/ServalCorpus.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; namespace SIL.XForge.Scripture.Models; @@ -5,6 +6,7 @@ namespace SIL.XForge.Scripture.Models; /// /// Serval Corpus Data. /// +[Obsolete("Legacy corpora are no longer supported. Deprecated August 2026")] public class ServalCorpus { /// @@ -39,9 +41,6 @@ public class ServalCorpus /// /// true if we are uploading a Paratext zip file; otherwise, false if this corpus is for translation. /// - /// - /// This is only for use with Pre-translation - not with SMT. - /// public bool UploadParatextZipFile { get; set; } /// diff --git a/src/SIL.XForge.Scripture/Models/ServalData.cs b/src/SIL.XForge.Scripture/Models/ServalData.cs index 94ce977375f..0e6c108b01c 100644 --- a/src/SIL.XForge.Scripture/Models/ServalData.cs +++ b/src/SIL.XForge.Scripture/Models/ServalData.cs @@ -17,6 +17,7 @@ public class ServalData /// /// The user should not interact with the translation engine directly by ID. /// + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public string? TranslationEngineId { get; set; } /// @@ -29,11 +30,13 @@ public class ServalData /// If this is null, no error has been yet reported. /// This property should be set to null if a build starts. /// + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public string? TranslationErrorMessage { get; set; } /// /// Gets or sets the Hangfire Job identifier for the Translation job. /// + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public string? TranslationJobId { get; set; } /// @@ -47,6 +50,7 @@ public class ServalData /// This is used to keep track of whether a build and its corpus is currently uploading to Serval. /// If this is longer than 6 hours ago (UTC), there will have been a crash, so an error should be reported. /// + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public DateTime? TranslationQueuedAt { get; set; } /// @@ -83,6 +87,7 @@ public class ServalData /// /// Gets or sets the Identifier of the Parallel Corpus to be used for translation (SMT) builds. /// + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public string? ParallelCorpusIdForSmt { get; set; } /// @@ -127,6 +132,7 @@ public class ServalData /// /// The dictionary key is the corpus ID. /// + [Obsolete("Legacy corpora are longer supported. Deprecated August 2026")] public Dictionary? Corpora { get; set; } /// @@ -137,8 +143,5 @@ public class ServalData /// /// Gets or sets the corpus and data files configuration. /// - /// - /// These are shared by translation (SMT) and pre-translation (NMT) translation engines. - /// public List CorpusFiles { get; set; } = []; } diff --git a/src/SIL.XForge.Scripture/Models/SyncConfig.cs b/src/SIL.XForge.Scripture/Models/SyncConfig.cs index 3ede0343da2..9e78fe977c4 100644 --- a/src/SIL.XForge.Scripture/Models/SyncConfig.cs +++ b/src/SIL.XForge.Scripture/Models/SyncConfig.cs @@ -29,15 +29,6 @@ public class SyncConfig /// public bool TargetOnly { get; init; } - /// - /// A value indicating whether we are to train the SMT engine. - /// - /// - /// Required. true if we are to train the SMT engine; otherwise false. - /// - /// This value is not used if is true. - public bool TrainEngine { get; init; } - /// /// The user who is initiating the sync. /// diff --git a/src/SIL.XForge.Scripture/Models/TranslateConfig.cs b/src/SIL.XForge.Scripture/Models/TranslateConfig.cs index 376262bcdf2..7cdd48c3d70 100644 --- a/src/SIL.XForge.Scripture/Models/TranslateConfig.cs +++ b/src/SIL.XForge.Scripture/Models/TranslateConfig.cs @@ -1,7 +1,10 @@ +using System; + namespace SIL.XForge.Scripture.Models; public class TranslateConfig { + [Obsolete("SMT suggestions are no longer supported. Deprecated August 2026")] public bool TranslationSuggestionsEnabled { get; set; } public TranslateSource? Source { get; set; } public int? DefaultNoteTagId { get; set; } diff --git a/src/SIL.XForge.Scripture/Models/TranslateSource.cs b/src/SIL.XForge.Scripture/Models/TranslateSource.cs index 62336375e6f..8fb528f5751 100644 --- a/src/SIL.XForge.Scripture/Models/TranslateSource.cs +++ b/src/SIL.XForge.Scripture/Models/TranslateSource.cs @@ -11,9 +11,6 @@ public class TranslateSource /// /// The paratext identifier. /// - /// - /// Only use this if is set to true. - /// public string ParatextId { get; set; } /// @@ -22,9 +19,6 @@ public class TranslateSource /// /// The SF project id reference. /// - /// - /// Only use this if is set to true. - /// public string ProjectRef { get; set; } public string Name { get; set; } public string ShortName { get; set; } diff --git a/src/SIL.XForge.Scripture/SIL.XForge.Scripture.csproj b/src/SIL.XForge.Scripture/SIL.XForge.Scripture.csproj index df0704b5c45..40fca13780f 100644 --- a/src/SIL.XForge.Scripture/SIL.XForge.Scripture.csproj +++ b/src/SIL.XForge.Scripture/SIL.XForge.Scripture.csproj @@ -45,8 +45,8 @@ - - + + diff --git a/src/SIL.XForge.Scripture/Services/IMachineApiService.cs b/src/SIL.XForge.Scripture/Services/IMachineApiService.cs index 72ab51affcc..69211ce7313 100644 --- a/src/SIL.XForge.Scripture/Services/IMachineApiService.cs +++ b/src/SIL.XForge.Scripture/Services/IMachineApiService.cs @@ -45,7 +45,6 @@ CancellationToken cancellationToken string sfProjectId, string buildId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -54,7 +53,6 @@ CancellationToken cancellationToken string sfProjectId, string buildId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -67,7 +65,6 @@ CancellationToken cancellationToken Task> GetBuildsAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -75,7 +72,6 @@ CancellationToken cancellationToken string curUserId, string sfProjectId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -86,11 +82,9 @@ CancellationToken cancellationToken bool isServalAdmin, CancellationToken cancellationToken ); - Task GetEngineAsync(string curUserId, string sfProjectId, CancellationToken cancellationToken); Task GetRawEngineAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -109,7 +103,6 @@ CancellationToken cancellationToken Task GetQueuedStateAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ); @@ -164,12 +157,6 @@ Task GetPreTranslationUsxAsync( DraftUsfmConfig? draftUsfmConfig, CancellationToken cancellationToken ); - Task GetWordGraphAsync( - string curUserId, - string sfProjectId, - string segment, - CancellationToken cancellationToken - ); Task IsLanguageSupportedAsync(string languageCode, CancellationToken cancellationToken); Task ProcessBuildAsync( @@ -181,30 +168,8 @@ CancellationToken cancellationToken [Mutex] [LogEventMetric(EventScope.Drafting, projectId: nameof(sfProjectId), captureReturnValue: true)] - Task RetrievePreTranslationStatusAsync(string sfProjectId, CancellationToken cancellationToken); - - [LogEventMetric(EventScope.Drafting, nameof(curUserId), nameof(sfProjectId))] - Task StartBuildAsync(string curUserId, string sfProjectId, CancellationToken cancellationToken); + Task RetrievePreTranslationStatusAsync(string sfProjectId, CancellationToken cancellationToken); [LogEventMetric(EventScope.Drafting, nameof(curUserId), projectId: "buildConfig.ProjectId")] Task StartPreTranslationBuildAsync(string curUserId, BuildConfig buildConfig, CancellationToken cancellationToken); - Task TrainSegmentAsync( - string curUserId, - string sfProjectId, - SegmentPair segmentPair, - CancellationToken cancellationToken - ); - Task TranslateAsync( - string curUserId, - string sfProjectId, - string segment, - CancellationToken cancellationToken - ); - Task TranslateNAsync( - string curUserId, - string sfProjectId, - int n, - string segment, - CancellationToken cancellationToken - ); } diff --git a/src/SIL.XForge.Scripture/Services/IMachineProjectService.cs b/src/SIL.XForge.Scripture/Services/IMachineProjectService.cs index 04db070e93c..0e90f2a90a1 100644 --- a/src/SIL.XForge.Scripture/Services/IMachineProjectService.cs +++ b/src/SIL.XForge.Scripture/Services/IMachineProjectService.cs @@ -9,8 +9,6 @@ namespace SIL.XForge.Scripture.Services; public interface IMachineProjectService { - Task AddSmtProjectAsync(string sfProjectId, CancellationToken cancellationToken); - [Mutex] Task BuildProjectForBackgroundJobAsync( string curUserId, @@ -20,7 +18,7 @@ Task BuildProjectForBackgroundJobAsync( CancellationToken cancellationToken ); Task GetProjectZipAsync(string sfProjectId, Stream outputStream, CancellationToken cancellationToken); - Task RemoveProjectAsync(string sfProjectId, bool preTranslate, CancellationToken cancellationToken); + Task RemoveProjectAsync(string sfProjectId, CancellationToken cancellationToken); Task SendBuildCompletedEmailAsync( string curUserId, diff --git a/src/SIL.XForge.Scripture/Services/MachineApiService.cs b/src/SIL.XForge.Scripture/Services/MachineApiService.cs index f9d6baa46b1..61e64d6cc1f 100644 --- a/src/SIL.XForge.Scripture/Services/MachineApiService.cs +++ b/src/SIL.XForge.Scripture/Services/MachineApiService.cs @@ -1,4 +1,3 @@ -#nullable disable warnings using System; using System.Collections.Generic; using System.Diagnostics; @@ -35,6 +34,9 @@ // Disable notice "The logging message template should not vary between calls to..." #pragma warning disable CA2254 +// Disable notice "Evaluation of this argument may be expensive and unnecessary if logging is disabled" +#pragma warning disable CA1873 + namespace SIL.XForge.Scripture.Services; /// @@ -129,8 +131,8 @@ CancellationToken cancellationToken ); // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(curUserId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(curUserId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -347,7 +349,7 @@ await draftHubContext.NotifyDraftApplyProgress( IEnumerable deltas = deltaUsxMapper.ToChapterDeltas(usxDoc); // Ensure that the chapter was present in the USFM - ChapterDelta chapterDelta = deltas.FirstOrDefault(); + ChapterDelta? chapterDelta = deltas.FirstOrDefault(); if (chapterDelta is not null) { chapterDeltas.Add((chapterDelta, bookNum)); @@ -461,7 +463,7 @@ await targetProjectDoc.SubmitJson0OpAsync(op => } // Record that the chapter was created - if (createdChapters.TryGetValue(bookNum, out List chapters)) + if (createdChapters.TryGetValue(bookNum, out List? chapters)) { chapters.Add(chapterDelta.Number); } @@ -567,7 +569,9 @@ await draftHubContext.NotifyDraftApplyProgress( } bool canWriteBook = - targetProjectDoc.Data.Texts[textIndex].Permissions.TryGetValue(curUserId, out string bookPermission) + targetProjectDoc + .Data.Texts[textIndex] + .Permissions.TryGetValue(curUserId, out string? bookPermission) && bookPermission == TextInfoPermission.Write; if (!canWriteBook) { @@ -620,14 +624,14 @@ await draftHubContext.NotifyDraftApplyProgress( bool canWriteChapter = targetProjectDoc .Data.Texts[textIndex] .Chapters[chapterIndex] - .Permissions.TryGetValue(curUserId, out string chapterPermission) + .Permissions.TryGetValue(curUserId, out string? chapterPermission) ? chapterPermission == TextInfoPermission.Write : canWriteBook; if (!canWriteChapter) { // Remove the chapter from the project if we created it, and proceed to add the next chapter if ( - createdChapters.TryGetValue(bookNum, out List chapters) + createdChapters.TryGetValue(bookNum, out List? chapters) && chapters.Contains(chapterDelta.Number) ) { @@ -779,16 +783,16 @@ CancellationToken cancellationToken scopes: [EventScope.Drafting], eventTypes: [nameof(MachineProjectService.BuildProjectAsync)] ); - EventMetric eventMetric = eventMetrics.Results.LastOrDefault(e => e.Result == buildId); + EventMetric? eventMetric = eventMetrics.Results.LastOrDefault(e => e.Result == buildId); if (eventMetric is not null && !string.IsNullOrWhiteSpace(eventMetric.UserId)) { // Get the build config from the event metric, by converting BSON to JSON, and then to the object type - BuildConfig buildConfig = JsonConvert.DeserializeObject( + BuildConfig? buildConfig = JsonConvert.DeserializeObject( eventMetric.Payload["buildConfig"].ToJson() ); // Send the email if requested - if (buildConfig.SendEmailOnBuildFinished) + if (buildConfig?.SendEmailOnBuildFinished == true) { await machineProjectService.SendBuildCompletedEmailAsync( eventMetric.UserId, @@ -832,7 +836,7 @@ CancellationToken cancellationToken // If we have pre-translation job information if ( (await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) && ( projectSecret.ServalData?.PreTranslationJobId is not null @@ -851,15 +855,15 @@ await projectSecrets.UpdateAsync( sfProjectId, u => { - u.Unset(p => p.ServalData.PreTranslationJobId); - u.Unset(p => p.ServalData.PreTranslationQueuedAt); + u.Unset(p => p.ServalData!.PreTranslationJobId); + u.Unset(p => p.ServalData!.PreTranslationQueuedAt); }, cancellationToken: cancellationToken ); } // Get the translation engine id - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate: true); + string translationEngineId = GetTranslationEngineId(projectSecret); try { @@ -897,7 +901,6 @@ await projectSecrets.UpdateAsync( string sfProjectId, string buildId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -906,7 +909,7 @@ CancellationToken cancellationToken await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin, cancellationToken); // Execute on Serval, if it is enabled - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { TranslationBuild translationBuild = await translationEnginesClient.GetBuildAsync( @@ -915,7 +918,7 @@ CancellationToken cancellationToken minRevision, cancellationToken ); - return await MapDtoAsync(sfProjectId, translationBuild, preTranslate); + return await MapDtoAsync(sfProjectId, translationBuild); } catch (ServalApiException e) { @@ -929,7 +932,6 @@ CancellationToken cancellationToken string sfProjectId, string buildId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -940,7 +942,7 @@ CancellationToken cancellationToken TranslationBuild? translationBuild = null; // Execute on Serval, if it is enabled - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { @@ -964,7 +966,6 @@ CancellationToken cancellationToken /// /// The current user identifier. /// The Scripture Forge project identifier. - /// If true, return NMT builds only; otherwise, return SMT builds. /// If true, the current user is a Serval Administrator. /// The cancellation token. /// The builds. @@ -972,7 +973,6 @@ CancellationToken cancellationToken public virtual async Task> GetBuildsAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -981,7 +981,7 @@ CancellationToken cancellationToken await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin, cancellationToken); // Execute on Serval, if it is enabled - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); // Get the builds from Serval IList translationBuilds = []; @@ -998,44 +998,37 @@ CancellationToken cancellationToken } // Get the event metrics for build configurations, if we are pre-translating - QueryResults eventMetrics = QueryResults.Empty; - if (preTranslate) - { - eventMetrics = await eventMetricService.GetEventMetricsAsync( - sfProjectId, - scopes: [EventScope.Drafting], - eventTypes: - [ - nameof(MachineProjectService.BuildProjectAsync), - nameof(RetrievePreTranslationStatusAsync), - nameof(StartPreTranslationBuildAsync), - ] - ); - } + QueryResults eventMetrics = await eventMetricService.GetEventMetricsAsync( + sfProjectId, + scopes: [EventScope.Drafting], + eventTypes: + [ + nameof(MachineProjectService.BuildProjectAsync), + nameof(RetrievePreTranslationStatusAsync), + nameof(StartPreTranslationBuildAsync), + ] + ); // Map the builds to DTOs List builds = [ - .. translationBuilds.Select(translationBuild => - MapDto(sfProjectId, translationBuild, preTranslate, eventMetrics) - ), + .. translationBuilds.Select(translationBuild => MapDto(sfProjectId, translationBuild, eventMetrics)), ]; // See if any builds are queued at our end ServalBuildDto? queuedState = await GetQueuedStateAsync( curUserId, sfProjectId, - preTranslate, isServalAdmin, cancellationToken ); if (queuedState is not null && queuedState.State != BuildStateFinishing) { // The last build started will match the queued state - EventMetric eventMetric = eventMetrics.Results.LastOrDefault(e => + EventMetric? eventMetric = eventMetrics.Results.LastOrDefault(e => e.EventType == nameof(StartPreTranslationBuildAsync) ); - if (preTranslate && eventMetric is not null) + if (eventMetric is not null) { queuedState = UpdateDto(queuedState, eventMetric); } @@ -1187,7 +1180,7 @@ CancellationToken cancellationToken await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin, cancellationToken); // Retrieve the draft metrics, if they exist, or throw an error if they do not - Attempt attempt = await draftMetrics.TryGetAsync( + Attempt attempt = await draftMetrics.TryGetAsync( DraftMetrics.GetDocId(sfProjectId, buildId), cancellationToken ); @@ -1316,7 +1309,7 @@ private async Task>> FetchDraftEventsAsync( projectEvents = []; result[sfProjectId] = projectEvents; } - projectEvents.Add(eventMetric); + projectEvents!.Add(eventMetric); } return result; @@ -1375,7 +1368,7 @@ CancellationToken cancellationToken List problems = ExtractProblems(translationBuild, projectEvents); // Get the draft metrics for the build - DraftMetrics buildDraftMetrics = + DraftMetrics? buildDraftMetrics = sfProjectId != null ? draftMetricsForBuilds.SingleOrDefault(dm => dm.Id == $"{sfProjectId}:{buildDto.Id}") : null; @@ -1499,7 +1492,7 @@ CancellationToken cancellationToken && buildConfigBson != null ) { - BuildConfig buildConfig = JsonConvert.DeserializeObject(buildConfigBson.ToJson()); + BuildConfig buildConfig = JsonConvert.DeserializeObject(buildConfigBson.ToJson())!; // Look up project snapshots for any referenced project IDs not already cached HashSet referencedProjectIds = @@ -1728,7 +1721,7 @@ CancellationToken cancellationToken : null; // We could add more details to the report if we are finding that it is often occurring to have build requests that - // Serval is not reporting on and it's useful to have those details. + // Serval is not reporting on, and it's useful to have those details. reports.Add( new ServalBuildReportDto { @@ -1856,7 +1849,7 @@ CancellationToken cancellationToken await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin, cancellationToken); // Get the translation engine - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: true); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { @@ -1870,7 +1863,7 @@ CancellationToken cancellationToken .MaxBy(b => b.DateFinished); if (lastCompletedTranslationBuild is not null) { - return await MapDtoAsync(sfProjectId, lastCompletedTranslationBuild, preTranslate: true); + return await MapDtoAsync(sfProjectId, lastCompletedTranslationBuild); } } catch (ServalApiException e) @@ -1907,7 +1900,7 @@ CancellationToken cancellationToken await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin, cancellationToken); // Get the translation engine id for pre-translation builds - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: true); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { @@ -1935,7 +1928,7 @@ static DateTimeOffset GetSortTimestamp(TranslationBuild b) if (lastBuild is not null) { - return await MapDtoAsync(sfProjectId, lastBuild, preTranslate: true); + return await MapDtoAsync(sfProjectId, lastBuild); } } catch (ServalApiException e) @@ -1950,7 +1943,6 @@ static DateTimeOffset GetSortTimestamp(TranslationBuild b) string curUserId, string sfProjectId, long? minRevision, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -1966,7 +1958,7 @@ CancellationToken cancellationToken ); // Otherwise execute on Serval, if it is enabled - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { @@ -1979,7 +1971,7 @@ CancellationToken cancellationToken cancellationToken ); } - catch (ServalApiException e) when (preTranslate && e.StatusCode == StatusCodes.Status204NoContent) + catch (ServalApiException e) when (e.StatusCode == StatusCodes.Status204NoContent) { // This is the expected result if there is no current build. // If there is no pre-translation build, just get the latest one. @@ -2009,39 +2001,9 @@ await hubContext.NotifyBuildProgress( return buildDto; } - public async Task GetEngineAsync( - string curUserId, - string sfProjectId, - CancellationToken cancellationToken - ) - { - // Ensure that the user has permission - await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin: false, cancellationToken); - - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: false); - - try - { - TranslationEngine translationEngine = await translationEnginesClient.GetAsync( - translationEngineId, - cancellationToken - ); - ServalEngineDto engineDto = CreateDto(translationEngine); - - // Make sure the DTO conforms to the machine-api V2 URLs - return UpdateDto(engineDto, sfProjectId); - } - catch (ServalApiException e) - { - ProcessServalApiException(e); - throw; - } - } - public async Task GetRawEngineAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -2052,7 +2014,7 @@ CancellationToken cancellationToken TranslationEngine? translationEngine = null; // Execute on Serval, if it is enabled - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate); + string translationEngineId = await GetTranslationIdAsync(sfProjectId); try { @@ -2106,11 +2068,10 @@ CancellationToken cancellationToken } /// - /// Retrieves the state of an NMT or SMT build before the build is started on Serval. + /// Retrieves the state of a build before the build is started on Serval. /// /// The current user identifier. /// The Scripture Forge project identifier. - /// If true, check the status of the NMT/Pre-Translation build. /// If true, the user is a Serval administrator. /// The cancellation token. /// @@ -2119,7 +2080,6 @@ CancellationToken cancellationToken public async Task GetQueuedStateAsync( string curUserId, string sfProjectId, - bool preTranslate, bool isServalAdmin, CancellationToken cancellationToken ) @@ -2137,20 +2097,14 @@ CancellationToken cancellationToken // If there is a job queued, return a build dto with a status showing it is queued if ( (await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) && projectSecret.ServalData is not null ) { // Get the values to use depending on whether this is a pre-translation job or not - string? engineId = preTranslate - ? projectSecret.ServalData.PreTranslationEngineId - : projectSecret.ServalData.TranslationEngineId; - string? errorMessage = preTranslate - ? projectSecret.ServalData.PreTranslationErrorMessage - : projectSecret.ServalData.TranslationErrorMessage; - DateTime? queuedAt = preTranslate - ? projectSecret.ServalData.PreTranslationQueuedAt - : projectSecret.ServalData.TranslationQueuedAt; + string engineId = projectSecret.ServalData.PreTranslationEngineId ?? string.Empty; + string? errorMessage = projectSecret.ServalData.PreTranslationErrorMessage; + DateTime? queuedAt = projectSecret.ServalData.PreTranslationQueuedAt; // If we have an error message, report that to the user if (!string.IsNullOrWhiteSpace(errorMessage)) @@ -2159,7 +2113,7 @@ out SFProjectSecret projectSecret { State = BuildStateFaulted, Message = errorMessage, - AdditionalInfo = new ServalBuildAdditionalInfo { TranslationEngineId = engineId ?? string.Empty }, + AdditionalInfo = new ServalBuildAdditionalInfo { TranslationEngineId = engineId }, }; } else @@ -2167,16 +2121,13 @@ out SFProjectSecret projectSecret // If the pre-translations are being retrieved, and no build is queued, // display that as a build state to the user. We don't show this if a build is queued, // as we will want that build's state to be displayed. - if (preTranslate && queuedAt is null && projectSecret.ServalData.PreTranslationsRetrieved == false) + if (queuedAt is null && projectSecret.ServalData.PreTranslationsRetrieved == false) { buildDto = new ServalBuildDto { State = BuildStateFinishing, Message = "The draft books are being retrieved.", - AdditionalInfo = new ServalBuildAdditionalInfo - { - TranslationEngineId = engineId ?? string.Empty, - }, + AdditionalInfo = new ServalBuildAdditionalInfo { TranslationEngineId = engineId }, }; } else if (queuedAt is null) @@ -2191,10 +2142,7 @@ out SFProjectSecret projectSecret { State = BuildStateFaulted, Message = "The build failed to upload to the server.", - AdditionalInfo = new ServalBuildAdditionalInfo - { - TranslationEngineId = engineId ?? string.Empty, - }, + AdditionalInfo = new ServalBuildAdditionalInfo { TranslationEngineId = engineId }, }; } else @@ -2204,20 +2152,14 @@ out SFProjectSecret projectSecret { State = BuildStateQueued, Message = "The build is being uploaded to the server.", - AdditionalInfo = new ServalBuildAdditionalInfo - { - TranslationEngineId = engineId ?? string.Empty, - }, + AdditionalInfo = new ServalBuildAdditionalInfo { TranslationEngineId = engineId }, }; } } // Make sure the DTO conforms to the machine-api V2 URLs - if (buildDto is not null) - { - buildDto = UpdateDto(buildDto, project.TranslateConfig.DraftConfig); - buildDto = UpdateDto(buildDto, sfProjectId); - } + buildDto = UpdateDto(buildDto, project.TranslateConfig.DraftConfig); + buildDto = UpdateDto(buildDto, sfProjectId); } return buildDto; @@ -2257,7 +2199,6 @@ CancellationToken cancellationToken IReadOnlyList builds = await GetBuildsAsync( curUserId, sfProjectId, - preTranslate: true, isServalAdmin, cancellationToken ); @@ -2303,8 +2244,8 @@ CancellationToken cancellationToken string userId = isServalAdmin ? GetHighestRankedUserId(project) : curUserId; // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -2351,8 +2292,8 @@ CancellationToken cancellationToken string userId = isServalAdmin ? GetHighestRankedUserId(project) : curUserId; // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -2495,28 +2436,6 @@ CancellationToken cancellationToken return UsjToUsx.UsjToUsxString(usj); } - public async Task GetWordGraphAsync( - string curUserId, - string sfProjectId, - string segment, - CancellationToken cancellationToken - ) - { - // Ensure that the user has permission - await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin: false, cancellationToken); - - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: false); - try - { - return await translationEnginesClient.GetWordGraphAsync(translationEngineId, segment, cancellationToken); - } - catch (ServalApiException e) - { - ProcessServalApiException(e); - throw; - } - } - public async Task IsLanguageSupportedAsync(string languageCode, CancellationToken cancellationToken) { LanguageInfo languageInfo = await translationEngineTypesClient.GetLanguageInfoAsync( @@ -2549,7 +2468,7 @@ CancellationToken cancellationToken // Get the project id from the project secret string? projectId = await projectSecrets .Query() - .Where(p => p.ServalData.PreTranslationEngineId == translationEngineId) + .Where(p => p.ServalData!.PreTranslationEngineId == translationEngineId) .Select(p => p.Id) .FirstOrDefaultAsync(cancellationToken); @@ -2627,7 +2546,7 @@ CancellationToken cancellationToken // Get the project secret to see if this is being run from another process if ( !(await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) ) { @@ -2639,7 +2558,7 @@ out SFProjectSecret projectSecret if (projectSecret.ServalData?.PreTranslationsRetrieved ?? true) { // Get the last completed build - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate: true); + string translationEngineId = GetTranslationEngineId(projectSecret); TranslationBuild translationBuild = (await translationEnginesClient.GetAllBuildsAsync(translationEngineId, cancellationToken)) .Where(b => b.State == JobState.Completed) @@ -2649,7 +2568,7 @@ out SFProjectSecret projectSecret // Set the retrieved flag as in progress await projectSecrets.UpdateAsync( sfProjectId, - u => u.Set(p => p.ServalData.PreTranslationsRetrieved, false), + u => u.Set(p => p.ServalData!.PreTranslationsRetrieved, false), cancellationToken: cancellationToken ); @@ -2665,8 +2584,8 @@ await projectSecrets.UpdateAsync( string userId = GetHighestRankedUserId(projectDoc.Data); // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -2709,7 +2628,7 @@ await projectDoc.SubmitJson0OpAsync(u => // Set the retrieved flag as complete await projectSecrets.UpdateAsync( sfProjectId, - u => u.Set(p => p.ServalData.PreTranslationsRetrieved, true), + u => u.Set(p => p.ServalData!.PreTranslationsRetrieved, true), cancellationToken: cancellationToken ); @@ -2746,7 +2665,7 @@ await hubContext.NotifyBuildProgress( // Ensure that the retrieved flag is cleared await projectSecrets.UpdateAsync( sfProjectId, - u => u.Unset(p => p.ServalData.PreTranslationsRetrieved), + u => u.Unset(p => p.ServalData!.PreTranslationsRetrieved), cancellationToken: cancellationToken ); } @@ -2761,7 +2680,7 @@ await projectSecrets.UpdateAsync( // Ensure that the retrieved flag is cleared await projectSecrets.UpdateAsync( sfProjectId, - u => u.Unset(p => p.ServalData.PreTranslationsRetrieved), + u => u.Unset(p => p.ServalData!.PreTranslationsRetrieved), cancellationToken: cancellationToken ); @@ -2776,54 +2695,6 @@ await projectSecrets.UpdateAsync( return null; } - public async Task StartBuildAsync(string curUserId, string sfProjectId, CancellationToken cancellationToken) - { - // Load the project from the realtime service - await using IConnection conn = await realtimeService.ConnectAsync(curUserId); - IDocument projectDoc = await conn.FetchAsync(sfProjectId); - if (!projectDoc.IsLoaded) - { - throw new DataNotFoundException("The project does not exist."); - } - - // Ensure that the user has permission to create drafts (as the logic for SMT builds is shared with draft generation) - if (!projectRights.HasRight(projectDoc.Data, curUserId, SFProjectDomain.Drafts, Operation.Create)) - { - throw new ForbiddenException(); - } - - // Sync the source and target before running the build - // We use project service, as it provides permission and token checks - string syncJobId = await projectService.SyncAsync(curUserId, sfProjectId); - - // Run the training after the sync has completed. If the sync failed or stopped, retrain anyway - string buildJobId = backgroundJobClient.ContinueJobWith( - syncJobId, - r => - r.BuildProjectForBackgroundJobAsync( - curUserId, - new BuildConfig { ProjectId = sfProjectId }, - false, - null, - CancellationToken.None - ), - null, - JobContinuationOptions.OnAnyFinishedState - ); - - // Set the translation queued date and time, and hang fire job id - await projectSecrets.UpdateAsync( - sfProjectId, - u => - { - u.Set(p => p.ServalData.TranslationJobId, buildJobId); - u.Set(p => p.ServalData.TranslationQueuedAt, DateTime.UtcNow); - u.Unset(p => p.ServalData.TranslationErrorMessage); - }, - cancellationToken: cancellationToken - ); - } - public async Task StartPreTranslationBuildAsync( string curUserId, BuildConfig buildConfig, @@ -2918,7 +2789,7 @@ CancellationToken cancellationToken string? abandonedJobId = null; if ( (await projectSecrets.TryGetAsync(buildConfig.ProjectId, cancellationToken)).TryResult( - out SFProjectSecret existingProjectSecret + out SFProjectSecret? existingProjectSecret ) && existingProjectSecret.ServalData?.PreTranslationJobId is not null && ( @@ -2941,8 +2812,8 @@ await projectSecrets.UpdateAsync( ), u => { - u.Set(p => p.ServalData.PreTranslationQueuedAt, DateTime.UtcNow); - u.Unset(p => p.ServalData.PreTranslationJobId); + u.Set(p => p.ServalData!.PreTranslationQueuedAt, DateTime.UtcNow); + u.Unset(p => p.ServalData!.PreTranslationJobId); }, cancellationToken: cancellationToken ) ?? throw new BuildAlreadyRunningException("A draft build is already queued for this project."); @@ -2993,7 +2864,7 @@ await StartClaimedPreTranslationBuildAsync( // Release the claim so the failed request does not block subsequent build requests await projectSecrets.UpdateAsync( buildConfig.ProjectId, - u => u.Unset(p => p.ServalData.PreTranslationQueuedAt), + u => u.Unset(p => p.ServalData!.PreTranslationQueuedAt), cancellationToken: CancellationToken.None ); throw; @@ -3060,13 +2931,6 @@ .. projectDoc.Data.TranslateConfig.DraftConfig.TrainingSources.Select(s => s.Pro .. projectDoc.Data.TranslateConfig.DraftConfig.DraftingSources.Select(s => s.ProjectRef), ]; - // Remove the source project, as it was synced when the target was synced - string sourceProjectId = projectDoc.Data.TranslateConfig.Source?.ProjectRef; - if (sourceProjectId is not null && syncProjectIds.Contains(sourceProjectId)) - { - syncProjectIds.Remove(sourceProjectId); - } - // Sync the projects foreach (string syncProjectId in syncProjectIds) { @@ -3101,90 +2965,13 @@ await projectSecrets.UpdateAsync( buildConfig.ProjectId, u => { - u.Set(p => p.ServalData.PreTranslationJobId, jobId); - u.Unset(p => p.ServalData.PreTranslationErrorMessage); + u.Set(p => p.ServalData!.PreTranslationJobId, jobId); + u.Unset(p => p.ServalData!.PreTranslationErrorMessage); }, cancellationToken: cancellationToken ); } - public async Task TrainSegmentAsync( - string curUserId, - string sfProjectId, - SegmentPair segmentPair, - CancellationToken cancellationToken - ) - { - // Ensure that the user has permission - await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin: false, cancellationToken); - - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: false); - try - { - await translationEnginesClient.TrainSegmentAsync(translationEngineId, segmentPair, cancellationToken); - } - catch (ServalApiException e) - { - ProcessServalApiException(e); - } - } - - public async Task TranslateAsync( - string curUserId, - string sfProjectId, - string segment, - CancellationToken cancellationToken - ) - { - // Ensure that the user has permission - await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin: false, cancellationToken); - - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: false); - try - { - return await translationEnginesClient.TranslateAsync(translationEngineId, segment, cancellationToken); - } - catch (ServalApiException e) - { - ProcessServalApiException(e); - throw; - } - } - - public async Task TranslateNAsync( - string curUserId, - string sfProjectId, - int n, - string segment, - CancellationToken cancellationToken - ) - { - IEnumerable translationResults = []; - - // Ensure that the user has permission - await EnsureProjectPermissionAsync(curUserId, sfProjectId, isServalAdmin: false, cancellationToken); - - string translationEngineId = await GetTranslationIdAsync(sfProjectId, preTranslate: false); - if (!string.IsNullOrWhiteSpace(translationEngineId)) - { - try - { - translationResults = await translationEnginesClient.TranslateNAsync( - translationEngineId, - n, - segment, - cancellationToken - ); - } - catch (ServalApiException e) - { - ProcessServalApiException(e); - } - } - - return [.. translationResults]; - } - /// /// Updates the text documents locally with the latest pre-translation drafts. /// @@ -3212,8 +2999,8 @@ CancellationToken cancellationToken string userId = GetHighestRankedUserId(projectDoc.Data); // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -3221,7 +3008,7 @@ CancellationToken cancellationToken // Load the project secrets, so we can get the translation engine ID and corpus ID if ( !(await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) ) { @@ -3229,14 +3016,14 @@ out SFProjectSecret projectSecret } // Get the translation engine id - string translationEngineId = projectSecret.ServalData?.PreTranslationEngineId; + string? translationEngineId = projectSecret.ServalData?.PreTranslationEngineId; if (string.IsNullOrWhiteSpace(translationEngineId)) { throw new DataNotFoundException("The translation engine ID cannot be found."); } // Get the parallel corpus id - string parallelCorpusId = projectSecret.ServalData?.ParallelCorpusIdForPreTranslate; + string? parallelCorpusId = projectSecret.ServalData!.ParallelCorpusIdForPreTranslate; if (string.IsNullOrWhiteSpace(parallelCorpusId)) { throw new DataNotFoundException("The parallel corpus ID cannot be found."); @@ -3314,8 +3101,8 @@ Usj usj in paratextService if (calculateQualityEstimation) { ChrF3QualityEstimator estimator = new ChrF3QualityEstimator( - projectDoc.Data.TranslateConfig.DraftConfig.QualityEstimationConfig.Slope, - projectDoc.Data.TranslateConfig.DraftConfig.QualityEstimationConfig.Intercept + projectDoc.Data.TranslateConfig.DraftConfig.QualityEstimationConfig!.Slope, + projectDoc.Data.TranslateConfig.DraftConfig.QualityEstimationConfig!.Intercept ); ( List _, // We do not require segment level confidence values @@ -3365,7 +3152,6 @@ List usabilityBooks /// The build DTO. private static ServalBuildDto CreateDto(TranslationBuild translationBuild) { - ExecutionData? executionData = translationBuild.ExecutionData; var buildDto = new ServalBuildDto { Id = translationBuild.Id, @@ -3389,11 +3175,11 @@ private static ServalBuildDto CreateDto(TranslationBuild translationBuild) // Use a HashSet to ensure there are no duplicate parallel corpus ids [ .. translationBuild - .Pretranslate?.Select(t => t.ParallelCorpus?.Id) + .Pretranslate?.Select(t => t.ParallelCorpus?.Id ?? string.Empty) .Where(id => !string.IsNullOrEmpty(id)) ?? [], .. translationBuild - .TrainOn?.Select(t => t.ParallelCorpus?.Id) + .TrainOn?.Select(t => t.ParallelCorpus?.Id ?? string.Empty) .Where(id => !string.IsNullOrEmpty(id)) ?? [], ]), @@ -3403,17 +3189,21 @@ .. translationBuild TranslationEngineId = translationBuild.Engine.Id, }, DeploymentVersion = translationBuild.DeploymentVersion, - ExecutionData = - executionData == null - ? null - : new ServalBuildExecutionData - { - TrainCount = executionData.TrainCount, - PretranslateCount = executionData.PretranslateCount, - SourceLanguageTag = executionData.EngineSourceLanguageTag, - TargetLanguageTag = executionData.EngineTargetLanguageTag, - Warnings = [.. executionData.Warnings], - }, + ExecutionData = translationBuild.ExecutionData is null + ? null + : new ServalBuildExecutionData + { + AveragePretranslationConfidence = translationBuild.ExecutionData.AveragePretranslationConfidence, + IsPretranslateFilteredByChapter = translationBuild.ExecutionData.IsPretranslateFilteredByChapter, + IsTrainFilteredByChapter = translationBuild.ExecutionData.IsTrainFilteredByChapter, + TrainCount = translationBuild.ExecutionData.TrainCount, + PretranslateCount = translationBuild.ExecutionData.PretranslateCount, + ResolvedSourceLanguage = translationBuild.ExecutionData.ResolvedSourceLanguage, + ResolvedTargetLanguage = translationBuild.ExecutionData.ResolvedTargetLanguage, + SourceLanguageTag = translationBuild.ExecutionData.EngineSourceLanguageTag, + TargetLanguageTag = translationBuild.ExecutionData.EngineTargetLanguageTag, + Warnings = [.. translationBuild.ExecutionData.Warnings], + }, }; // Create an initial value for the date requested, based on the object id from Mongo @@ -3426,16 +3216,6 @@ .. translationBuild return buildDto; } - private static ServalEngineDto CreateDto(TranslationEngine translationEngine) => - new ServalEngineDto - { - Id = translationEngine.Id, - Confidence = translationEngine.Confidence / 100.0, - TrainedSegmentCount = translationEngine.CorpusSize, - SourceLanguageTag = translationEngine.SourceLanguage, - TargetLanguageTag = translationEngine.TargetLanguage, - }; - /// /// Gets the drafted scripture range for a translation build. /// @@ -3454,7 +3234,7 @@ ScriptureRangeParser scriptureRangeParser { // We are using the TranslationBuild.Pretranslate.SourceFilters.ScriptureRange to find the // books selected for drafting. Some projects may have used the now obsolete field - // TranslationBuild.Pretranslate.ScriptureRange. + // TranslationBuild.Pretranslate.ScriptureRange, but these will be ignored. foreach (ParallelCorpusFilter source in ptc.SourceFilters?.Where(s => s.ScriptureRange is not null) ?? []) { ParseScriptureRange(source.ScriptureRange, scriptureRangeParser, ref booksWithDrafts); @@ -3538,21 +3318,13 @@ private static string GetHighestRankedUserId(SFProject project) .Key; } - private static string GetTranslationEngineId( - SFProjectSecret projectSecret, - bool preTranslate, - bool returnEmptyStringIfMissing = false - ) + private static string GetTranslationEngineId(SFProjectSecret? projectSecret) { // Ensure we have a translation engine ID - string? translationEngineId = preTranslate - ? projectSecret.ServalData?.PreTranslationEngineId - : projectSecret.ServalData?.TranslationEngineId; + string? translationEngineId = projectSecret?.ServalData?.PreTranslationEngineId; if (string.IsNullOrWhiteSpace(translationEngineId)) { - return returnEmptyStringIfMissing - ? string.Empty - : throw new DataNotFoundException("The translation engine is not configured"); + throw new DataNotFoundException("The translation engine is not configured"); } return translationEngineId; @@ -3591,7 +3363,6 @@ CancellationToken cancellationToken IReadOnlyList builds = await GetBuildsAsync( curUserId, sfProjectId, - preTranslate: true, isServalAdmin, cancellationToken ); @@ -3632,8 +3403,8 @@ CancellationToken cancellationToken string userId = GetHighestRankedUserId(project); // Retrieve the user secret - Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); - if (!attempt.TryResult(out UserSecret userSecret)) + Attempt attempt = await userSecrets.TryGetAsync(userId, cancellationToken); + if (!attempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -3651,7 +3422,7 @@ .. builds.Where(b => b.AdditionalInfo?.TranslationScriptureRanges.Any(r => scriptureRangeParser .GetChapters(r.ScriptureRange) - .TryGetValue(Canon.BookNumberToId(bookNum), out List chapters) + .TryGetValue(Canon.BookNumberToId(bookNum), out List? chapters) && (chapters.Count == 0 || chapters.Contains(chapterNum) || chapterNum == 0) ) ?? false @@ -3665,13 +3436,11 @@ .. builds.Where(b => /// /// The scripture forge project identifier. /// The translation build from Serval. - /// If true, return NMT builds only; otherwise, return SMT builds. /// (Optional) The event metrics for the project's builds or this specific build. /// The Serval build DTO. private static ServalBuildDto MapDto( string sfProjectId, TranslationBuild translationBuild, - bool preTranslate, QueryResults eventMetrics ) { @@ -3698,21 +3467,17 @@ QueryResults eventMetrics { buildDto = UpdateDto(buildDto, eventMetric); } - else if (preTranslate) + else { // Fallback for builds previous to the event metric being recorded: // - As there is no event metric, get the translation scripture range from the pre-translation corpus // - We cannot accurately determine the source projects, so do not record the training scripture ranges. // Get the translation scripture range - PretranslateCorpus translationCorpus = translationBuild.Pretranslate?.FirstOrDefault(); + PretranslateCorpus? translationCorpus = translationBuild.Pretranslate?.FirstOrDefault(); if (translationCorpus is not null) { -#pragma warning disable CS0612 // Type or member is obsolete - string scriptureRange = - translationCorpus.SourceFilters?.FirstOrDefault()?.ScriptureRange - ?? translationCorpus.ScriptureRange; -#pragma warning restore CS0612 // Type or member is obsolete + string? scriptureRange = translationCorpus.SourceFilters?.FirstOrDefault()?.ScriptureRange; if (!string.IsNullOrWhiteSpace(scriptureRange)) { buildDto.AdditionalInfo!.TranslationScriptureRanges.Add( @@ -3722,13 +3487,10 @@ QueryResults eventMetrics } // Get the training scripture range - TrainingCorpus trainingCorpus = translationBuild.TrainOn?.FirstOrDefault(); + TrainingCorpus? trainingCorpus = translationBuild.TrainOn?.FirstOrDefault(); if (trainingCorpus is not null) { -#pragma warning disable CS0612 // Type or member is obsolete - string scriptureRange = - trainingCorpus.SourceFilters?.FirstOrDefault()?.ScriptureRange ?? trainingCorpus.ScriptureRange; -#pragma warning restore CS0612 // Type or member is obsolete + string? scriptureRange = trainingCorpus.SourceFilters?.FirstOrDefault()?.ScriptureRange; if (!string.IsNullOrWhiteSpace(scriptureRange)) { // We do not accurately know the training, project, so leave it blank @@ -3756,7 +3518,7 @@ ref Dictionary> booksAndChapters { foreach ((string bookId, List chapters) in scriptureRangeParser.GetChapters(scriptureRange)) { - if (booksAndChapters.TryGetValue(bookId, out SortedSet bookChapters)) + if (booksAndChapters.TryGetValue(bookId, out SortedSet? bookChapters)) { if (bookChapters.Count == 0) { @@ -3908,7 +3670,7 @@ private static ServalBuildDto UpdateDto(ServalBuildDto buildDto, EventMetric eve // Get the build config from the event metric, by converting BSON to JSON, and then to the object type BuildConfig buildConfig = JsonConvert.DeserializeObject( eventMetric.Payload["buildConfig"].ToJson() - ); + )!; // Add the training scripture ranges buildDto.AdditionalInfo.TrainingScriptureRanges.Clear(); @@ -3934,14 +3696,6 @@ private static ServalBuildDto UpdateDto(ServalBuildDto buildDto, EventMetric eve return buildDto; } - private static ServalEngineDto UpdateDto(ServalEngineDto engineDto, string sfProjectId) - { - engineDto.Href = MachineApi.GetEngineHref(sfProjectId); - engineDto.Id = sfProjectId; - engineDto.Projects = [new ServalResourceDto { Href = MachineApi.GetEngineHref(sfProjectId), Id = sfProjectId }]; - return engineDto; - } - /// /// Ensures that the user has permission to access Serval and the project. /// @@ -4001,21 +3755,15 @@ CancellationToken cancellationToken return buildEvent != null ? GetRequestIdFromEvent(buildEvent) : null; } - private async Task GetTranslationIdAsync( - string sfProjectId, - bool preTranslate, - bool returnEmptyStringIfMissing = false - ) + private async Task GetTranslationIdAsync(string sfProjectId) { // Load the project secret, so we can get the translation engine ID - if (!(await projectSecrets.TryGetAsync(sfProjectId)).TryResult(out SFProjectSecret projectSecret)) + if (!(await projectSecrets.TryGetAsync(sfProjectId)).TryResult(out SFProjectSecret? projectSecret)) { - return returnEmptyStringIfMissing - ? string.Empty - : throw new DataNotFoundException("The project secret is missing"); + throw new DataNotFoundException("The project secret is missing"); } - return GetTranslationEngineId(projectSecret, preTranslate, returnEmptyStringIfMissing); + return GetTranslationEngineId(projectSecret); } /// @@ -4023,30 +3771,21 @@ private async Task GetTranslationIdAsync( /// /// The scripture forge project identifier. /// The translation build from Serval. - /// If true, return NMT builds only; otherwise, return SMT builds. /// The Serval build DTO. - private async Task MapDtoAsync( - string sfProjectId, - TranslationBuild translationBuild, - bool preTranslate - ) + private async Task MapDtoAsync(string sfProjectId, TranslationBuild translationBuild) { // Get the event metrics for build configurations, if we are pre-translating - QueryResults eventMetrics = QueryResults.Empty; - if (preTranslate) - { - eventMetrics = await eventMetricService.GetEventMetricsAsync( - sfProjectId, - scopes: [EventScope.Drafting], - eventTypes: - [ - nameof(MachineProjectService.BuildProjectAsync), - nameof(RetrievePreTranslationStatusAsync), - nameof(StartPreTranslationBuildAsync), - ] - ); - } + QueryResults eventMetrics = await eventMetricService.GetEventMetricsAsync( + sfProjectId, + scopes: [EventScope.Drafting], + eventTypes: + [ + nameof(MachineProjectService.BuildProjectAsync), + nameof(RetrievePreTranslationStatusAsync), + nameof(StartPreTranslationBuildAsync), + ] + ); - return MapDto(sfProjectId, translationBuild, preTranslate, eventMetrics); + return MapDto(sfProjectId, translationBuild, eventMetrics); } } diff --git a/src/SIL.XForge.Scripture/Services/MachineProjectService.cs b/src/SIL.XForge.Scripture/Services/MachineProjectService.cs index b64fb6f5d8b..04ccb7b9f22 100644 --- a/src/SIL.XForge.Scripture/Services/MachineProjectService.cs +++ b/src/SIL.XForge.Scripture/Services/MachineProjectService.cs @@ -1,4 +1,3 @@ -#nullable disable warnings using System; using System.Collections.Generic; using System.Diagnostics; @@ -33,6 +32,9 @@ // Disable notice "The logging message template should not vary between calls to..." #pragma warning disable CA2254 +// Disable notice "Evaluation of this argument may be expensive and unnecessary if logging is disabled" +#pragma warning disable CA1873 + namespace SIL.XForge.Scripture.Services; /// @@ -60,13 +62,11 @@ IRepository userSecrets /// /// The name of the key storing draft generation request id, which may be present in some event metrics in a set of tags. /// - public static readonly string DraftGenerationRequestIdKey = "draftGenerationRequestId"; + public const string DraftGenerationRequestIdKey = "draftGenerationRequestId"; - // Supported translation engines (Serval 1.2 format) - // Serval 1.2 accepts the translation engine type in 1.1 (PascalCase) and 1.2 (kebab-case) format + // Supported translation engines internal const string Echo = "echo"; internal const string Nmt = "nmt"; - internal const string SmtTransfer = "smt-transfer"; // These tags are used for the ClearML task to differentiate Scripture Forge jobs internal const string TagDevelopment = "sf-dev"; @@ -74,49 +74,13 @@ IRepository userSecrets internal const string TagStaging = "sf-qa"; internal const string TagProduction = "sf-live"; - /// - /// Adds the SMT project to Serval, if the required data is present. - /// - /// The Scripture Forge project identifier. - /// The cancellation token. - /// The translation engine identifier. - /// The project does not exist. - public async Task AddSmtProjectAsync(string sfProjectId, CancellationToken cancellationToken) - { - // Load the project from the realtime service - Attempt attempt = await realtimeService.TryGetSnapshotAsync( - sfProjectId, - cancellationToken - ); - if (!attempt.TryResult(out SFProject project)) - { - throw new DataNotFoundException("The project does not exist."); - } - - // We may not have the source language tag or target language tag if either is a back translation - // If that is the case, we will create the translation engine on first sync by running this method again - // After ensuring that the source and target language tags are present - if ( - !string.IsNullOrWhiteSpace(project.TranslateConfig.Source?.WritingSystem.Tag) - && !string.IsNullOrWhiteSpace(project.WritingSystem.Tag) - ) - { - return await CreateServalProjectAsync(project, preTranslate: false, useEcho: false, cancellationToken); - } - - logger.LogInformation("The source or target language is missing from the project"); - return string.Empty; - } - /// /// Executes , and traps any errors during execution. /// /// The current user identifier. /// The build configuration. - /// If true use NMT; otherwise if false use SMT. - /// - /// The draft generation request identifier (NMT only). Pass null for SMT builds. - /// + /// No longer used. This is kept to ensure backwards compatibility with previously created jobs. + /// The draft generation request identifier. /// The cancellation token. /// An asynchronous task. /// @@ -137,7 +101,7 @@ CancellationToken cancellationToken try { - await BuildProjectAsync(curUserId, buildConfig, preTranslate, draftGenerationRequestId, cancellationToken); + await BuildProjectAsync(curUserId, buildConfig, draftGenerationRequestId, cancellationToken); } catch (TaskCanceledException e) when (e.InnerException is not TimeoutException) { @@ -149,16 +113,8 @@ await projectSecrets.UpdateAsync( buildConfig.ProjectId, u => { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationJobId); - u.Unset(p => p.ServalData.PreTranslationQueuedAt); - } - else - { - u.Unset(p => p.ServalData.TranslationJobId); - u.Unset(p => p.ServalData.TranslationQueuedAt); - } + u.Unset(p => p.ServalData!.PreTranslationJobId); + u.Unset(p => p.ServalData!.PreTranslationQueuedAt); }, cancellationToken: cancellationToken ); @@ -183,16 +139,8 @@ await projectSecrets.UpdateAsync( buildConfig.ProjectId, u => { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationJobId); - u.Unset(p => p.ServalData.PreTranslationQueuedAt); - } - else - { - u.Unset(p => p.ServalData.TranslationJobId); - u.Unset(p => p.ServalData.TranslationQueuedAt); - } + u.Unset(p => p.ServalData!.PreTranslationJobId); + u.Unset(p => p.ServalData!.PreTranslationQueuedAt); }, cancellationToken: cancellationToken ); @@ -233,18 +181,9 @@ await projectSecrets.UpdateAsync( buildConfig.ProjectId, u => { - if (preTranslate) - { - u.Set(p => p.ServalData.PreTranslationErrorMessage, e.Message); - u.Unset(p => p.ServalData.PreTranslationJobId); - u.Unset(p => p.ServalData.PreTranslationQueuedAt); - } - else - { - u.Set(p => p.ServalData.TranslationErrorMessage, e.Message); - u.Unset(p => p.ServalData.TranslationJobId); - u.Unset(p => p.ServalData.TranslationQueuedAt); - } + u.Set(p => p.ServalData!.PreTranslationErrorMessage, e.Message); + u.Unset(p => p.ServalData!.PreTranslationJobId); + u.Unset(p => p.ServalData!.PreTranslationQueuedAt); }, cancellationToken: cancellationToken ); @@ -303,21 +242,16 @@ CancellationToken cancellationToken /// Removes a project from Serval. /// /// The Scripture Forge project identifier. - /// If true use NMT; otherwise if false use SMT. /// The cancellation token. /// An asynchronous task. /// The project secret cannot be found. /// This can be mocked in unit tests. - public virtual async Task RemoveProjectAsync( - string sfProjectId, - bool preTranslate, - CancellationToken cancellationToken - ) + public virtual async Task RemoveProjectAsync(string sfProjectId, CancellationToken cancellationToken) { // Load the target project secrets, so we can get the translation engine ID if ( !(await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) ) { @@ -325,80 +259,54 @@ out SFProjectSecret projectSecret } // Ensure we have a translation engine id - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate); + string? translationEngineId = projectSecret.ServalData?.PreTranslationEngineId; if (string.IsNullOrWhiteSpace(translationEngineId)) { logger.LogInformation($"No Translation Engine Id specified for project {sfProjectId.Sanitize()}"); return; } - // Remove the legacy serval data - await RemoveLegacyServalDataAsync(sfProjectId, preTranslate, cancellationToken); - - // Build the list of files, corpora, and parallel corpora to remove - List fileIdsToRemove = []; - List corpusIdsToRemove = []; - if (preTranslate) - { - // Remove the additional training data - if (projectSecret.ServalData?.AdditionalTrainingData is not null) - { - corpusIdsToRemove.Add(projectSecret.ServalData.AdditionalTrainingData.SourceCorpusId); - corpusIdsToRemove.Add(projectSecret.ServalData.AdditionalTrainingData.TargetCorpusId); - fileIdsToRemove.AddRange( - projectSecret.ServalData.AdditionalTrainingData.CorpusFiles.Select(f => f.FileId) - ); - } + // Remove all corpora and files + List corpusIdsToRemove = [.. projectSecret.ServalData!.CorpusFiles.Select(f => f.CorpusId)]; + List fileIdsToRemove = [.. projectSecret.ServalData.CorpusFiles.Select(f => f.FileId)]; - // If there is no SMT training engine, remove all files and corpora - if ( - projectSecret.ServalData is not null - && string.IsNullOrWhiteSpace(projectSecret.ServalData.TranslationEngineId) - ) - { - corpusIdsToRemove.AddRange(projectSecret.ServalData.CorpusFiles.Select(f => f.CorpusId)); - fileIdsToRemove.AddRange(projectSecret.ServalData.CorpusFiles.Select(f => f.FileId)); - } - } - else if ( - projectSecret.ServalData is not null - && string.IsNullOrWhiteSpace(projectSecret.ServalData.PreTranslationEngineId) - ) + // Remove the additional training data + if (projectSecret.ServalData.AdditionalTrainingData is not null) { - // If there is no NMT training engine, remove all files and corpora - corpusIdsToRemove.AddRange(projectSecret.ServalData.CorpusFiles.Select(f => f.CorpusId)); - fileIdsToRemove.AddRange(projectSecret.ServalData.CorpusFiles.Select(f => f.FileId)); + corpusIdsToRemove.Add(projectSecret.ServalData.AdditionalTrainingData.SourceCorpusId); + corpusIdsToRemove.Add(projectSecret.ServalData.AdditionalTrainingData.TargetCorpusId); + fileIdsToRemove.AddRange(projectSecret.ServalData.AdditionalTrainingData.CorpusFiles.Select(f => f.FileId)); } // Remove the specified corpora - foreach (string corpusId in corpusIdsToRemove.Where(s => !string.IsNullOrWhiteSpace(s))) + foreach (string? corpusId in corpusIdsToRemove.Where(s => !string.IsNullOrWhiteSpace(s))) { try { - await corporaClient.DeleteAsync(corpusId, cancellationToken); + await corporaClient.DeleteAsync(corpusId!, cancellationToken); } catch (ServalApiException e) when (e.StatusCode == StatusCodes.Status404NotFound) { // If the file was already deleted, just log a message string message = - $"Corpus {corpusId.Sanitize()} in project {sfProjectId.Sanitize()}" + $"Corpus {corpusId?.Sanitize()} in project {sfProjectId.Sanitize()}" + " was missing or already deleted."; logger.LogInformation(e, message); } } // Remove the specified files - foreach (string fileId in fileIdsToRemove.Where(s => !string.IsNullOrWhiteSpace(s))) + foreach (string? fileId in fileIdsToRemove.Where(s => !string.IsNullOrWhiteSpace(s))) { try { - await dataFilesClient.DeleteAsync(fileId, cancellationToken); + await dataFilesClient.DeleteAsync(fileId!, cancellationToken); } catch (ServalApiException e) when (e.StatusCode == StatusCodes.Status404NotFound) { // If the file was already deleted, just log a message string message = - $"File {fileId.Sanitize()} in project {sfProjectId.Sanitize()}" + $"File {fileId?.Sanitize()} in project {sfProjectId.Sanitize()}" + " was missing or already deleted."; logger.LogInformation(e, message); } @@ -423,22 +331,12 @@ await projectSecrets.UpdateAsync( sfProjectId, u => { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationEngineId); - u.Unset(p => p.ServalData.ParallelCorpusIdForPreTranslate); - u.Unset(p => p.ServalData.ParallelCorpusIdForTrainOn); - u.Unset(p => p.ServalData.PreTranslationsRetrieved); - u.Unset(p => p.ServalData.AdditionalTrainingData); - } - else - { - u.Unset(p => p.ServalData.TranslationEngineId); - u.Unset(p => p.ServalData.ParallelCorpusIdForSmt); - } - - // Remove all corpora that were deleted - u.RemoveAll(p => p.ServalData.CorpusFiles, p => corpusIdsToRemove.Contains(p.CorpusId)); + u.Unset(p => p.ServalData!.PreTranslationEngineId); + u.Unset(p => p.ServalData!.ParallelCorpusIdForPreTranslate); + u.Unset(p => p.ServalData!.ParallelCorpusIdForTrainOn); + u.Unset(p => p.ServalData!.PreTranslationsRetrieved); + u.Unset(p => p.ServalData!.AdditionalTrainingData); + u.Set(p => p.ServalData!.CorpusFiles, []); }, cancellationToken: cancellationToken ); @@ -497,10 +395,7 @@ CancellationToken cancellationToken /// /// The current user identifier. /// The build configuration. - /// If true use NMT; otherwise if false use SMT. - /// - /// The draft generation request identifier (NMT only). Pass null for SMT builds. - /// + /// The draft generation request identifier. /// The cancellation token. /// Serval build ID /// The project or project secret could not be found. @@ -518,7 +413,6 @@ CancellationToken cancellationToken public virtual async Task BuildProjectAsync( string curUserId, BuildConfig buildConfig, - bool preTranslate, string? draftGenerationRequestId, CancellationToken cancellationToken ) @@ -531,7 +425,7 @@ CancellationToken cancellationToken // Load the target project secrets, so we can get the translation engine ID if ( !(await projectSecrets.TryGetAsync(buildConfig.ProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) ) { @@ -546,15 +440,11 @@ out SFProjectSecret projectSecret throw new DataNotFoundException("The project does not exist."); } - // Remove the legacy serval data, if present - await RemoveLegacyServalDataAsync(buildConfig.ProjectId, preTranslate, cancellationToken); - // Ensure we have a translation engine id or a pre-translation engine id, and that it exists string translationEngineId = await EnsureTranslationEngineExistsAsync( curUserId, projectDoc, projectSecret, - preTranslate, buildConfig.UseEcho, cancellationToken ); @@ -564,7 +454,6 @@ out SFProjectSecret projectSecret await RecreateOrUpdateTranslationEngineIfRequiredAsync( translationEngineId, projectDoc.Data, - preTranslate, buildConfig.UseEcho, cancellationToken ); @@ -576,7 +465,6 @@ await RecreateOrUpdateTranslationEngineIfRequiredAsync( IList corporaSyncInfo = await SyncProjectCorporaAsync( curUserId, buildConfig, - preTranslate, cancellationToken ); @@ -584,7 +472,7 @@ await RecreateOrUpdateTranslationEngineIfRequiredAsync( projectSecret = await projectSecrets.GetAsync(buildConfig.ProjectId, cancellationToken: cancellationToken); // Ensure we have the ServalData - if (projectSecret.ServalData is null) + if (projectSecret?.ServalData is null) { throw new DataNotFoundException("The project secret does not contain Serval data."); } @@ -598,24 +486,13 @@ await RecreateOrUpdateTranslationEngineIfRequiredAsync( } // Get the appropriate translation engine - TranslationBuildConfig translationBuildConfig; - if (preTranslate) - { - translationEngineId = projectSecret.ServalData.PreTranslationEngineId!; - - // Execute a complete pre-translation - translationBuildConfig = GetTranslationBuildConfig( - projectSecret.ServalData, - servalConfig, - buildConfig, - corporaSyncInfo - ); - } - else - { - translationEngineId = projectSecret.ServalData.TranslationEngineId!; - translationBuildConfig = new TranslationBuildConfig { Options = AddTags() }; - } + translationEngineId = projectSecret.ServalData.PreTranslationEngineId!; + TranslationBuildConfig translationBuildConfig = GetTranslationBuildConfig( + projectSecret.ServalData, + servalConfig, + buildConfig, + corporaSyncInfo + ); // Start the build TranslationBuild translationBuild = await translationEnginesClient.StartBuildAsync( @@ -629,16 +506,8 @@ await projectSecrets.UpdateAsync( buildConfig.ProjectId, u => { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationJobId); - u.Unset(p => p.ServalData.PreTranslationQueuedAt); - } - else - { - u.Unset(p => p.ServalData.TranslationJobId); - u.Unset(p => p.ServalData.TranslationQueuedAt); - } + u.Unset(p => p.ServalData!.PreTranslationJobId); + u.Unset(p => p.ServalData!.PreTranslationQueuedAt); }, cancellationToken: cancellationToken ); @@ -731,30 +600,28 @@ await translationEnginesClient.UpdateParallelCorpusAsync( /// and updates the project secret with the translation engine identifier. /// /// The Scripture Forge project - /// If true use NMT; otherwise if false use SMT. - /// If true use Echo if is true. + /// If true use Echo. /// The cancellation token. /// The translation engine id. /// The translation engine could not be created. /// This can be mocked in unit tests. protected internal virtual async Task CreateServalProjectAsync( SFProject sfProject, - bool preTranslate, bool useEcho, CancellationToken cancellationToken ) { // Get the existing project secret, so we can see how to create the engine and update the Serval data - SFProjectSecret projectSecret = await projectSecrets.GetAsync(sfProject.Id, cancellationToken); - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate); + SFProjectSecret? projectSecret = await projectSecrets.GetAsync(sfProject.Id, cancellationToken); + string? translationEngineId = projectSecret?.ServalData?.PreTranslationEngineId; if (string.IsNullOrWhiteSpace(translationEngineId)) { TranslationEngineConfig engineConfig = new TranslationEngineConfig { Name = sfProject.Id, - SourceLanguage = GetSourceLanguage(sfProject, preTranslate), - TargetLanguage = GetTargetLanguage(sfProject, preTranslate, useEcho), - Type = GetTranslationEngineType(preTranslate, useEcho), + SourceLanguage = GetSourceLanguage(sfProject), + TargetLanguage = GetTargetLanguage(sfProject, useEcho), + Type = GetTranslationEngineType(useEcho), }; // Add the project to Serval @@ -770,46 +637,24 @@ CancellationToken cancellationToken // Get the new translation engine id translationEngineId = translationEngine.Id; - if (projectSecret.ServalData is not null && preTranslate) - { - // Store the Pre-Translation Engine ID - await projectSecrets.UpdateAsync( - sfProject.Id, - u => u.Set(p => p.ServalData.PreTranslationEngineId, translationEngineId), - cancellationToken: cancellationToken - ); - } - else if (projectSecret.ServalData is not null) - { - // Store the Translation Engine ID - await projectSecrets.UpdateAsync( - sfProject.Id, - u => u.Set(p => p.ServalData.TranslationEngineId, translationEngineId), - cancellationToken: cancellationToken - ); - } - else if (preTranslate) + if (projectSecret?.ServalData is not null) { // Store the Pre-Translation Engine ID await projectSecrets.UpdateAsync( sfProject.Id, - u => - u.Set( - p => p.ServalData, - new ServalData { PreTranslationEngineId = translationEngineId, CorpusFiles = [] } - ), + u => u.Set(p => p.ServalData!.PreTranslationEngineId, translationEngineId), cancellationToken: cancellationToken ); } else { - // Store the Translation Engine ID + // Store the Pre-Translation Engine ID and set up the corpus files array. await projectSecrets.UpdateAsync( sfProject.Id, u => u.Set( p => p.ServalData, - new ServalData { TranslationEngineId = translationEngineId, CorpusFiles = [] } + new ServalData { PreTranslationEngineId = translationEngineId, CorpusFiles = [] } ), cancellationToken: cancellationToken ); @@ -854,7 +699,7 @@ CancellationToken cancellationToken } catch (FileNotFoundException e) { - // This will be thrown by filenames that have unicode characters, which is not supported by Paratext + // This will be thrown by filenames that have Unicode characters, which is not supported by Paratext logger.LogWarning(e, "File not found when creating Paratext zip file"); } } @@ -909,8 +754,7 @@ CancellationToken cancellationToken /// The current user identifier. /// The project document. /// The project secret. - /// If true use NMT; otherwise if false use SMT. - /// If true use Echo if is true. + /// If true use Echo. /// The cancellation token. /// The translation engine identifier. /// The project, user, or translation engine does not exist. @@ -920,31 +764,21 @@ protected internal virtual async Task EnsureTranslationEngineExistsAsync string curUserId, IDocument projectDoc, SFProjectSecret projectSecret, - bool preTranslate, bool useEcho, CancellationToken cancellationToken ) { - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate); - if (!await TranslationEngineExistsAsync(projectDoc.Id, translationEngineId, preTranslate, cancellationToken)) + string? translationEngineId = projectSecret.ServalData?.PreTranslationEngineId; + if (!await TranslationEngineExistsAsync(projectDoc.Id, translationEngineId, cancellationToken)) { // We do not have one, likely because the translation is a back translation // We can only get the language tags for back translations from the ScrText, // which is not present until after the first sync (not from the Registry). - - // If the source or target writing system tag is missing, get them from the ScrText - // We do not need to do this for the drafting sources as these would have been populated correctly - if ( - string.IsNullOrWhiteSpace(projectDoc.Data?.WritingSystem.Tag) - || ( - projectDoc.Data?.TranslateConfig.Source is not null - && string.IsNullOrWhiteSpace(projectDoc.Data?.TranslateConfig.Source?.WritingSystem.Tag) - ) - ) + if (string.IsNullOrWhiteSpace(projectDoc.Data?.WritingSystem.Tag)) { // Get the user secret - Attempt userSecretAttempt = await userSecrets.TryGetAsync(curUserId, cancellationToken); - if (!userSecretAttempt.TryResult(out UserSecret userSecret)) + Attempt userSecretAttempt = await userSecrets.TryGetAsync(curUserId, cancellationToken); + if (!userSecretAttempt.TryResult(out UserSecret? userSecret)) { throw new DataNotFoundException("The user does not exist."); } @@ -972,65 +806,23 @@ await projectDoc.SubmitJson0OpAsync(op => }); } } + } - // This error can occur if the project is deleted while the build is running - if (projectDoc.Data is null) - { - throw new DataNotFoundException("The project does not exist."); - } - - // This error can occur if the project source is cleared while the build is running - if (!preTranslate && projectDoc.Data.TranslateConfig.Source is null) - { - throw new InvalidDataException("The project source is not specified."); - } - - // Update the source writing system tag - if ( - projectDoc.Data.TranslateConfig.Source is not null - && string.IsNullOrWhiteSpace(projectDoc.Data.TranslateConfig.Source.WritingSystem.Tag) - ) - { - WritingSystem writingSystem = paratextService.GetWritingSystem( - userSecret, - projectDoc.Data.TranslateConfig.Source.ParatextId - ); - if (!string.IsNullOrWhiteSpace(writingSystem.Tag)) - { - await projectDoc.SubmitJson0OpAsync(op => - { - op.Set(p => p.TranslateConfig.Source.WritingSystem.Region, writingSystem.Region); - op.Set(p => p.TranslateConfig.Source.WritingSystem.Script, writingSystem.Script); - op.Set(p => p.TranslateConfig.Source.WritingSystem.Tag, writingSystem.Tag); - }); - } - } + // This error can occur if the project is deleted while the build is running + if (projectDoc.Data is null) + { + throw new DataNotFoundException("The project does not exist."); } // Clear the existing translation engine id, based on whether this is pre-translation or not await projectSecrets.UpdateAsync( projectDoc.Id, - u => - { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationEngineId); - } - else - { - u.Unset(p => p.ServalData.TranslationEngineId); - } - }, + u => u.Unset(p => p.ServalData!.PreTranslationEngineId), cancellationToken: cancellationToken ); // Create the Serval project, and get the translation engine id - translationEngineId = await CreateServalProjectAsync( - projectDoc.Data!, - preTranslate, - useEcho, - cancellationToken - ); + translationEngineId = await CreateServalProjectAsync(projectDoc.Data, useEcho, cancellationToken); } // Ensure a translation engine id is present @@ -1046,14 +838,13 @@ await projectSecrets.UpdateAsync( /// Gets the drafting source language for the project. /// /// The project. - /// If true use NMT; otherwise if false use SMT. /// The source language. /// /// The project does not exist. /// /// The language of the source project was not specified. /// This can be mocked in unit tests. - protected internal virtual string GetSourceLanguage(SFProject? project, bool preTranslate) + protected internal virtual string GetSourceLanguage(SFProject? project) { // This error can occur if the project is deleted while the build is running if (project is null) @@ -1061,19 +852,15 @@ protected internal virtual string GetSourceLanguage(SFProject? project, bool pre throw new DataNotFoundException("The project does not exist."); } - return ( - preTranslate - ? project.TranslateConfig.DraftConfig.DraftingSources.FirstOrDefault()?.WritingSystem.Tag - : project.TranslateConfig.Source?.WritingSystem.Tag - ) ?? throw new InvalidDataException("The source project's language is not specified."); + return project.TranslateConfig.DraftConfig.DraftingSources.FirstOrDefault()?.WritingSystem.Tag + ?? throw new InvalidDataException("The source project's language is not specified."); } /// /// Gets the target language for the project /// /// The project. - /// If true use NMT; otherwise if false use SMT. - /// If true use Echo if is true. + /// If true use Echo. /// The target language. /// /// The source was not specified for the project, or the project does not exist. @@ -1084,8 +871,8 @@ protected internal virtual string GetSourceLanguage(SFProject? project, bool pre /// This can be mocked in unit tests. /// Echo requires the target and source language to be the same, as it outputs your source texts /// - protected internal virtual string GetTargetLanguage(SFProject project, bool preTranslate, bool useEcho) => - useEcho ? GetSourceLanguage(project, preTranslate) : project.WritingSystem.Tag!; + protected internal virtual string GetTargetLanguage(SFProject project, bool useEcho) => + useEcho ? GetSourceLanguage(project) : project.WritingSystem.Tag!; /// /// Gets the segments from the text with Unix/Linux line endings. @@ -1140,7 +927,6 @@ protected internal virtual string GetTextFileData(ISFText text) /// The synchronization information for the corpora. /// The TranslationBuildConfig for a Pre-Translate build. /// - /// Do not use with SMT builds. /// This can be mocked in unit tests. /// protected internal virtual TranslationBuildConfig GetTranslationBuildConfig( @@ -1151,10 +937,10 @@ IList corporaSyncInfo ) { // Load the Serval Config from the Draft Config - JObject? options = !string.IsNullOrWhiteSpace(servalConfig) ? JObject.Parse(servalConfig) : []; + JObject options = !string.IsNullOrWhiteSpace(servalConfig) ? JObject.Parse(servalConfig) : []; // Add the tags - AddTags(options); + options = AddTags(options); // If Fast Training is enabled, override the max_steps if (buildConfig.FastTraining) @@ -1282,31 +1068,22 @@ .. corporaSyncInfo /// /// Gets the translation engine type string for Serval. /// - /// If true use NMT; otherwise if false use SMT. - /// If true use Echo if is true. + /// If true use Echo. /// The translation engine type string for Serval. - protected internal virtual string GetTranslationEngineType(bool preTranslate, bool useEcho) => - preTranslate switch - { - true when useEcho => Echo, - true => Nmt, - false => SmtTransfer, - }; + protected internal virtual string GetTranslationEngineType(bool useEcho) => useEcho ? Echo : Nmt; /// /// Recreates the translation engine if the source or target language has changed. /// /// The translation engine identifier. /// The project. - /// If true use NMT; otherwise if false use SMT. - /// If true use Echo if is true. + /// If true use Echo. /// The cancellation token. /// An asynchronous task. /// This can be mocked in unit tests. protected internal virtual async Task RecreateOrUpdateTranslationEngineIfRequiredAsync( string translationEngineId, SFProject project, - bool preTranslate, bool useEcho, CancellationToken cancellationToken ) @@ -1322,7 +1099,7 @@ CancellationToken cancellationToken bool recreateTranslationEngine = false; // See if the target language has changed - string projectTargetLanguage = GetTargetLanguage(project, preTranslate, useEcho); + string projectTargetLanguage = GetTargetLanguage(project, useEcho); if (translationEngine.TargetLanguage != projectTargetLanguage) { string message = @@ -1332,7 +1109,7 @@ CancellationToken cancellationToken } // See if the source language has changed - string projectSourceLanguage = GetSourceLanguage(project, preTranslate); + string projectSourceLanguage = GetSourceLanguage(project); if (translationEngine.SourceLanguage != projectSourceLanguage) { string message = @@ -1342,7 +1119,7 @@ CancellationToken cancellationToken } // See if the translation engine type has changed - string translationEngineType = GetTranslationEngineType(preTranslate, useEcho); + string translationEngineType = GetTranslationEngineType(useEcho); if (translationEngine.Type != translationEngineType) { string message = @@ -1354,8 +1131,8 @@ CancellationToken cancellationToken if (recreateTranslationEngine) { // Recreate the translation engine to use the new engine type - await RemoveProjectAsync(project.Id, preTranslate, cancellationToken); - await CreateServalProjectAsync(project, preTranslate, useEcho, cancellationToken); + await RemoveProjectAsync(project.Id, cancellationToken); + await CreateServalProjectAsync(project, useEcho, cancellationToken); } else if (updateTranslationEngineLanguages) { @@ -1379,119 +1156,16 @@ await translationEnginesClient.UpdateAsync( // Clear the existing translation engine id and corpora await projectSecrets.UpdateAsync( project.Id, - u => - { - if (preTranslate) - { - u.Unset(p => p.ServalData.PreTranslationEngineId); - } - else - { - u.Unset(p => p.ServalData.TranslationEngineId); - } - }, + u => u.Unset(p => p.ServalData!.PreTranslationEngineId), cancellationToken: cancellationToken ); // Create the new translation engine id - translationEngineId = await CreateServalProjectAsync(project, preTranslate, useEcho, cancellationToken); + translationEngineId = await CreateServalProjectAsync(project, useEcho, cancellationToken); logger.LogInformation($"Created Translation Engine {translationEngineId}."); } } - /// - /// Removes the legacy files and corpora from Serval. - /// - /// The Scripture Forge project identifier. - /// If true use NMT; otherwise if false use SMT. - /// The Cancellation token - /// An asynchronous task. - /// The project secret cannot be found. - /// This can be mocked in unit tests. - protected internal virtual async Task RemoveLegacyServalDataAsync( - string sfProjectId, - bool preTranslate, - CancellationToken cancellationToken - ) - { - // Load the target project secrets, so we can get the translation engine ID - if ( - !(await projectSecrets.TryGetAsync(sfProjectId, cancellationToken)).TryResult( - out SFProjectSecret projectSecret - ) - ) - { - throw new DataNotFoundException("The project secret cannot be found."); - } - - // Ensure we have a translation engine id - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate); - if (string.IsNullOrWhiteSpace(translationEngineId)) - { - logger.LogInformation($"No Translation Engine Id specified for project {sfProjectId.Sanitize()}"); - return; - } - - // Remove the corpora and files - string[] corpusIds = - projectSecret - .ServalData?.Corpora?.Where(c => c.Value.PreTranslate == preTranslate) - .Select(c => c.Key) - .ToArray() - ?? []; - foreach (string corpusId in corpusIds) - { - // Delete the legacy corpus - try - { -#pragma warning disable CS0612 // Type or member is obsolete - await translationEnginesClient.DeleteCorpusAsync( - translationEngineId, - corpusId, - deleteFiles: true, - cancellationToken - ); -#pragma warning restore CS0612 // Type or member is obsolete - } - catch (ServalApiException e) - { - // A 404 means that the translation engine does not exist - string message; - if (e.StatusCode == StatusCodes.Status404NotFound) - { - message = - $"Translation Engine {translationEngineId.Sanitize()} for project {sfProjectId.Sanitize()}" - + " was missing or already deleted."; - logger.LogInformation(message); - } - else - { - message = - $"Ignored exception while deleting translation engine {translationEngineId.Sanitize()}" - + " for project {sfProjectId.Sanitize()}."; - logger.LogError(e, message); - } - } - - // Remove our record of the corpus - await projectSecrets.UpdateAsync( - sfProjectId, - u => u.Unset(p => p.ServalData.Corpora[corpusId]), - cancellationToken: cancellationToken - ); - } - - // Remove the corpora property if it is empty - if (projectSecret.ServalData?.Corpora?.Any(c => c.Value.PreTranslate != preTranslate) == false) - { - await projectSecrets.UpdateAsync( - sfProjectId, - u => u.Unset(p => p.ServalData.Corpora), - cancellationToken: cancellationToken - ); - } - } - /// /// Synchronizes the additional training data for a pre-translation project. /// @@ -1538,7 +1212,7 @@ await trainingDataService.GetTextsAsync( additionalTrainingData.TargetCorpusId = await UploadAdditionalTrainingDataAsync( project.Id, additionalTrainingData.TargetCorpusId, - languageCode: GetTargetLanguage(project, preTranslate: true, buildConfig.UseEcho), + languageCode: GetTargetLanguage(project, buildConfig.UseEcho), targetCorpusFiles, targetTexts, cancellationToken @@ -1549,7 +1223,7 @@ await trainingDataService.GetTextsAsync( additionalTrainingData.SourceCorpusId = await UploadAdditionalTrainingDataAsync( project.Id, additionalTrainingData.SourceCorpusId, - GetSourceLanguage(project, preTranslate: true), + GetSourceLanguage(project), sourceCorpusFiles, sourceTexts, cancellationToken @@ -1618,7 +1292,6 @@ await translationEnginesClient.DeleteParallelCorpusAsync( /// /// The current user identifier. /// The build configuration from the user. - /// If true use NMT; otherwise if false use SMT. /// The cancellation token. /// /// The for all source and target corpora that were synchronised, @@ -1634,7 +1307,6 @@ await translationEnginesClient.DeleteParallelCorpusAsync( protected internal virtual async Task> SyncProjectCorporaAsync( string curUserId, BuildConfig buildConfig, - bool preTranslate, CancellationToken cancellationToken ) { @@ -1651,7 +1323,7 @@ CancellationToken cancellationToken // Load the project secrets, so we can get the corpus files if ( !(await projectSecrets.TryGetAsync(project.Id, cancellationToken)).TryResult( - out SFProjectSecret projectSecret + out SFProjectSecret? projectSecret ) ) { @@ -1659,7 +1331,7 @@ out SFProjectSecret projectSecret } // Ensure we have serval data - if (projectSecret.ServalData is null) + if (projectSecret?.ServalData is null) { throw new DataNotFoundException("The Serval data cannot be found."); } @@ -1668,25 +1340,16 @@ out SFProjectSecret projectSecret List corporaSyncInfo = []; // Ensure we have a translation engine ID - string translationEngineId = GetTranslationEngineId(projectSecret, preTranslate); + string? translationEngineId = projectSecret.ServalData.PreTranslationEngineId; if (string.IsNullOrWhiteSpace(translationEngineId)) { throw new DataNotFoundException("The translation engine ID cannot be found."); } - // Ensure we have a source if we are running an SMT build - if (!preTranslate && project.TranslateConfig.Source is null) - { - throw new InvalidDataException("The project source is not specified."); - } - - // Ensure we have drafting and training sources if we are running an NMT build + // Ensure we have drafting and training sources if ( - preTranslate - && ( - project.TranslateConfig.DraftConfig.DraftingSources.Count == 0 - || project.TranslateConfig.DraftConfig.TrainingSources.Count == 0 - ) + project.TranslateConfig.DraftConfig.DraftingSources.Count == 0 + || project.TranslateConfig.DraftConfig.TrainingSources.Count == 0 ) { throw new InvalidDataException("The drafting or training sources are not specified."); @@ -1696,40 +1359,23 @@ out SFProjectSecret projectSecret List<(string projectId, string paratextId, string writingSystemTag)> projects = [ // All builds will contain the target project - (project.Id, project.ParatextId, project.WritingSystem.Tag), - ]; - - // Add the source to the corpora, as it may be used in SMT builds if present - // Not including it will result in its deletion from Serval - if (project.TranslateConfig.Source is not null) - { - projects.Add( - ( - project.TranslateConfig.Source.ProjectRef, - project.TranslateConfig.Source.ParatextId, - project.TranslateConfig.Source.WritingSystem.Tag - ) - ); - } - - // Add the drafting and training sources to the corpora as they may be used in NMT builds if present - // Not including it will result in its deletion from Serval - projects.AddRange( - project + (project.Id, project.ParatextId, project.WritingSystem.Tag!), + // Add the drafting source projects for the translation corpus + .. project .TranslateConfig.DraftConfig.DraftingSources.Concat(project.TranslateConfig.DraftConfig.TrainingSources) .Select(translateSource => - (translateSource.ProjectRef, translateSource.ParatextId, translateSource.WritingSystem.Tag) - ) - ); + (translateSource.ProjectRef, translateSource.ParatextId, translateSource.WritingSystem.Tag!) + ), + ]; - // Get the drafting source projects for the NMT/SMT translation corpus - List sourceProjectIds = preTranslate - ? [.. project.TranslateConfig.DraftConfig.DraftingSources.Select(s => s.ProjectRef)] - : [project.TranslateConfig.Source!.ProjectRef]; + // Get the drafting source projects for the translation corpus + List sourceProjectIds = + [ + .. project.TranslateConfig.DraftConfig.DraftingSources.Select(s => s.ProjectRef), + ]; // If the base project is present, upload it for versification reference. - // The versification is only required for NMT/Echo builds. - if (preTranslate && !string.IsNullOrEmpty(project.TranslateConfig.BaseProject?.ParatextId)) + if (!string.IsNullOrEmpty(project.TranslateConfig.BaseProject?.ParatextId)) { SFProject? baseProject = await realtimeService .QuerySnapshots() @@ -1765,14 +1411,14 @@ out SFProjectSecret projectSecret continue; } - ServalCorpusFile servalCorpusFile = projectSecret.ServalData.CorpusFiles.SingleOrDefault(f => + ServalCorpusFile? servalCorpusFile = projectSecret.ServalData.CorpusFiles.SingleOrDefault(f => f.ProjectId == projectId ); // Ensure that the corpus exists - if it does not, corpusId will be null - string corpusId = await GetCorpusIdFromServalAsync(servalCorpusFile?.CorpusId, cancellationToken); + string? corpusId = await GetCorpusIdFromServalAsync(servalCorpusFile?.CorpusId, cancellationToken); bool isCorpusMissing = servalCorpusFile is null || string.IsNullOrWhiteSpace(corpusId); - if (isCorpusMissing || servalCorpusFile.LanguageCode != languageCode) + if (isCorpusMissing || servalCorpusFile!.LanguageCode != languageCode) { // Create the corpus if it does not exist or the language code has changed Corpus corpus = await corporaClient.CreateAsync( @@ -1803,7 +1449,7 @@ await corporaClient.UpdateAsync( ); } - // Set up the parallel corpus for NMT/SMT translation + // Set up the parallel corpus for translation List sourceCorpora = [ // The order is important, as filtering can only be performed on the first corpus @@ -1815,16 +1461,11 @@ .. servalCorpusFiles List sourceCorpusIds = [.. sourceCorpora.Select(f => f.CorpusId)]; List targetCorpusIds = [.. targetCorpora.Select(f => f.CorpusId)]; - // Get the NMT/SMT translation parallel corpus id (might be null) - string translationParallelCorpusId = preTranslate - ? projectSecret.ServalData.ParallelCorpusIdForPreTranslate - : projectSecret.ServalData.ParallelCorpusIdForSmt; - - // Create or update the NMT/SMT translation parallel corpora - translationParallelCorpusId = await CreateOrUpdateParallelCorpusAsync( + // Create or update the translation parallel corpora + string translationParallelCorpusId = await CreateOrUpdateParallelCorpusAsync( translationEngineId, - translationParallelCorpusId, - name: preTranslate ? "PreTranslation" : "SmtTranslation", + projectSecret.ServalData.ParallelCorpusIdForPreTranslate, + name: "PreTranslation", sourceCorpusIds, targetCorpusIds, cancellationToken @@ -1838,61 +1479,52 @@ .. servalCorpusFiles translationParallelCorpusId ); - // If we are NMT pre-translating, add the training parallel corpus - string trainOnParallelCorpusId = null; - ServalAdditionalTrainingData? additionalTrainingData = projectSecret.ServalData.AdditionalTrainingData; - if (preTranslate) - { - // Build the source corpora for training - sourceCorpora = - [ - .. servalCorpusFiles.Where(f => - project.TranslateConfig.DraftConfig.TrainingSources.Select(s => s.ProjectRef).Contains(f.ProjectId) - ), - ]; - sourceCorpusIds = [.. sourceCorpora.Select(f => f.CorpusId)]; - - // Build the target corpus ids for training - targetCorpora = [servalCorpusFiles.Single(f => f.ProjectId == project.Id)]; - targetCorpusIds = [.. targetCorpora.Select(f => f.CorpusId)]; + // Build the source corpora for training + sourceCorpora = + [ + .. servalCorpusFiles.Where(f => + project.TranslateConfig.DraftConfig.TrainingSources.Select(s => s.ProjectRef).Contains(f.ProjectId) + ), + ]; + sourceCorpusIds = [.. sourceCorpora.Select(f => f.CorpusId)]; - // Get the train on parallel corpus id (might be null) - trainOnParallelCorpusId = projectSecret.ServalData.ParallelCorpusIdForTrainOn; + // Build the target corpus ids for training + targetCorpora = [servalCorpusFiles.Single(f => f.ProjectId == project.Id)]; + targetCorpusIds = [.. targetCorpora.Select(f => f.CorpusId)]; - // Create or update the train on parallel corpora - trainOnParallelCorpusId = await CreateOrUpdateParallelCorpusAsync( - translationEngineId, - trainOnParallelCorpusId, - name: "TrainOn", - sourceCorpusIds, - targetCorpusIds, - cancellationToken - ); + // Create or update the train on parallel corpora + string trainOnParallelCorpusId = await CreateOrUpdateParallelCorpusAsync( + translationEngineId, + projectSecret.ServalData.ParallelCorpusIdForTrainOn, + name: "TrainOn", + sourceCorpusIds, + targetCorpusIds, + cancellationToken + ); - // Record the corpus sync info for the train on corpora - corporaSyncInfo = RecordServalCorpusSyncInfo( - corporaSyncInfo, - sourceCorpora, - targetCorpora, - trainOnParallelCorpusId - ); + // Record the corpus sync info for the train on corpora + corporaSyncInfo = RecordServalCorpusSyncInfo( + corporaSyncInfo, + sourceCorpora, + targetCorpora, + trainOnParallelCorpusId + ); - // Sync the additional training data - // NOTE: We do not record the corpus sync info for the additional training data - // You can get that information from ServalData.AdditionalTrainingData - additionalTrainingData = await SyncAdditionalTrainingData( - curUserId, - project, - translationEngineId, - buildConfig, - additionalTrainingData, - cancellationToken - ); - } + // Sync the additional training data + // NOTE: We do not record the corpus sync info for the additional training data + // You can get that information from ServalData.AdditionalTrainingData + ServalAdditionalTrainingData? additionalTrainingData = await SyncAdditionalTrainingData( + curUserId, + project, + translationEngineId, + buildConfig, + projectSecret.ServalData.AdditionalTrainingData, + cancellationToken + ); // Delete any project corpora and files that are no longer used await DeleteAllCorporaAndFilesAsync( - projectSecret.ServalData.CorpusFiles.Except(servalCorpusFiles), + projectSecret.ServalData!.CorpusFiles.Except(servalCorpusFiles), project.Id, cancellationToken ); @@ -1902,17 +1534,10 @@ await projectSecrets.UpdateAsync( projectSecret, u => { - u.Set(p => p.ServalData.CorpusFiles, servalCorpusFiles); - if (preTranslate) - { - u.Set(p => p.ServalData.ParallelCorpusIdForPreTranslate, translationParallelCorpusId); - u.Set(p => p.ServalData.ParallelCorpusIdForTrainOn, trainOnParallelCorpusId); - u.Set(p => p.ServalData.AdditionalTrainingData, additionalTrainingData); - } - else - { - u.Set(p => p.ServalData.ParallelCorpusIdForSmt, translationParallelCorpusId); - } + u.Set(p => p.ServalData!.CorpusFiles, servalCorpusFiles); + u.Set(p => p.ServalData!.ParallelCorpusIdForPreTranslate, translationParallelCorpusId); + u.Set(p => p.ServalData!.ParallelCorpusIdForTrainOn, trainOnParallelCorpusId); + u.Set(p => p.ServalData!.AdditionalTrainingData, additionalTrainingData); }, cancellationToken: cancellationToken ); @@ -1955,14 +1580,12 @@ CancellationToken cancellationToken /// /// The Scripture Forge project identifier. /// The Serval translation engine identifier. - /// If true use NMT; otherwise if false use SMT. /// The cancellation token. /// true if the translation engine exists; otherwise false. /// This can be mocked in unit tests. protected internal virtual async Task TranslationEngineExistsAsync( string projectId, string? translationEngineId, - bool preTranslate, CancellationToken cancellationToken ) { @@ -1979,7 +1602,7 @@ CancellationToken cancellationToken ); bool useEcho = translationEngine.Type == Echo; - string type = GetTranslationEngineType(preTranslate, useEcho); + string type = GetTranslationEngineType(useEcho); // We check for the type, taking account of Pascal Case (Serval 1.1) and Kebab Case (Serval 1.2) return translationEngine.Name == projectId @@ -2021,7 +1644,7 @@ CancellationToken cancellationToken corpusFiles.Clear(); // Delete the old corpus if the language has changed - string corpusLanguageCode = previousCorpusFiles.FirstOrDefault(f => f.CorpusId == corpusId)?.LanguageCode; + string? corpusLanguageCode = previousCorpusFiles.FirstOrDefault(f => f.CorpusId == corpusId)?.LanguageCode; if ( !string.IsNullOrWhiteSpace(corpusLanguageCode) && languageCode != corpusLanguageCode @@ -2239,13 +1862,13 @@ private JObject AddTags(JObject? options = null) { options["tags"] = tag; } - else if (options["tags"].Type == JTokenType.String && options["tags"].ToString() != tag) + else if (options["tags"]!.Type == JTokenType.String && options["tags"]!.ToString() != tag) { - options["tags"] = new JArray(options["tags"].ToString(), tag); + options["tags"] = new JArray(options["tags"]!.ToString(), tag); } - else if (options["tags"].Type == JTokenType.Array) + else if (options["tags"]!.Type == JTokenType.Array) { - JArray tags = (JArray)options["tags"]; + JArray tags = (JArray)options["tags"]!; if (!tags.Any(t => t.Type == JTokenType.String && t.ToString() == tag)) { tags.Add(tag); @@ -2255,16 +1878,6 @@ private JObject AddTags(JObject? options = null) return options; } - /// - /// Gets the translation engine identifier from the project secret, - /// depending on whether we are pre-translating or not. - /// - /// The project secret. - /// If true, we are pre-translating. - /// The translation engine identifier. - private static string? GetTranslationEngineId(SFProjectSecret projectSecret, bool preTranslate) => - preTranslate ? projectSecret.ServalData?.PreTranslationEngineId : projectSecret.ServalData?.TranslationEngineId; - /// /// Records the Corpus Synchronization information. /// diff --git a/src/SIL.XForge.Scripture/Services/PreTranslationService.cs b/src/SIL.XForge.Scripture/Services/PreTranslationService.cs index 3dd5709ff1d..4ff9f05530a 100644 --- a/src/SIL.XForge.Scripture/Services/PreTranslationService.cs +++ b/src/SIL.XForge.Scripture/Services/PreTranslationService.cs @@ -31,9 +31,7 @@ CancellationToken cancellationToken ) { // Ensure we have the parameters to retrieve the pre-translation - (string translationEngineId, string? _, string? parallelCorpusId) = await GetPreTranslationParametersAsync( - sfProjectId - ); + (string translationEngineId, string parallelCorpusId) = await GetPreTranslationParametersAsync(sfProjectId); // If there is no parallel corpus id, there are no confidence values if (parallelCorpusId is null) @@ -107,8 +105,7 @@ CancellationToken cancellationToken ) { // Ensure we have the parameters to retrieve the pre-translation - (string translationEngineId, string? corpusId, string? parallelCorpusId) = - await GetPreTranslationParametersAsync(sfProjectId); + (string translationEngineId, string parallelCorpusId) = await GetPreTranslationParametersAsync(sfProjectId); // Generate the paragraph marker and quote normalization behaviors PretranslationUsfmMarkerBehavior paragraphMarkerBehavior = config.ParagraphFormat switch @@ -126,40 +123,18 @@ CancellationToken cancellationToken }; // Get the USFM - string usfm = string.Empty; - if (parallelCorpusId is not null) - { - usfm = await translationEnginesClient.GetPretranslatedUsfmAsync( - id: translationEngineId, - parallelCorpusId: parallelCorpusId, - textId: GetTextId(bookNum), - textOrigin: PretranslationUsfmTextOrigin.OnlyPretranslated, - template: PretranslationUsfmTemplate.Source, - paragraphMarkerBehavior: paragraphMarkerBehavior, - embedBehavior: PretranslationUsfmMarkerBehavior.Strip, - styleMarkerBehavior: PretranslationUsfmMarkerBehavior.Strip, - quoteNormalizationBehavior: quoteNormalizationBehavior, - cancellationToken: cancellationToken - ); - } - else if (corpusId is not null) - { - // Retrieve the USFM from a legacy corpus -#pragma warning disable CS0612 // Type or member is obsolete - usfm = await translationEnginesClient.GetCorpusPretranslatedUsfmAsync( - id: translationEngineId, - corpusId: corpusId, - textId: GetTextId(bookNum), - textOrigin: PretranslationUsfmTextOrigin.OnlyPretranslated, - template: PretranslationUsfmTemplate.Source, - paragraphMarkerBehavior: paragraphMarkerBehavior, - embedBehavior: PretranslationUsfmMarkerBehavior.Strip, - styleMarkerBehavior: PretranslationUsfmMarkerBehavior.Strip, - quoteNormalizationBehavior: quoteNormalizationBehavior, - cancellationToken: cancellationToken - ); -#pragma warning restore CS0612 // Type or member is obsolete - } + string usfm = await translationEnginesClient.GetPretranslatedUsfmAsync( + id: translationEngineId, + parallelCorpusId, + textId: GetTextId(bookNum), + textOrigin: PretranslationUsfmTextOrigin.OnlyPretranslated, + template: PretranslationUsfmTemplate.Source, + paragraphMarkerBehavior: paragraphMarkerBehavior, + embedBehavior: PretranslationUsfmMarkerBehavior.Strip, + styleMarkerBehavior: PretranslationUsfmMarkerBehavior.Strip, + quoteNormalizationBehavior: quoteNormalizationBehavior, + cancellationToken: cancellationToken + ); // Return the entire book if (chapterNum == 0) @@ -192,8 +167,7 @@ CancellationToken cancellationToken /// The pre-translation engine is not configured, or the project secret cannot be found. protected internal virtual async Task<( string translationEngineId, - string? corpusId, - string? parallelCorpusId + string parallelCorpusId )> GetPreTranslationParametersAsync(string sfProjectId) { // Load the target project secrets, so we can get the translation engine ID and corpus ID @@ -203,30 +177,12 @@ CancellationToken cancellationToken } string? translationEngineId = projectSecret?.ServalData?.PreTranslationEngineId; - string? corpusId = null; - string? parallelCorpusId = null; - if (!string.IsNullOrWhiteSpace(projectSecret?.ServalData?.ParallelCorpusIdForPreTranslate)) - { - parallelCorpusId = projectSecret.ServalData.ParallelCorpusIdForPreTranslate; - } - else - { - // Legacy Serval Project - corpusId = projectSecret - ?.ServalData?.Corpora?.FirstOrDefault(c => - c.Value is { PreTranslate: true, AlternateTrainingSource: false } - ) - .Key; - } - - if ( - string.IsNullOrWhiteSpace(translationEngineId) - || (string.IsNullOrWhiteSpace(corpusId) && string.IsNullOrWhiteSpace(parallelCorpusId)) - ) + string? parallelCorpusId = projectSecret?.ServalData?.ParallelCorpusIdForPreTranslate; + if (string.IsNullOrWhiteSpace(translationEngineId) || string.IsNullOrWhiteSpace(parallelCorpusId)) { throw new DataNotFoundException("The pre-translation engine is not configured."); } - return (translationEngineId, corpusId, parallelCorpusId); + return (translationEngineId, parallelCorpusId); } } diff --git a/src/SIL.XForge.Scripture/Services/SFProjectService.cs b/src/SIL.XForge.Scripture/Services/SFProjectService.cs index 68ddad7f7ba..98251dea9fb 100644 --- a/src/SIL.XForge.Scripture/Services/SFProjectService.cs +++ b/src/SIL.XForge.Scripture/Services/SFProjectService.cs @@ -135,7 +135,6 @@ public async Task CreateProjectAsync(string curUserId, SFProjectCreateSe Script = ptProject.LanguageScript, Tag = ptProject.LanguageTag, }, - TranslateConfig = new TranslateConfig { TranslationSuggestionsEnabled = false }, CheckingConfig = new CheckingConfig { CheckingEnabled = settings.CheckingEnabled, @@ -189,14 +188,7 @@ public async Task CreateProjectAsync(string curUserId, SFProjectCreateSe } } - await _syncService.SyncAsync( - new SyncConfig - { - ProjectId = projectId, - TrainEngine = false, - UserId = curUserId, - } - ); + await _syncService.SyncAsync(new SyncConfig { ProjectId = projectId, UserId = curUserId }); return projectId; } @@ -354,8 +346,7 @@ async Task removeSourceReference(string projectId) await RealtimeService.DeleteProjectAsync(projectId); // The machine service requires the project secrets, so call it before removing them - await _machineProjectService.RemoveProjectAsync(projectId, preTranslate: false, CancellationToken.None); - await _machineProjectService.RemoveProjectAsync(projectId, preTranslate: true, CancellationToken.None); + await _machineProjectService.RemoveProjectAsync(projectId, CancellationToken.None); await ProjectSecrets.DeleteAsync(projectId); } @@ -365,6 +356,8 @@ public async Task UpdateSettingsAsync(string curUserId, string projectId, SFProj #pragma warning disable CS0618 // Type or member is obsolete if (settings.AlternateSourceEnabled is not null) throw new ForbiddenException(); + if (settings.TranslationSuggestionsEnabled is not null) + throw new ForbiddenException(); #pragma warning restore CS0618 // Type or member is obsolete // Connect to the realtime server @@ -476,14 +469,8 @@ public async Task UpdateSettingsAsync(string curUserId, string projectId, SFProj } } - bool hasExistingMachineProject = projectDoc.Data.TranslateConfig.TranslationSuggestionsEnabled; await projectDoc.SubmitJson0OpAsync(op => { - UpdateSetting( - op, - p => p.TranslateConfig.TranslationSuggestionsEnabled, - settings.TranslationSuggestionsEnabled - ); UpdateSetting(op, p => p.BiblicalTermsConfig.BiblicalTermsEnabled, settings.BiblicalTermsEnabled); UpdateSetting(op, p => p.TranslateConfig.Source, source, unsetSourceProject); UpdateSetting(op, p => p.TranslateConfig.DraftConfig.TrainingSources, trainingSources); @@ -509,56 +496,13 @@ await projectDoc.SubmitJson0OpAsync(op => ); }); - bool suggestionsEnabledSet = settings.TranslationSuggestionsEnabled != null; bool sourceParatextIdSet = settings.SourceParatextId != null || unsetSourceProject; bool checkingEnabledSet = settings.CheckingEnabled != null; bool biblicalTermsEnabledSet = settings.BiblicalTermsEnabled != null; // check if a sync needs to be run - if (suggestionsEnabledSet || sourceParatextIdSet || checkingEnabledSet || biblicalTermsEnabledSet) + if (sourceParatextIdSet || checkingEnabledSet || biblicalTermsEnabledSet) { - bool trainEngine = false; - if (suggestionsEnabledSet || sourceParatextIdSet) - { - if ( - projectDoc.Data.TranslateConfig.TranslationSuggestionsEnabled - && projectDoc.Data.TranslateConfig.Source != null - ) - { - // translation suggestions was enabled or source project changed - - // recreate Machine project only if one existed - if (hasExistingMachineProject) - { - await _machineProjectService.RemoveProjectAsync( - projectId, - preTranslate: false, - CancellationToken.None - ); - } - - await EnsureWritingSystemTagIsSetAsync(curUserId, projectDoc, ptProjects); - await _machineProjectService.AddSmtProjectAsync(projectId, CancellationToken.None); - trainEngine = true; - } - else if (hasExistingMachineProject) - { - // translation suggestions was disabled or source project set to null - await _machineProjectService.RemoveProjectAsync( - projectId, - preTranslate: false, - CancellationToken.None - ); - } - } - - await _syncService.SyncAsync( - new SyncConfig - { - ProjectId = projectId, - TrainEngine = trainEngine, - UserId = curUserId, - } - ); + await _syncService.SyncAsync(new SyncConfig { ProjectId = projectId, UserId = curUserId }); } } @@ -2467,8 +2411,6 @@ private async Task CreateResourceProjectInternalAsync(IConnection conn, Script = ptProject.LanguageScript, Tag = ptProject.LanguageTag, }, - TranslateConfig = new TranslateConfig { TranslationSuggestionsEnabled = false, Source = null }, - CheckingConfig = new CheckingConfig { CheckingEnabled = false }, }; // Create the new project using the realtime service diff --git a/src/SIL.XForge.Scripture/Services/SyncService.cs b/src/SIL.XForge.Scripture/Services/SyncService.cs index a76c5c49c86..3767fc0409a 100644 --- a/src/SIL.XForge.Scripture/Services/SyncService.cs +++ b/src/SIL.XForge.Scripture/Services/SyncService.cs @@ -125,7 +125,7 @@ out SFProjectSecret sourceProjectSecret syncConfig.ProjectId, syncConfig.UserId, targetSyncMetrics.Id, - syncConfig.TrainEngine, + false, CancellationToken.None ), null, @@ -180,58 +180,7 @@ await projectSecrets.UpdateAsync( throw; } - // If we are not training SMT suggestions - if (!syncConfig.TrainEngine) - { - // Exit so we don't queue the target again, later in this method - return targetJobId; - } - - // Schedule the build of SMT translation suggestions - string? buildJobId = null; - try - { - // Build the SMT suggestions after the target has synced successfully - buildJobId = backgroundJobClient.ContinueJobWith( - targetJobId, - r => - r.BuildProjectForBackgroundJobAsync( - syncConfig.UserId, - new BuildConfig { ProjectId = syncConfig.ProjectId }, - false, - null, - CancellationToken.None - ), - null, - JobContinuationOptions.OnAnyFinishedState - ); - - // Set the translation queued date and time, and hang fire job id - await projectSecrets.UpdateAsync( - projectSecret.Id, - u => - { - u.Set(p => p.ServalData.TranslationJobId, buildJobId); - u.Set(p => p.ServalData.TranslationQueuedAt, DateTime.UtcNow); - u.Unset(p => p.ServalData.TranslationErrorMessage); - } - ); - - // Return the build job id as it is the last in the chain - return buildJobId; - } - catch (Exception) - { - // Any exceptions should not halt the sync process - if (!string.IsNullOrWhiteSpace(buildJobId)) - { - // We only need to delete the build job - backgroundJobClient.Delete(buildJobId); - } - - // Return the target job id, as the build job was not created - return targetJobId; - } + return targetJobId; } } @@ -251,26 +200,12 @@ await projectSecrets.UpdateAsync( string jobId = !string.IsNullOrWhiteSpace(syncConfig.ParentJobId) ? backgroundJobClient.ContinueJobWith( syncConfig.ParentJobId, - r => - r.RunAsync( - syncConfig.ProjectId, - syncConfig.UserId, - syncMetrics.Id, - syncConfig.TrainEngine, - CancellationToken.None - ), + r => r.RunAsync(syncConfig.ProjectId, syncConfig.UserId, syncMetrics.Id, false, CancellationToken.None), null, JobContinuationOptions.OnAnyFinishedState ) : backgroundJobClient.Schedule( - r => - r.RunAsync( - syncConfig.ProjectId, - syncConfig.UserId, - syncMetrics.Id, - syncConfig.TrainEngine, - CancellationToken.None - ), + r => r.RunAsync(syncConfig.ProjectId, syncConfig.UserId, syncMetrics.Id, false, CancellationToken.None), TimeSpan.FromMinutes(5) ); logger.LogInformation( diff --git a/src/SIL.XForge.Scripture/packages.lock.json b/src/SIL.XForge.Scripture/packages.lock.json index 64a2407e2d8..4ab6eb09cf3 100644 --- a/src/SIL.XForge.Scripture/packages.lock.json +++ b/src/SIL.XForge.Scripture/packages.lock.json @@ -119,9 +119,9 @@ }, "Serval.Client": { "type": "Direct", - "requested": "[1.18.0, )", - "resolved": "1.18.0", - "contentHash": "/MdHjylYh96F1/VaU9yJQpVurnAl2gBNvDUuM/C5rwk2/UghqYBTc5yKr+m6sIz3HROlO1TSr9LFz8ITWSf2kQ==", + "requested": "[1.19.0, )", + "resolved": "1.19.0", + "contentHash": "A91+0tRMko9v0XqCBcwHo8FRPyXZPkzgvOHnzqdTBXTq/DGt1nqZDkwyiZfNa/ynkYYn3wejtM4GB80Vmg6qRg==", "dependencies": { "Newtonsoft.Json": "13.0.4", "System.ComponentModel.Annotations": "5.0.0" @@ -129,9 +129,9 @@ }, "SIL.Machine": { "type": "Direct", - "requested": "[3.9.0, )", - "resolved": "3.9.0", - "contentHash": "OdVAM9KLWZDcCS09XHmXG7LXW7388SRv0voZ+3ckrTL6e25+1g3GpTpDE3EbJG8hsOeLVRuadvBgFMsccvZM+w==", + "requested": "[3.9.1, )", + "resolved": "3.9.1", + "contentHash": "w2xPVUaLLuelgsiYwoNnQ758DEEKkiKai72dEEXDoVTvFlKAeHpkZYj2B9+TcPohyRP42kZ8GIr7baOQN9CsRA==", "dependencies": { "CaseExtensions": "1.1.0", "Newtonsoft.Json": "13.0.4", diff --git a/src/SIL.XForge/Utils/Attempt.cs b/src/SIL.XForge/Utils/Attempt.cs index f75c96fe4fc..852e06216f4 100644 --- a/src/SIL.XForge/Utils/Attempt.cs +++ b/src/SIL.XForge/Utils/Attempt.cs @@ -1,4 +1,6 @@ #nullable disable warnings +using System.Diagnostics.CodeAnalysis; + namespace SIL.XForge.Utils; public static class Attempt @@ -8,23 +10,17 @@ public static class Attempt public static Attempt Failure(T result) => new Attempt(false, result); } -public readonly struct Attempt +public readonly struct Attempt(bool success, T result = default) { public static Attempt Failure { get; } = new Attempt(); public Attempt(T result) : this(true, result) { } - public Attempt(bool success, T result = default) - { - Success = success; - Result = result; - } - - public T Result { get; } - public bool Success { get; } + public T Result { get; } = result; + public bool Success { get; } = success; - public bool TryResult(out T result) + public bool TryResult([NotNullWhen(true)] out T result) { result = Result; return Success; diff --git a/test/SIL.XForge.Scripture.Tests/Controllers/MachineApiControllerTests.cs b/test/SIL.XForge.Scripture.Tests/Controllers/MachineApiControllerTests.cs index 9cca16208e7..e85214bd154 100644 --- a/test/SIL.XForge.Scripture.Tests/Controllers/MachineApiControllerTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Controllers/MachineApiControllerTests.cs @@ -105,7 +105,7 @@ public async Task GetBuildAsync_BuildEnded() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Throws(new DataNotFoundException("Entity Deleted")); // SUT @@ -113,7 +113,6 @@ public async Task GetBuildAsync_BuildEnded() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -125,7 +124,7 @@ public async Task GetBuildAsync_MachineApiDown() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Throws(new BrokenCircuitException()); // SUT @@ -133,7 +132,6 @@ public async Task GetBuildAsync_MachineApiDown() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -147,7 +145,7 @@ public async Task GetBuildAsync_NoBuildRunning() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Returns(Task.FromResult(null)); // SUT @@ -155,7 +153,6 @@ public async Task GetBuildAsync_NoBuildRunning() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -167,7 +164,7 @@ public async Task GetBuildAsync_NoPermission() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Throws(new ForbiddenException()); // SUT @@ -175,7 +172,6 @@ public async Task GetBuildAsync_NoPermission() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -187,7 +183,7 @@ public async Task GetBuildAsync_NoProject() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Throws(new DataNotFoundException(string.Empty)); // SUT @@ -195,7 +191,6 @@ public async Task GetBuildAsync_NoProject() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -207,13 +202,7 @@ public async Task GetBuildAsync_MinRevisionForQueuedBuildQueriesServal() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetQueuedStateAsync( - User01, - Project01, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Returns( Task.FromResult(new ServalBuildDto { State = MachineApiService.BuildStateQueued }) ); @@ -223,49 +212,27 @@ public async Task GetBuildAsync_MinRevisionForQueuedBuildQueriesServal() Project01, buildId: null, minRevision: 1, - preTranslate: false, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); await env .MachineApiService.Received(1) - .GetQueuedStateAsync(User01, Project01, preTranslate: false, isServalAdmin: false, CancellationToken.None); + .GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None); await env .MachineApiService.Received(1) - .GetCurrentBuildAsync( - User01, - Project01, - minRevision: 1, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ); + .GetCurrentBuildAsync(User01, Project01, minRevision: 1, isServalAdmin: false, CancellationToken.None); await env .MachineApiService.DidNotReceiveWithAnyArgs() - .GetBuildAsync( - User01, - Project01, - Build01, - minRevision: null, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ); + .GetBuildAsync(User01, Project01, Build01, minRevision: null, isServalAdmin: false, CancellationToken.None); } [Test] - public async Task GetBuildAsync_PreTranslationQueued() + public async Task GetBuildAsync_Queued() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Returns(Task.FromResult(new ServalBuildDto())); // SUT @@ -273,28 +240,27 @@ public async Task GetBuildAsync_PreTranslationQueued() Project01, buildId: null, minRevision: null, - preTranslate: true, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); await env .MachineApiService.Received(1) - .GetQueuedStateAsync(User01, Project01, preTranslate: true, isServalAdmin: false, CancellationToken.None); + .GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None); await env .MachineApiService.DidNotReceiveWithAnyArgs() - .GetCurrentBuildAsync(User01, Project01, null, true, false, CancellationToken.None); + .GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None); await env .MachineApiService.DidNotReceiveWithAnyArgs() - .GetBuildAsync(User01, Project01, Build01, null, true, false, CancellationToken.None); + .GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None); } [Test] - public async Task GetBuildAsync_PreTranslationNotQueued() + public async Task GetBuildAsync_NotQueued() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, true, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Returns(Task.FromResult(new ServalBuildDto())); // SUT @@ -302,49 +268,19 @@ public async Task GetBuildAsync_PreTranslationNotQueued() Project01, buildId: null, minRevision: null, - preTranslate: true, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); await env .MachineApiService.Received(1) - .GetQueuedStateAsync(User01, Project01, preTranslate: true, isServalAdmin: false, CancellationToken.None); + .GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None); await env .MachineApiService.Received(1) - .GetCurrentBuildAsync(User01, Project01, null, true, false, CancellationToken.None); - await env - .MachineApiService.DidNotReceiveWithAnyArgs() - .GetBuildAsync(User01, Project01, Build01, null, true, false, CancellationToken.None); - } - - [Test] - public async Task GetBuildAsync_PreTranslationSpecificBuild() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, true, false, CancellationToken.None) - .Returns(Task.FromResult(new ServalBuildDto())); - - // SUT - ActionResult actual = await env.Controller.GetBuildAsync( - Project01, - Build01, - minRevision: null, - preTranslate: true, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); + .GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None); await env .MachineApiService.DidNotReceiveWithAnyArgs() - .GetQueuedStateAsync(User01, Project01, preTranslate: true, isServalAdmin: false, CancellationToken.None); - await env - .MachineApiService.DidNotReceiveWithAnyArgs() - .GetCurrentBuildAsync(User01, Project01, null, true, false, CancellationToken.None); - await env - .MachineApiService.Received(1) - .GetBuildAsync(User01, Project01, Build01, null, true, false, CancellationToken.None); + .GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None); } [Test] @@ -352,7 +288,7 @@ public async Task GetBuildAsync_ServalAdmin() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, true, true, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, true, CancellationToken.None) .Returns(Task.FromResult(new ServalBuildDto())); env.UserAccessor.SystemRoles.Returns([SystemRole.ServalAdmin]); @@ -361,14 +297,13 @@ public async Task GetBuildAsync_ServalAdmin() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); await env .MachineApiService.Received(1) - .GetBuildAsync(User01, Project01, Build01, null, true, true, CancellationToken.None); + .GetBuildAsync(User01, Project01, Build01, null, true, CancellationToken.None); } [Test] @@ -376,7 +311,7 @@ public async Task GetBuildAsync_Success() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None) + env.MachineApiService.GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None) .Returns(Task.FromResult(new ServalBuildDto())); // SUT @@ -384,14 +319,19 @@ public async Task GetBuildAsync_Success() Project01, Build01, minRevision: null, - preTranslate: false, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); + await env + .MachineApiService.DidNotReceiveWithAnyArgs() + .GetQueuedStateAsync(User01, Project01, isServalAdmin: false, CancellationToken.None); + await env + .MachineApiService.DidNotReceiveWithAnyArgs() + .GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None); await env .MachineApiService.Received(1) - .GetBuildAsync(User01, Project01, Build01, null, false, false, CancellationToken.None); + .GetBuildAsync(User01, Project01, Build01, null, false, CancellationToken.None); } [Test] @@ -399,7 +339,7 @@ public async Task GetBuildAsync_NoBuildIdBuildEnded() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Throws(new DataNotFoundException("Entity Deleted")); // SUT @@ -407,7 +347,6 @@ public async Task GetBuildAsync_NoBuildIdBuildEnded() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -419,7 +358,7 @@ public async Task GetBuildAsync_NoBuildIdMachineApiDown() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Throws(new BrokenCircuitException()); // SUT @@ -427,7 +366,6 @@ public async Task GetBuildAsync_NoBuildIdMachineApiDown() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -441,7 +379,7 @@ public async Task GetBuildAsync_NoBuildIdNoBuildRunning() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Returns(Task.FromResult(null)); // SUT @@ -449,7 +387,6 @@ public async Task GetBuildAsync_NoBuildIdNoBuildRunning() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -461,7 +398,7 @@ public async Task GetBuildAsync_NoBuildIdNoPermission() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Throws(new ForbiddenException()); // SUT @@ -469,7 +406,6 @@ public async Task GetBuildAsync_NoBuildIdNoPermission() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -481,7 +417,7 @@ public async Task GetBuildAsync_NoBuildIdNoProject() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Throws(new DataNotFoundException(string.Empty)); // SUT @@ -489,7 +425,6 @@ public async Task GetBuildAsync_NoBuildIdNoProject() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); @@ -501,7 +436,7 @@ public async Task GetBuildAsync_NoBuildIdSuccess() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None) + env.MachineApiService.GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None) .Returns(Task.FromResult(new ServalBuildDto())); // SUT @@ -509,14 +444,13 @@ public async Task GetBuildAsync_NoBuildIdSuccess() Project01, buildId: null, minRevision: null, - preTranslate: false, CancellationToken.None ); Assert.IsInstanceOf(actual.Result); await env .MachineApiService.Received(1) - .GetCurrentBuildAsync(User01, Project01, null, false, false, CancellationToken.None); + .GetCurrentBuildAsync(User01, Project01, null, false, CancellationToken.None); } [Test] @@ -524,19 +458,12 @@ public async Task GetBuildsAsync_MachineApiDown() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildsAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetBuildsAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new BrokenCircuitException()); // SUT ActionResult> actual = await env.Controller.GetBuildsAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -550,19 +477,12 @@ public async Task GetBuildsAsync_NoPermission() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildsAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetBuildsAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new ForbiddenException()); // SUT ActionResult> actual = await env.Controller.GetBuildsAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -574,19 +494,12 @@ public async Task GetBuildsAsync_NoProject() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildsAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetBuildsAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new DataNotFoundException(string.Empty)); // SUT ActionResult> actual = await env.Controller.GetBuildsAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -598,19 +511,12 @@ public async Task GetBuildsAsync_Success() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetBuildsAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetBuildsAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Returns(Task.FromResult>([env.TestBuild])); // SUT ActionResult> actual = await env.Controller.GetBuildsAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -731,64 +637,6 @@ public async Task GetBuildConfidencesAsync_Success() Assert.IsInstanceOf(actual.Result); } - [Test] - public async Task GetEngineAsync_MachineApiDown() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetEngineAsync(User01, Project01, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.GetEngineAsync(Project01, CancellationToken.None); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual.Result); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual.Result as ObjectResult)?.StatusCode); - } - - [Test] - public async Task GetEngineAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetEngineAsync(User01, Project01, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.GetEngineAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetEngineAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetEngineAsync(User01, Project01, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.GetEngineAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetEngineAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetEngineAsync(User01, Project01, CancellationToken.None) - .Returns(Task.FromResult(new ServalEngineDto())); - - // SUT - ActionResult actual = await env.Controller.GetEngineAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual.Result); - } - [Test] public async Task GetLastCompletedPreTranslationBuildAsync_MachineApiDown() { @@ -2050,7 +1898,6 @@ public async Task GetRawBuildAsync_MachineApiDown() Project01, Build01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ) @@ -2061,7 +1908,6 @@ public async Task GetRawBuildAsync_MachineApiDown() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); @@ -2080,7 +1926,6 @@ public async Task GetRawBuildAsync_NoPermission() Project01, Build01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ) @@ -2091,7 +1936,6 @@ public async Task GetRawBuildAsync_NoPermission() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); @@ -2108,7 +1952,6 @@ public async Task GetRawBuildAsync_NoProject() Project01, Build01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ) @@ -2119,7 +1962,6 @@ public async Task GetRawBuildAsync_NoProject() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); @@ -2136,7 +1978,6 @@ public async Task GetRawBuildAsync_ServalAdmin() Project01, Build01, minRevision: null, - preTranslate: true, isServalAdmin: true, CancellationToken.None ) @@ -2148,7 +1989,6 @@ public async Task GetRawBuildAsync_ServalAdmin() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); @@ -2165,7 +2005,6 @@ public async Task GetRawBuildAsync_Success() Project01, Build01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ) @@ -2176,7 +2015,6 @@ public async Task GetRawBuildAsync_Success() Project01, Build01, minRevision: null, - preTranslate: true, CancellationToken.None ); @@ -2188,19 +2026,12 @@ public async Task GetRawEngineAsync_MachineApiDown() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetRawEngineAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetRawEngineAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new BrokenCircuitException()); // SUT ActionResult actual = await env.Controller.GetRawEngineAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -2214,19 +2045,12 @@ public async Task GetRawEngineAsync_NoPermission() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetRawEngineAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetRawEngineAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new ForbiddenException()); // SUT ActionResult actual = await env.Controller.GetRawEngineAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -2238,19 +2062,12 @@ public async Task GetRawEngineAsync_NoProject() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetRawEngineAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetRawEngineAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Throws(new DataNotFoundException(string.Empty)); // SUT ActionResult actual = await env.Controller.GetRawEngineAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -2262,20 +2079,13 @@ public async Task GetRawEngineAsync_ServalAdmin() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetRawEngineAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: true, - CancellationToken.None - ) + env.MachineApiService.GetRawEngineAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult(new TranslationEngine())); env.UserAccessor.SystemRoles.Returns([SystemRole.ServalAdmin]); // SUT ActionResult actual = await env.Controller.GetRawEngineAsync( Project01, - preTranslate: true, CancellationToken.None ); @@ -2287,111 +2097,12 @@ public async Task GetRawEngineAsync_Success() { // Set up test environment var env = new TestEnvironment(); - env.MachineApiService.GetRawEngineAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) + env.MachineApiService.GetRawEngineAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) .Returns(Task.FromResult(new TranslationEngine())); // SUT ActionResult actual = await env.Controller.GetRawEngineAsync( Project01, - preTranslate: true, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetWordGraphAsync_MachineApiDown() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetWordGraphAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.GetWordGraphAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual.Result); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual.Result as ObjectResult)?.StatusCode); - } - - [Test] - public async Task GetWordGraphAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetWordGraphAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.GetWordGraphAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetWordGraphAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetWordGraphAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.GetWordGraphAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetWordGraphAsync_NotBuilt() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetWordGraphAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new InvalidOperationException()); - - // SUT - ActionResult actual = await env.Controller.GetWordGraphAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task GetWordGraphAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.GetWordGraphAsync(User01, Project01, string.Empty, CancellationToken.None) - .Returns(Task.FromResult(new WordGraph())); - - // SUT - ActionResult actual = await env.Controller.GetWordGraphAsync( - Project01, - string.Empty, CancellationToken.None ); @@ -2435,79 +2146,6 @@ public async Task IsLanguageSupportedAsync_Success() await env.MachineApiService.Received(1).IsLanguageSupportedAsync(LanguageCode, CancellationToken.None); } - [Test] - public async Task StartBuildAsync_MachineApiDown() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.StartBuildAsync(User01, Project01, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.StartBuildAsync(Project01, CancellationToken.None); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual as ObjectResult)?.StatusCode); - } - - [Test] - public async Task StartBuildAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.StartBuildAsync(User01, Project01, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.StartBuildAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual); - } - - [Test] - public async Task StartBuildAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.StartBuildAsync(User01, Project01, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.StartBuildAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual); - } - - [Test] - public async Task StartBuildAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.StartBuildAsync(User01, Project01, CancellationToken.None) - .Returns(Task.FromResult(new ServalBuildDto())); - - // SUT - ActionResult actual = await env.Controller.StartBuildAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual); - await env.MachineApiService.Received(1).StartBuildAsync(User01, Project01, CancellationToken.None); - } - - [Test] - public async Task StartBuildAsync_Unauthorized() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.StartBuildAsync(User01, Project01, CancellationToken.None) - .Throws(new UnauthorizedAccessException()); - - // SUT - ActionResult actual = await env.Controller.StartBuildAsync(Project01, CancellationToken.None); - - Assert.IsInstanceOf(actual); - } - [Test] public async Task StartPreTranslationBuildAsync_MachineApiDown() { @@ -2658,225 +2296,6 @@ public async Task StartPreTranslationBuildAsync_Unauthorized() Assert.IsInstanceOf(actual); } - [Test] - public async Task TrainSegmentAsync_MachineApiDown() - { - // Set up test environment - var env = new TestEnvironment(); - var segmentPair = new SegmentPair(); - env.MachineApiService.TrainSegmentAsync(User01, Project01, segmentPair, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.TrainSegmentAsync(Project01, segmentPair, CancellationToken.None); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual as ObjectResult)?.StatusCode); - } - - [Test] - public async Task TrainSegmentAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - var segmentPair = new SegmentPair(); - env.MachineApiService.TrainSegmentAsync(User01, Project01, segmentPair, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.TrainSegmentAsync(Project01, segmentPair, CancellationToken.None); - - Assert.IsInstanceOf(actual); - } - - [Test] - public async Task TrainSegmentAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - var segmentPair = new SegmentPair(); - env.MachineApiService.TrainSegmentAsync(User01, Project01, segmentPair, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.TrainSegmentAsync(Project01, segmentPair, CancellationToken.None); - - Assert.IsInstanceOf(actual); - } - - [Test] - public async Task TrainSegmentAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - var segmentPair = new SegmentPair(); - - // SUT - ActionResult actual = await env.Controller.TrainSegmentAsync(Project01, segmentPair, CancellationToken.None); - - Assert.IsInstanceOf(actual); - await env - .MachineApiService.Received(1) - .TrainSegmentAsync(User01, Project01, segmentPair, CancellationToken.None); - } - - [Test] - public async Task TranslateAsync_MachineApiDown() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.TranslateAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.TranslateAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual.Result); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual.Result as ObjectResult)?.StatusCode); - } - - [Test] - public async Task TranslateAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.TranslateAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.TranslateAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task TranslateAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.TranslateAsync(User01, Project01, string.Empty, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.TranslateAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task TranslateAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.MachineApiService.TranslateAsync(User01, Project01, string.Empty, CancellationToken.None) - .Returns(Task.FromResult(new TranslationResult())); - - // SUT - ActionResult actual = await env.Controller.TranslateAsync( - Project01, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task TranslateNAsync_MachineApiDown() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.MachineApiService.TranslateNAsync(User01, Project01, n, string.Empty, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - ActionResult actual = await env.Controller.TranslateNAsync( - Project01, - n, - string.Empty, - CancellationToken.None - ); - - env.ExceptionHandler.Received(1).ReportException(Arg.Any()); - Assert.IsInstanceOf(actual.Result); - Assert.AreEqual(StatusCodes.Status503ServiceUnavailable, (actual.Result as ObjectResult)?.StatusCode); - } - - [Test] - public async Task TranslateNAsync_NoPermission() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.MachineApiService.TranslateNAsync(User01, Project01, n, string.Empty, CancellationToken.None) - .Throws(new ForbiddenException()); - - // SUT - ActionResult actual = await env.Controller.TranslateNAsync( - Project01, - n, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task TranslateNAsync_NoProject() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.MachineApiService.TranslateNAsync(User01, Project01, n, string.Empty, CancellationToken.None) - .Throws(new DataNotFoundException(string.Empty)); - - // SUT - ActionResult actual = await env.Controller.TranslateNAsync( - Project01, - n, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - - [Test] - public async Task TranslateNAsync_Success() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.MachineApiService.TranslateNAsync(User01, Project01, n, string.Empty, CancellationToken.None) - .Returns(Task.FromResult(Array.Empty())); - - // SUT - ActionResult actual = await env.Controller.TranslateNAsync( - Project01, - n, - string.Empty, - CancellationToken.None - ); - - Assert.IsInstanceOf(actual.Result); - } - private class TestEnvironment { private static readonly DateTime Timestamp = DateTime.UtcNow; diff --git a/test/SIL.XForge.Scripture.Tests/Controllers/SFProjectsRpcControllerTests.cs b/test/SIL.XForge.Scripture.Tests/Controllers/SFProjectsRpcControllerTests.cs index 0a4b2c3bd6f..2397b87452a 100644 --- a/test/SIL.XForge.Scripture.Tests/Controllers/SFProjectsRpcControllerTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Controllers/SFProjectsRpcControllerTests.cs @@ -1370,7 +1370,6 @@ public void UpdateSettings_UnknownError() CheckingEnabled = true, HideCommunityCheckingText = true, SourceParatextId = string.Empty, - TranslationSuggestionsEnabled = true, UsersSeeEachOthersResponses = true, }; env.SFProjectService.UpdateSettingsAsync(User01, Project01, settings).Throws(new ArgumentNullException()); diff --git a/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs index f79dff499c3..7c599efa33f 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/MachineApiServiceTests.cs @@ -53,8 +53,6 @@ public class MachineApiServiceTests private const string Paratext01 = "paratext01"; private const string Paratext02 = "paratext02"; private const string ParatextUserId01 = "paratextUser01"; - private const string Segment = "segment"; - private const string TargetSegment = "targetSegment"; private const string HangfireJobId = "jobId"; private const string Data01 = "data01"; @@ -672,7 +670,7 @@ public async Task CancelPreTranslationBuildAsync_NoTranslationEngineAndJobQueued // Set up test environment var env = new TestEnvironment(); await env.ProjectSecrets.UpdateAsync(Project01, op => op.Unset(p => p.ServalData!.PreTranslationEngineId)); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); // SUT Assert.ThrowsAsync(() => @@ -689,7 +687,7 @@ public async Task CancelPreTranslationBuildAsync_Success() { // Set up test environment var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); env.ConfigureTranslationBuild(); env.SetEmptyDraftGenerationMetricAssociations(); // SUT @@ -707,7 +705,7 @@ public async Task CancelPreTranslationBuildAsync_AddsDraftGenerationRequestIdTag { // Set up test environment var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); env.ConfigureTranslationBuild(); const string draftGenerationRequestId = "2345"; env.SetDraftGenerationMetricAssociation(draftGenerationRequestId); @@ -758,7 +756,6 @@ public void GetBuildAsync_BuildEnded() Project01, ServalBuildId01, minRevision, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -779,7 +776,6 @@ public async Task GetBuildAsync_NoBuildRunning() Project01, ServalBuildId01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ); @@ -800,7 +796,6 @@ public void GetBuildAsync_NoPermission() Project01, ServalBuildId01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -820,7 +815,6 @@ public void GetBuildAsync_NoProject() "invalid_project_id", ServalBuildId01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -840,7 +834,6 @@ public void GetBuildAsync_NoTranslationEngine() Project03, ServalBuildId01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -861,7 +854,6 @@ public async Task GetBuildAsync_ServalAdminDoesNotNeedPermission() Project01, ServalBuildId01, minRevision: null, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -883,7 +875,6 @@ public async Task GetBuildAsync_Success() Project01, ServalBuildId01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ); @@ -986,7 +977,6 @@ public async Task GetBuildAsync_IncludesAdditionalInfo() Project01, buildId, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ); @@ -1023,13 +1013,7 @@ public void GetBuildsAsync_NoPermission() // SUT Assert.ThrowsAsync(() => - env.Service.GetBuildsAsync( - User02, - Project01, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) + env.Service.GetBuildsAsync(User02, Project01, isServalAdmin: false, CancellationToken.None) ); } @@ -1041,13 +1025,7 @@ public void GetBuildsAsync_NoProject() // SUT Assert.ThrowsAsync(() => - env.Service.GetBuildsAsync( - User01, - "invalid_project_id", - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) + env.Service.GetBuildsAsync(User01, "invalid_project_id", isServalAdmin: false, CancellationToken.None) ); } @@ -1059,13 +1037,7 @@ public void GetBuildsAsync_NoTranslationEngine() // SUT Assert.ThrowsAsync(() => - env.Service.GetBuildsAsync( - User01, - Project03, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) + env.Service.GetBuildsAsync(User01, Project03, isServalAdmin: false, CancellationToken.None) ); } @@ -1074,7 +1046,7 @@ public async Task GetBuildsAsync_QueuedState() { // Set up test environment var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); env.TranslationEnginesClient.GetAllBuildsAsync(TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult>([])); env.EventMetricService.GetEventMetricsAsync(Project01, Arg.Any(), Arg.Any()) @@ -1084,7 +1056,6 @@ public async Task GetBuildsAsync_QueuedState() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1595,7 +1566,7 @@ public async Task GetBuildsAsync_QueuedStateWithEventMetric() const string trainingScriptureRange = "GEN;EXO"; const string translationScriptureRange = "LEV;NUM"; DateTime requestedDateTime = DateTime.UtcNow; - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); env.TranslationEnginesClient.GetAllBuildsAsync(TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult>([])); env.EventMetricService.GetEventMetricsAsync(Project01, Arg.Any(), Arg.Any()) @@ -1653,7 +1624,6 @@ public async Task GetBuildsAsync_QueuedStateWithEventMetric() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1688,7 +1658,6 @@ public async Task GetBuildsAsync_ServalAdminDoesNotNeedPermission() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1706,13 +1675,7 @@ public void GetBuildsAsync_ServalApiException() // SUT Assert.ThrowsAsync(() => - env.Service.GetBuildsAsync( - User01, - Project01, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) + env.Service.GetBuildsAsync(User01, Project01, isServalAdmin: false, CancellationToken.None) ); } @@ -1729,7 +1692,6 @@ public async Task GetBuildsAsync_Success() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1815,7 +1777,6 @@ public async Task GetBuildsAsync_SuccessWithEventMetrics() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1835,48 +1796,6 @@ public async Task GetBuildsAsync_SuccessWithEventMetrics() Assert.That(builds[0].AdditionalInfo!.CanDenormalizeQuotes, Is.True); } - [Test] - public async Task GetBuildsAsync_SuccessWithFallbackToLegacyBuild() - { - // Set up test environment - var env = new TestEnvironment(); - TranslationBuild translationBuild = env.ConfigureTranslationBuild(); - - // Add additional build properties - const string translationScriptureRange = "GEN;EXO"; - const string trainingScriptureRange = "LEV;NUM"; -#pragma warning disable CS0612 // Type or member is obsolete - translationBuild.Pretranslate = [new PretranslateCorpus { ScriptureRange = translationScriptureRange }]; - translationBuild.TrainOn = [new TrainingCorpus { ScriptureRange = trainingScriptureRange }]; -#pragma warning restore CS0612 // Type or member is obsolete - - env.EventMetricService.GetEventMetricsAsync(Project01, Arg.Any(), Arg.Any()) - .Returns(Task.FromResult(QueryResults.Empty)); - - // SUT - IReadOnlyList builds = await env.Service.GetBuildsAsync( - User02, - Project01, - preTranslate: true, - isServalAdmin: true, - CancellationToken.None - ); - - Assert.AreEqual(1, builds.Count); - TestEnvironment.AssertCoreBuildProperties(translationBuild, builds[0]); - Assert.NotNull(builds[0].AdditionalInfo); - Assert.AreEqual(Project01, builds[0].AdditionalInfo?.TranslationScriptureRanges.Single().ProjectId); - Assert.AreEqual( - translationScriptureRange, - builds[0].AdditionalInfo?.TranslationScriptureRanges.Single().ScriptureRange - ); - Assert.AreEqual( - trainingScriptureRange, - builds[0].AdditionalInfo?.TrainingScriptureRanges.Single().ScriptureRange - ); - Assert.That(builds[0].AdditionalInfo!.CanDenormalizeQuotes, Is.False); - } - [Test] public async Task GetBuildsAsync_SuccessWithFallbackToPreTranslateBuild() { @@ -1909,7 +1828,6 @@ public async Task GetBuildsAsync_SuccessWithFallbackToPreTranslateBuild() IReadOnlyList builds = await env.Service.GetBuildsAsync( User02, Project01, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -1944,7 +1862,6 @@ public void GetCurrentBuildAsync_BuildEnded() User01, Project01, minRevision, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -1964,7 +1881,6 @@ public async Task GetCurrentBuildAsync_NoBuildRunning() User01, Project01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ); @@ -1984,7 +1900,6 @@ public void GetCurrentBuildAsync_NoPermission() User02, Project01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -2003,26 +1918,6 @@ public void GetCurrentBuildAsync_NoProject() User01, "invalid_project_id", minRevision: null, - preTranslate: false, - isServalAdmin: false, - CancellationToken.None - ) - ); - } - - [Test] - public void GetCurrentBuildAsync_NoTranslationEngine() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetCurrentBuildAsync( - User01, - Project03, - minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ) @@ -2041,7 +1936,6 @@ public async Task GetCurrentBuildAsync_ServalAdminDoesNotNeedPermission() User02, Project01, minRevision: null, - preTranslate: true, isServalAdmin: true, CancellationToken.None ); @@ -2061,7 +1955,6 @@ public async Task GetCurrentBuildAsync_Success() User01, Project01, minRevision: null, - preTranslate: false, isServalAdmin: false, CancellationToken.None ); @@ -2096,7 +1989,6 @@ public async Task GetCurrentBuildAsync_PreTranslationCompleted() User01, Project01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ); @@ -2124,7 +2016,6 @@ public void GetCurrentBuildAsync_PreTranslationNoBuilds() User01, Project01, minRevision: null, - preTranslate: true, isServalAdmin: false, CancellationToken.None ) @@ -2237,111 +2128,6 @@ public async Task GetBuildConfidencesAsync_Success() } } - [Test] - public void GetEngineAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetEngineAsync(User02, Project01, CancellationToken.None) - ); - } - - [Test] - public void GetEngineAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetEngineAsync(User01, "invalid_project_id", CancellationToken.None) - ); - } - - [Test] - public void GetEngineAsync_DoesNotOwnTranslationEngine() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Throws(ServalApiExceptions.Forbidden); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetEngineAsync(User01, Project01, CancellationToken.None) - ); - } - - [Test] - public void GetEngineAsync_NoTranslationEngine() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetEngineAsync(User01, Project03, CancellationToken.None) - ); - } - - [Test] - public void GetEngineAsync_ServalOutage() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetEngineAsync(User01, Project01, CancellationToken.None) - ); - } - - [Test] - public async Task GetEngineAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - const string sourceLanguageTag = "en_US"; - const string targetLanguageTag = "en_NZ"; - const double confidence = 96.0; - const int corpusSize = 472; - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Confidence = confidence, - CorpusSize = corpusSize, - Url = "https://example.com", - Id = Project01, - IsBuilding = true, - ModelRevision = 1, - Name = "my_translation_engine", - SourceLanguage = sourceLanguageTag, - TargetLanguage = targetLanguageTag, - Type = MachineProjectService.SmtTransfer, - } - ) - ); - - // SUT - ServalEngineDto actual = await env.Service.GetEngineAsync(User01, Project01, CancellationToken.None); - - Assert.AreEqual(confidence / 100.0, actual.Confidence); - Assert.AreEqual(corpusSize, actual.TrainedSegmentCount); - Assert.AreEqual(sourceLanguageTag, actual.SourceLanguageTag); - Assert.AreEqual(targetLanguageTag, actual.TargetLanguageTag); - Assert.AreEqual(MachineApi.GetEngineHref(Project01), actual.Href); - Assert.AreEqual(1, actual.Projects.Length); - Assert.AreEqual(Project01, actual.Projects.First().Id); - Assert.AreEqual(MachineApi.GetEngineHref(Project01), actual.Projects.First().Href); - } - [Test] public async Task GetLastCompletedPreTranslationBuildAsync_NoCompletedBuild() { @@ -3669,380 +3455,194 @@ await env } [Test] - public void GetWordGraphAsync_NoPermission() + public async Task GetQueuedStateAsync_PreTranslationBuildCrashed() { // Set up test environment var env = new TestEnvironment(); + const string errorMessage = "This is an error message from Serval"; + await env.QueueBuildAsync(Project01, DateTime.UtcNow.AddHours(-6), errorMessage); // SUT - Assert.ThrowsAsync(() => - env.Service.GetWordGraphAsync(User02, Project01, Segment, CancellationToken.None) + ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( + User01, + Project01, + isServalAdmin: false, + CancellationToken.None ); + Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); + Assert.AreEqual(errorMessage, actual?.Message); } [Test] - public void GetWordGraphAsync_NoProject() + public async Task GetQueuedStateAsync_PreTranslationBuildRunTooLong() { // Set up test environment var env = new TestEnvironment(); + await env.QueueBuildAsync(Project01, DateTime.UtcNow.AddHours(-6)); // SUT - Assert.ThrowsAsync(() => - env.Service.GetWordGraphAsync(User01, "invalid_project_id", Segment, CancellationToken.None) + ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( + User01, + Project01, + isServalAdmin: false, + CancellationToken.None ); + Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); + Assert.IsFalse(string.IsNullOrWhiteSpace(actual?.Message)); } [Test] - public void GetWordGraphAsync_NoTranslationEngine() + public async Task GetQueuedStateAsync_PreTranslationBuildQueuedWithScriptureRange() { // Set up test environment var env = new TestEnvironment(); + await env.QueueBuildAsync(Project01, dateTime: DateTime.UtcNow); // SUT - Assert.ThrowsAsync(() => - env.Service.GetWordGraphAsync(User01, Project03, Segment, CancellationToken.None) + ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( + User01, + Project01, + isServalAdmin: false, + CancellationToken.None + ); + Assert.AreEqual(MachineApiService.BuildStateQueued, actual?.State); + Assert.NotNull(actual?.AdditionalInfo); + Assert.AreEqual( + new ProjectScriptureRange { ScriptureRange = "GEN" }, + actual?.AdditionalInfo?.TranslationScriptureRanges.Single() + ); + Assert.AreEqual( + new ProjectScriptureRange { ScriptureRange = "EXO" }, + actual?.AdditionalInfo?.TrainingScriptureRanges.Single() ); } [Test] - public void GetWordGraphAsync_ServalOutage() + public async Task GetQueuedStateAsync_PreTranslationBuildQueuedWithScriptureRanges() { // Set up test environment var env = new TestEnvironment(); - env.TranslationEnginesClient.GetWordGraphAsync(TranslationEngine01, Segment, CancellationToken.None) - .Throws(new BrokenCircuitException()); + await env.QueueBuildAsync(Project02, dateTime: DateTime.UtcNow); // SUT - Assert.ThrowsAsync(() => - env.Service.GetWordGraphAsync(User01, Project01, Segment, CancellationToken.None) + ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( + User01, + Project02, + isServalAdmin: false, + CancellationToken.None + ); + Assert.AreEqual(MachineApiService.BuildStateQueued, actual?.State); + Assert.NotNull(actual?.AdditionalInfo); + Assert.AreEqual( + new ProjectScriptureRange { ProjectId = Project03, ScriptureRange = "GEN" }, + actual?.AdditionalInfo?.TranslationScriptureRanges.Single() + ); + Assert.AreEqual( + new ProjectScriptureRange { ProjectId = Project03, ScriptureRange = "EXO" }, + actual?.AdditionalInfo?.TrainingScriptureRanges.Single() ); } [Test] - public async Task GetWordGraphAsync_Success() + public async Task GetQueuedStateAsync_NoPreTranslationBuildQueued() { // Set up test environment var env = new TestEnvironment(); - const float initialStateScore = -91.43696f; - env.TranslationEnginesClient.GetWordGraphAsync(TranslationEngine01, Segment, CancellationToken.None) - .Returns( - Task.FromResult( - new WordGraph - { - Arcs = [new WordGraphArc()], - FinalStates = [1], - InitialStateScore = initialStateScore, - SourceTokens = [Segment], - } - ) - ); // SUT - WordGraph actual = await env.Service.GetWordGraphAsync(User01, Project01, Segment, CancellationToken.None); - - Assert.IsNotNull(actual); - Assert.AreEqual(initialStateScore, actual.InitialStateScore); - Assert.AreEqual(1, actual.Arcs.Count); - Assert.AreEqual(1, actual.FinalStates.Count); + ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( + User01, + Project01, + isServalAdmin: false, + CancellationToken.None + ); + Assert.IsNull(actual); } [Test] - public void GetWordGraph_EngineNotBuilt() + public void GetQueuedStateAsync_NoPermission() { // Set up test environment var env = new TestEnvironment(); - env.TranslationEnginesClient.GetWordGraphAsync(TranslationEngine01, Segment) - .Throws(ServalApiExceptions.EngineNotBuilt); // SUT - Assert.ThrowsAsync(() => - env.Service.GetWordGraphAsync(User01, Project01, Segment, CancellationToken.None) + Assert.ThrowsAsync(() => + env.Service.GetQueuedStateAsync(User02, Project01, isServalAdmin: false, CancellationToken.None) ); } [Test] - public async Task GetQueuedStateAsync_BuildCrashed() + public async Task GetQueuedStateAsync_ServalAdminDoesNotNeedPermission() { // Set up test environment var env = new TestEnvironment(); - const string errorMessage = "This is an error message from Serval"; - await env.QueueBuildAsync(Project01, preTranslate: false, DateTime.UtcNow.AddHours(-6), errorMessage); // SUT ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, + User02, Project01, - preTranslate: false, - isServalAdmin: false, + isServalAdmin: true, CancellationToken.None ); - Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); - Assert.AreEqual(errorMessage, actual?.Message); + Assert.IsNull(actual); } [Test] - public async Task GetQueuedStateAsync_BuildRunTooLong() + public async Task GetQueuedStateAsync_PreTranslationsRetrieving() { // Set up test environment var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: false, DateTime.UtcNow.AddHours(-6)); + await env.QueueBuildAsync(Project01, dateTime: null, errorMessage: null, preTranslationsRetrieved: false); // SUT ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( User01, Project01, - preTranslate: false, isServalAdmin: false, CancellationToken.None ); - Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); + Assert.AreEqual(MachineApiService.BuildStateFinishing, actual?.State); Assert.IsFalse(string.IsNullOrWhiteSpace(actual?.Message)); } [Test] - public async Task GetQueuedStateAsync_BuildQueued() + public async Task ProcessBuildAsync_Canceled() { // Set up test environment var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: false, dateTime: DateTime.UtcNow); // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: false, - isServalAdmin: false, + await env.Service.ProcessBuildAsync( + TranslationEngine01, + ServalBuildId01, + JobState.Canceled, CancellationToken.None ); - Assert.AreEqual(MachineApiService.BuildStateQueued, actual?.State); - Assert.AreEqual(Project01, actual?.Id); + + // One job: BuildCompletedAsync + env.BackgroundJobClient.Received(1).Create(Arg.Any(), Arg.Any()); } [Test] - public async Task GetQueuedStateAsync_NoBuildQueued() + public async Task ProcessBuildAsync_Completed() { // Set up test environment var env = new TestEnvironment(); // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: false, - isServalAdmin: false, + await env.Service.ProcessBuildAsync( + TranslationEngine01, + ServalBuildId01, + JobState.Completed, CancellationToken.None ); - Assert.IsNull(actual); + + // Two jobs: BuildCompletedAsync & RetrievePreTranslationStatusAsync + env.BackgroundJobClient.Received(2).Create(Arg.Any(), Arg.Any()); } [Test] - public async Task GetQueuedStateAsync_PreTranslationBuildCrashed() - { - // Set up test environment - var env = new TestEnvironment(); - const string errorMessage = "This is an error message from Serval"; - await env.QueueBuildAsync(Project01, preTranslate: true, DateTime.UtcNow.AddHours(-6), errorMessage); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); - Assert.AreEqual(errorMessage, actual?.Message); - } - - [Test] - public async Task GetQueuedStateAsync_PreTranslationBuildRunTooLong() - { - // Set up test environment - var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: true, DateTime.UtcNow.AddHours(-6)); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.AreEqual(MachineApiService.BuildStateFaulted, actual?.State); - Assert.IsFalse(string.IsNullOrWhiteSpace(actual?.Message)); - } - - [Test] - public async Task GetQueuedStateAsync_PreTranslationBuildQueuedWithScriptureRange() - { - // Set up test environment - var env = new TestEnvironment(); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: DateTime.UtcNow); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.AreEqual(MachineApiService.BuildStateQueued, actual?.State); - Assert.NotNull(actual?.AdditionalInfo); - Assert.AreEqual( - new ProjectScriptureRange { ScriptureRange = "GEN" }, - actual?.AdditionalInfo?.TranslationScriptureRanges.Single() - ); - Assert.AreEqual( - new ProjectScriptureRange { ScriptureRange = "EXO" }, - actual?.AdditionalInfo?.TrainingScriptureRanges.Single() - ); - } - - [Test] - public async Task GetQueuedStateAsync_PreTranslationBuildQueuedWithScriptureRanges() - { - // Set up test environment - var env = new TestEnvironment(); - await env.QueueBuildAsync(Project02, preTranslate: true, dateTime: DateTime.UtcNow); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project02, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.AreEqual(MachineApiService.BuildStateQueued, actual?.State); - Assert.NotNull(actual?.AdditionalInfo); - Assert.AreEqual( - new ProjectScriptureRange { ProjectId = Project03, ScriptureRange = "GEN" }, - actual?.AdditionalInfo?.TranslationScriptureRanges.Single() - ); - Assert.AreEqual( - new ProjectScriptureRange { ProjectId = Project03, ScriptureRange = "EXO" }, - actual?.AdditionalInfo?.TrainingScriptureRanges.Single() - ); - } - - [Test] - public async Task GetQueuedStateAsync_NoPreTranslationBuildQueued() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.IsNull(actual); - } - - [Test] - public void GetQueuedStateAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.GetQueuedStateAsync( - User02, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ) - ); - } - - [Test] - public async Task GetQueuedStateAsync_ServalAdminDoesNotNeedPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User02, - Project01, - preTranslate: true, - isServalAdmin: true, - CancellationToken.None - ); - Assert.IsNull(actual); - } - - [Test] - public async Task GetQueuedStateAsync_PreTranslationsRetrieving() - { - // Set up test environment - var env = new TestEnvironment(); - await env.QueueBuildAsync( - Project01, - preTranslate: true, - dateTime: null, - errorMessage: null, - preTranslationsRetrieved: false - ); - - // SUT - ServalBuildDto? actual = await env.Service.GetQueuedStateAsync( - User01, - Project01, - preTranslate: true, - isServalAdmin: false, - CancellationToken.None - ); - Assert.AreEqual(MachineApiService.BuildStateFinishing, actual?.State); - Assert.IsFalse(string.IsNullOrWhiteSpace(actual?.Message)); - } - - [Test] - public async Task ProcessBuildAsync_Canceled() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - await env.Service.ProcessBuildAsync( - TranslationEngine01, - ServalBuildId01, - JobState.Canceled, - CancellationToken.None - ); - - // One job: BuildCompletedAsync - env.BackgroundJobClient.Received(1).Create(Arg.Any(), Arg.Any()); - } - - [Test] - public async Task ProcessBuildAsync_Completed() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - await env.Service.ProcessBuildAsync( - TranslationEngine01, - ServalBuildId01, - JobState.Completed, - CancellationToken.None - ); - - // Two jobs: BuildCompletedAsync & RetrievePreTranslationStatusAsync - env.BackgroundJobClient.Received(2).Create(Arg.Any(), Arg.Any()); - } - - [Test] - public async Task ProcessBuildAsync_InvalidTranslationEngineId() + public async Task ProcessBuildAsync_InvalidTranslationEngineId() { // Set up test environment var env = new TestEnvironment(); @@ -4382,7 +3982,7 @@ public async Task LatestTimestampForRevisionAsync_BuildAfterTimestamp() build.AdditionalInfo.DateRequested = new DateTimeOffset(buildRequested); build.AdditionalInfo.TranslationScriptureRanges.Add(new ProjectScriptureRange { ScriptureRange = "GEN-DEU" }); env.Service.Configure() - .GetBuildsAsync(User01, Project01, preTranslate: true, isServalAdmin: true, CancellationToken.None) + .GetBuildsAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult>([build])); // SUT @@ -4412,7 +4012,7 @@ public async Task LatestTimestampForRevisionAsync_BuildBeforeTimestamp() build.AdditionalInfo.DateRequested = new DateTimeOffset(buildRequested); build.AdditionalInfo.TranslationScriptureRanges.Add(new ProjectScriptureRange { ScriptureRange = "GEN-DEU" }); env.Service.Configure() - .GetBuildsAsync(User01, Project01, preTranslate: true, isServalAdmin: true, CancellationToken.None) + .GetBuildsAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult>([build])); // SUT @@ -4442,7 +4042,7 @@ public async Task LatestTimestampForRevisionAsync_BuildFinishing() build.AdditionalInfo.DateRequested = new DateTimeOffset(buildRequested); build.AdditionalInfo.TranslationScriptureRanges.Add(new ProjectScriptureRange { ScriptureRange = "GEN-DEU" }); env.Service.Configure() - .GetBuildsAsync(User01, Project01, preTranslate: true, isServalAdmin: true, CancellationToken.None) + .GetBuildsAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult>([build])); // SUT @@ -4472,7 +4072,7 @@ public async Task LatestTimestampForRevisionAsync_BuildsDoNotContainBook() build.AdditionalInfo.DateRequested = new DateTimeOffset(buildRequested); build.AdditionalInfo.TranslationScriptureRanges.Add(new ProjectScriptureRange { ScriptureRange = "LEV-DEU" }); env.Service.Configure() - .GetBuildsAsync(User01, Project01, preTranslate: true, isServalAdmin: true, CancellationToken.None) + .GetBuildsAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult>([build])); // SUT @@ -4494,7 +4094,7 @@ public async Task LatestTimestampForRevisionAsync_NoBuilds() var env = new TestEnvironment(); DateTime timestamp = DateTime.UtcNow; env.Service.Configure() - .GetBuildsAsync(User01, Project01, preTranslate: true, isServalAdmin: true, CancellationToken.None) + .GetBuildsAsync(User01, Project01, isServalAdmin: true, CancellationToken.None) .Returns(Task.FromResult>([])); // SUT @@ -4510,46 +4110,6 @@ public async Task LatestTimestampForRevisionAsync_NoBuilds() Assert.AreEqual(actual, timestamp); } - [Test] - public void StartBuildAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.StartBuildAsync(User02, Project01, CancellationToken.None) - ); - } - - [Test] - public void StartBuildAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.StartBuildAsync(User01, "invalid_project_id", CancellationToken.None) - ); - } - - [Test] - public async Task StartBuildAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - await env.Service.StartBuildAsync(User01, Project01, CancellationToken.None); - - await env.ProjectService.Received(1).SyncAsync(User01, Project01); - env.BackgroundJobClient.Received(1).Create(Arg.Any(), Arg.Any()); - Assert.AreEqual(HangfireJobId, env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNotNull(env.ProjectSecrets.Get(Project01).ServalData?.TranslationQueuedAt); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData?.TranslationErrorMessage); - } - [Test] public async Task StartPreTranslationBuildAsync_TheSameTrainingAndDraftingSource() { @@ -4756,7 +4316,7 @@ public async Task StartPreTranslationBuildAsync_BuildAlreadyQueued() // Set up test environment var env = new TestEnvironment(); DateTime queuedAt = DateTime.UtcNow; - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: queuedAt); + await env.QueueBuildAsync(Project01, dateTime: queuedAt); const string existingRange = "GEN"; await env.Projects.UpdateAsync( Project01, @@ -4861,7 +4421,7 @@ public async Task StartPreTranslationBuildAsync_StaleQueuedClaimWithJobIdIsRecla // A stale claim whose Hangfire job never ran (e.g. a continuation deleted after a failed sync) // leaves both the job id and the queued timestamp behind DateTime staleQueuedAt = DateTime.UtcNow - MachineApiService.QueuedBuildStaleThreshold - TimeSpan.FromHours(1); - await env.QueueBuildAsync(Project01, preTranslate: true, dateTime: staleQueuedAt); + await env.QueueBuildAsync(Project01, dateTime: staleQueuedAt); // SUT await env.Service.StartPreTranslationBuildAsync( @@ -5194,297 +4754,6 @@ await env.Service.StartPreTranslationBuildAsync( Assert.IsNull(env.ProjectSecrets.Get(Project02).ServalData?.PreTranslationErrorMessage); } - [Test] - public async Task StartPreTranslationBuildAsync_WillNotSyncSourceSeparatelyIfDuplicated() - { - // Set up test environment - var env = new TestEnvironment(); - await env.Projects.UpdateAsync( - p => p.Id == Project02, - u => - u.Set( - s => s.TranslateConfig, - new TranslateConfig - { - DraftConfig = new DraftConfig - { - DraftingSources = [new TranslateSource { ProjectRef = Project01 }], - TrainingSources = [new TranslateSource { ProjectRef = Project01 }], - }, - Source = new TranslateSource { ProjectRef = Project01 }, - } - ) - ); - - // SUT - await env.Service.StartPreTranslationBuildAsync( - User01, - new BuildConfig { ProjectId = Project02 }, - CancellationToken.None - ); - - await env.ProjectService.Received(1).SyncAsync(User01, Project02); - await env.SyncService.DidNotReceive().SyncAsync(Arg.Any()); - env.BackgroundJobClient.Received(1).Create(Arg.Any(), Arg.Any()); - Assert.AreEqual(HangfireJobId, env.ProjectSecrets.Get(Project02).ServalData!.PreTranslationJobId); - Assert.IsNotNull(env.ProjectSecrets.Get(Project02).ServalData?.PreTranslationQueuedAt); - Assert.IsNull(env.ProjectSecrets.Get(Project02).ServalData?.PreTranslationErrorMessage); - } - - [Test] - public void TrainSegmentAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TrainSegmentAsync(User02, Project01, new SegmentPair(), CancellationToken.None) - ); - } - - [Test] - public void TrainSegmentAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TrainSegmentAsync(User01, "invalid_project_id", new SegmentPair(), CancellationToken.None) - ); - } - - [Test] - public void TrainSegmentAsync_NoTranslationEngine() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TrainSegmentAsync(User01, Project03, new SegmentPair(), CancellationToken.None) - ); - } - - [Test] - public void TrainSegmentAsync_ServalOutage() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.TrainSegmentAsync( - TranslationEngine01, - Arg.Any(), - CancellationToken.None - ) - .Throws(new BrokenCircuitException()); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TrainSegmentAsync(User01, Project01, new SegmentPair(), CancellationToken.None) - ); - } - - [Test] - public async Task TrainSegmentAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - await env.Service.TrainSegmentAsync(User01, Project01, new SegmentPair(), CancellationToken.None); - - await env - .TranslationEnginesClient.Received(1) - .TrainSegmentAsync(TranslationEngine01, Arg.Any(), CancellationToken.None); - } - - [Test] - public void TranslateAsync_NoPermission() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateAsync(User02, Project01, Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateAsync_NoProject() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateAsync(User01, "invalid_project_id", Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateAsync_NoTranslationEngine() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateAsync(User01, Project03, Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateAsync_ServalOutage() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.TranslateAsync(TranslationEngine01, Segment, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateAsync(User01, Project01, Segment, CancellationToken.None) - ); - } - - [Test] - public async Task TranslateAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.TranslateAsync(TranslationEngine01, Segment, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationResult - { - Alignment = [new AlignedWordPair()], - Confidences = [0.0], - Phrases = [new Phrase()], - Sources = - [ - [TranslationSource.Primary], - ], - TargetTokens = [TargetSegment], - SourceTokens = [Segment], - Translation = TargetSegment, - } - ) - ); - - // SUT - TranslationResult actual = await env.Service.TranslateAsync(User01, Project01, Segment, CancellationToken.None); - - Assert.IsNotNull(actual); - Assert.AreEqual(1, actual.SourceTokens.Count); - Assert.AreEqual(1, actual.TargetTokens.Count); - Assert.AreEqual(1, actual.Confidences.Count); - Assert.AreEqual(1, actual.Sources.Count); - Assert.AreEqual(1, actual.Alignment.Count); - Assert.AreEqual(1, actual.Phrases.Count); - Assert.AreEqual(TargetSegment, actual.Translation); - } - - [Test] - public void TranslateNAsync_NoPermission() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateNAsync(User02, Project01, n, Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateNAsync_NoProject() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateNAsync(User01, "invalid_project_id", n, Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateNAsync_NoTranslationEngine() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateNAsync(User01, Project03, n, Segment, CancellationToken.None) - ); - } - - [Test] - public void TranslateNAsync_ServalOutage() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.TranslationEnginesClient.TranslateNAsync(TranslationEngine01, n, Segment, CancellationToken.None) - .Throws(new BrokenCircuitException()); - - // SUT - Assert.ThrowsAsync(() => - env.Service.TranslateNAsync(User01, Project01, n, Segment, CancellationToken.None) - ); - } - - [Test] - public async Task TranslateNAsync_Success() - { - // Set up test environment - const int n = 1; - var env = new TestEnvironment(); - env.TranslationEnginesClient.TranslateNAsync(TranslationEngine01, n, Segment, CancellationToken.None) - .Returns( - Task.FromResult>([ - new TranslationResult - { - Alignment = [new AlignedWordPair()], - Confidences = [0.0], - Phrases = [new Phrase()], - Sources = - [ - [TranslationSource.Primary], - ], - TargetTokens = [TargetSegment], - SourceTokens = [Segment], - Translation = TargetSegment, - }, - ]) - ); - - // SUT - TranslationResult[] actual = await env.Service.TranslateNAsync( - User01, - Project01, - n, - Segment, - CancellationToken.None - ); - - Assert.IsNotNull(actual); - Assert.AreEqual(1, actual.Length); - Assert.AreEqual(1, actual.First().SourceTokens.Count); - Assert.AreEqual(1, actual.First().TargetTokens.Count); - Assert.AreEqual(1, actual.First().Confidences.Count); - Assert.AreEqual(1, actual.First().Sources.Count); - Assert.AreEqual(1, actual.First().Alignment.Count); - Assert.AreEqual(1, actual.First().Phrases.Count); - Assert.AreEqual(TargetSegment, actual.First().Translation); - } - [Test] public async Task UpdatePreTranslationTextDocumentsAsync_CreatesNewDocument() { @@ -5749,7 +5018,6 @@ public TestEnvironment() { ParallelCorpusIdForPreTranslate = ParallelCorpusId01, PreTranslationEngineId = TranslationEngine01, - TranslationEngineId = TranslationEngine01, }, }, new SFProjectSecret @@ -6286,7 +5554,6 @@ public QueryResults GetEventMetricsForBuildCompleted(bool sendEmail public async Task QueueBuildAsync( string sfProjectId, - bool preTranslate, DateTime? dateTime, string? errorMessage = null, bool? preTranslationsRetrieved = null @@ -6295,32 +5562,16 @@ await ProjectSecrets.UpdateAsync( sfProjectId, u => { - if (preTranslate) + u.Set(p => p.ServalData!.PreTranslationJobId, HangfireJobId); + u.Set(p => p.ServalData!.PreTranslationQueuedAt, dateTime); + u.Set(p => p.ServalData!.PreTranslationsRetrieved, preTranslationsRetrieved); + if (string.IsNullOrWhiteSpace(errorMessage)) { - u.Set(p => p.ServalData!.PreTranslationJobId, HangfireJobId); - u.Set(p => p.ServalData!.PreTranslationQueuedAt, dateTime); - u.Set(p => p.ServalData!.PreTranslationsRetrieved, preTranslationsRetrieved); - if (string.IsNullOrWhiteSpace(errorMessage)) - { - u.Unset(p => p.ServalData!.PreTranslationErrorMessage); - } - else - { - u.Set(p => p.ServalData!.PreTranslationErrorMessage, errorMessage); - } + u.Unset(p => p.ServalData!.PreTranslationErrorMessage); } else { - u.Set(p => p.ServalData!.TranslationJobId, HangfireJobId); - u.Set(p => p.ServalData!.TranslationQueuedAt, dateTime); - if (string.IsNullOrWhiteSpace(errorMessage)) - { - u.Unset(p => p.ServalData!.TranslationErrorMessage); - } - else - { - u.Set(p => p.ServalData!.TranslationErrorMessage, errorMessage); - } + u.Set(p => p.ServalData!.PreTranslationErrorMessage, errorMessage); } } ); diff --git a/test/SIL.XForge.Scripture.Tests/Services/MachineProjectServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/MachineProjectServiceTests.cs index 78b780ef77d..bc585a76ee4 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/MachineProjectServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/MachineProjectServiceTests.cs @@ -1,4 +1,3 @@ -#nullable disable warnings using System; using System.Collections.Generic; using System.Diagnostics; @@ -24,7 +23,6 @@ using SIL.XForge.DataAccess; using SIL.XForge.Models; using SIL.XForge.Realtime; -using SIL.XForge.Realtime.Json0; using SIL.XForge.Scripture.Models; using SIL.XForge.Scripture.Realtime; using SIL.XForge.Services; @@ -60,8 +58,6 @@ public class MachineProjectServiceTests private const string File02 = "file02"; private const string File03 = "file03"; private const string File04 = "file04"; - private const string File05 = "file05"; - private const string File06 = "file06"; private const string Job01 = "job01"; private const string ParallelCorpus01 = "parallelCorpus01"; private const string ParallelCorpus02 = "parallelCorpus02"; @@ -72,43 +68,6 @@ public class MachineProjectServiceTests private const string LanguageScript = "latn"; private const string LanguageTag = "he"; - [Test] - public async Task AddSmtProjectAsync_DoesNotCreateIfLanguageMissing() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - string actual = await env.Service.AddSmtProjectAsync(Project03, CancellationToken.None); - Assert.IsEmpty(actual); - } - - [Test] - public void AddSmtProjectAsync_ThrowsExceptionWhenProjectSecretMissing() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.AddSmtProjectAsync("invalid_project_id", CancellationToken.None) - ); - } - - [Test] - public async Task AddSmtProjectAsync_Success() - { - // Set up test environment - var env = new TestEnvironment(); - env.Service.Configure() - .CreateServalProjectAsync(Arg.Any(), preTranslate: false, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(TranslationEngine01)); - - // SUT - string actual = await env.Service.AddSmtProjectAsync(Project01, CancellationToken.None); - Assert.AreEqual(TranslationEngine01, actual); - } - [Test] public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordBuildInProgressErrors() { @@ -120,7 +79,6 @@ public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordBuildInProgress .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -148,45 +106,6 @@ await env.Service.BuildProjectForBackgroundJobAsync( Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationQueuedAt); } - [Test] - public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordBuildInProgressErrorsForSmt() - { - // Set up test environment - var env = new TestEnvironment(); - ServalApiException ex = ServalApiExceptions.BuildInProgress; - var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .BuildProjectAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - cancellationToken: CancellationToken.None - ) - .ThrowsAsync(ex); - - // An SMT translation job has been queued - await env.SetupProjectSecretAsync( - Project01, - new ServalData { TranslationJobId = Job01, TranslationQueuedAt = DateTime.UtcNow } - ); - - // SUT - await env.Service.BuildProjectForBackgroundJobAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - CancellationToken.None - ); - - env.MockLogger.AssertNoEvent(logEvent => logEvent.Exception == ex); - env.ExceptionHandler.DidNotReceiveWithAnyArgs().ReportException(ex); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationErrorMessage); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationQueuedAt); - } - [Test] public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordTaskCancellation() { @@ -198,7 +117,6 @@ public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordTaskCancellatio .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -225,44 +143,6 @@ await env.Service.BuildProjectForBackgroundJobAsync( Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationErrorMessage); } - [Test] - public async Task BuildProjectForBackgroundJobAsync_DoesNotRecordTaskCancellationForSmt() - { - // Set up test environment - var env = new TestEnvironment(); - var ex = new TaskCanceledException(); - var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .BuildProjectAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - cancellationToken: CancellationToken.None - ) - .ThrowsAsync(ex); - - // An SMT translation job has been queued - await env.SetupProjectSecretAsync( - Project01, - new ServalData { TranslationJobId = Job01, TranslationQueuedAt = DateTime.UtcNow } - ); - - // SUT - await env.Service.BuildProjectForBackgroundJobAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - CancellationToken.None - ); - - env.ExceptionHandler.DidNotReceive().ReportException(Arg.Any()); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationQueuedAt); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationErrorMessage); - } - [Test] public async Task BuildProjectForBackgroundJobAsync_RecordsDataNotFoundExceptionAsWarning() { @@ -274,7 +154,6 @@ public async Task BuildProjectForBackgroundJobAsync_RecordsDataNotFoundException .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -304,7 +183,6 @@ public async Task BuildProjectForBackgroundJobAsync_MissingDirectoryDataNotFound .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -333,7 +211,6 @@ public async Task BuildProjectForBackgroundJobAsync_InvalidDataException() .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -356,8 +233,6 @@ await env.Service.BuildProjectForBackgroundJobAsync( env.MockLogger.AssertHasEvent(logEvent => logEvent.Exception == ex && logEvent.LogLevel == LogLevel.Error); env.ExceptionHandler.Received(1).ReportException(ex); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationQueuedAt); Assert.AreEqual(ex.Message, env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationErrorMessage); } @@ -372,7 +247,6 @@ public async Task BuildProjectForBackgroundJobAsync_RecordsErrors() .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -398,47 +272,6 @@ await env.Service.BuildProjectForBackgroundJobAsync( Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationJobId); Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationQueuedAt); Assert.AreEqual(ex.Message, env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationErrorMessage); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationErrorMessage); - } - - [Test] - public async Task BuildProjectForBackgroundJobAsync_RecordsErrorsForSmt() - { - // Set up test environment - var env = new TestEnvironment(); - ServalApiException ex = ServalApiExceptions.Forbidden; - var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .BuildProjectAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - cancellationToken: CancellationToken.None - ) - .ThrowsAsync(ex); - - // An SMT translation job has been queued - await env.SetupProjectSecretAsync( - Project01, - new ServalData { TranslationJobId = Job01, TranslationQueuedAt = DateTime.UtcNow } - ); - - // SUT - await env.Service.BuildProjectForBackgroundJobAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - CancellationToken.None - ); - - env.MockLogger.AssertHasEvent(logEvent => logEvent.Exception == ex && logEvent.LogLevel == LogLevel.Error); - env.ExceptionHandler.Received(1).ReportException(ex); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationErrorMessage); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationQueuedAt); - Assert.AreEqual(ex.Message, env.ProjectSecrets.Get(Project01).ServalData!.TranslationErrorMessage); } [Test] @@ -451,7 +284,6 @@ public async Task BuildProjectForBackgroundJobAsync_RunsBuildProjectAsync() .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -471,7 +303,6 @@ await env .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ); @@ -488,7 +319,6 @@ public async Task BuildProjectForBackgroundJobAsync_SendsEmailForBuildInProgress .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -525,7 +355,6 @@ public async Task BuildProjectForBackgroundJobAsync_SendsEmailForTaskCancellatio .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -562,7 +391,6 @@ public async Task BuildProjectForBackgroundJobAsync_SendsEmailForUnexpectedError .BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -603,7 +431,6 @@ await env.Projects.ReplaceAsync( ParatextId = Paratext01, CheckingConfig = new CheckingConfig(), UserRoles = [], - TranslateConfig = new TranslateConfig { TranslationSuggestionsEnabled = true }, WritingSystem = new WritingSystem { Tag = "en_US" }, } ); @@ -636,13 +463,7 @@ public async Task BuildProjectForBackgroundJobAsync_AddsDraftGenerationRequestId // Mock BuildProjectAsync to return successfully env.Service.Configure() - .BuildProjectAsync( - User01, - buildConfig, - preTranslate: true, - draftGenerationRequestId, - cancellationToken: CancellationToken.None - ) + .BuildProjectAsync(User01, buildConfig, draftGenerationRequestId, cancellationToken: CancellationToken.None) .Returns(Task.FromResult(Build01)); Activity? activity = null; @@ -684,15 +505,11 @@ public async Task BuildProjectAsync_PreTranslationBuild() }; await env.SetupProjectSecretAsync(Project01, servalData); var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .RemoveLegacyServalDataAsync(Project01, preTranslate: true, CancellationToken.None) - .Returns(Task.CompletedTask); env.Service.Configure() .EnsureTranslationEngineExistsAsync( User01, Arg.Any>(), Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -701,13 +518,12 @@ public async Task BuildProjectAsync_PreTranslationBuild() .RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) .Returns(Task.CompletedTask); env.Service.Configure() - .SyncProjectCorporaAsync(User01, buildConfig, preTranslate: true, CancellationToken.None) + .SyncProjectCorporaAsync(User01, buildConfig, CancellationToken.None) .Returns(Task.FromResult>([])); var translationBuildConfig = new TranslationBuildConfig(); env.Service.Configure() @@ -723,7 +539,6 @@ public async Task BuildProjectAsync_PreTranslationBuild() await env.Service.BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ); @@ -734,60 +549,6 @@ await env .StartBuildAsync(TranslationEngine01, translationBuildConfig, CancellationToken.None); } - [Test] - public async Task BuildProjectAsync_SmtTranslationBuild() - { - // Set up test environment - var env = new TestEnvironment(); - var servalData = new ServalData - { - TranslationEngineId = TranslationEngine01, - TranslationJobId = Job01, - TranslationQueuedAt = DateTime.UtcNow, - }; - await env.SetupProjectSecretAsync(Project01, servalData); - var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .RemoveLegacyServalDataAsync(Project01, preTranslate: false, CancellationToken.None) - .Returns(Task.CompletedTask); - env.Service.Configure() - .EnsureTranslationEngineExistsAsync( - User01, - Arg.Any>(), - Arg.Any(), - preTranslate: false, - useEcho: false, - CancellationToken.None - ) - .Returns(Task.FromResult(TranslationEngine01)); - env.Service.Configure() - .RecreateOrUpdateTranslationEngineIfRequiredAsync( - TranslationEngine01, - Arg.Any(), - preTranslate: false, - useEcho: false, - CancellationToken.None - ) - .Returns(Task.CompletedTask); - env.Service.Configure() - .SyncProjectCorporaAsync(User01, buildConfig, preTranslate: false, CancellationToken.None) - .Returns(Task.FromResult>([])); - - // SUT - await env.Service.BuildProjectAsync( - User01, - buildConfig, - preTranslate: false, - draftGenerationRequestId: null, - cancellationToken: CancellationToken.None - ); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationJobId); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationQueuedAt); - await env - .TranslationEnginesClient.Received(1) - .StartBuildAsync(TranslationEngine01, Arg.Any(), CancellationToken.None); - } - [Test] public async Task BuildProjectAsync_ThrowsExceptionWhenProjectMissing() { @@ -800,7 +561,6 @@ public async Task BuildProjectAsync_ThrowsExceptionWhenProjectMissing() env.Service.BuildProjectAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: false, draftGenerationRequestId: null, CancellationToken.None ) @@ -819,7 +579,6 @@ public async Task BuildProjectAsync_ThrowsExceptionWhenProjectSecretMissing() env.Service.BuildProjectAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: false, draftGenerationRequestId: null, CancellationToken.None ) @@ -837,7 +596,6 @@ public void BuildProjectAsync_ThrowsExceptionWhenSourceProjectMissing() env.Service.BuildProjectAsync( User01, new BuildConfig { ProjectId = Project04 }, - preTranslate: false, draftGenerationRequestId: null, CancellationToken.None ) @@ -852,15 +610,11 @@ public async Task BuildProjectAsync_CreatesActivityWithDraftGenerationRequestId( var buildConfig = new BuildConfig { ProjectId = Project01 }; const string draftGenerationRequestId = "test-draft-generation-request-id"; - env.Service.Configure() - .RemoveLegacyServalDataAsync(Project01, preTranslate: true, CancellationToken.None) - .Returns(Task.CompletedTask); env.Service.Configure() .EnsureTranslationEngineExistsAsync( User01, Arg.Any>(), Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -869,18 +623,17 @@ public async Task BuildProjectAsync_CreatesActivityWithDraftGenerationRequestId( .RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) .Returns(Task.CompletedTask); env.Service.Configure() - .SyncProjectCorporaAsync(User01, buildConfig, preTranslate: true, CancellationToken.None) + .SyncProjectCorporaAsync(User01, buildConfig, CancellationToken.None) .Returns(Task.FromResult>([])); Activity? capturedActivity = null; env.Service.Configure() - .SyncProjectCorporaAsync(User01, buildConfig, preTranslate: true, CancellationToken.None) + .SyncProjectCorporaAsync(User01, buildConfig, CancellationToken.None) .Returns(callInfo => { // Capture the Activity during execution to verify it has the tag @@ -893,13 +646,7 @@ public async Task BuildProjectAsync_CreatesActivityWithDraftGenerationRequestId( activity.Start(); // SUT - await env.Service.BuildProjectAsync( - User01, - buildConfig, - preTranslate: true, - draftGenerationRequestId, - CancellationToken.None - ); + await env.Service.BuildProjectAsync(User01, buildConfig, draftGenerationRequestId, CancellationToken.None); activity.Stop(); @@ -921,15 +668,11 @@ public async Task BuildProjectAsync_ThrowsExceptionWhenServalDataMissing() var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, null); var buildConfig = new BuildConfig { ProjectId = Project01 }; - env.Service.Configure() - .RemoveLegacyServalDataAsync(Project01, preTranslate: true, CancellationToken.None) - .Returns(Task.CompletedTask); env.Service.Configure() .EnsureTranslationEngineExistsAsync( User01, Arg.Any>(), Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -938,13 +681,12 @@ public async Task BuildProjectAsync_ThrowsExceptionWhenServalDataMissing() .RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, Arg.Any(), - preTranslate: true, useEcho: false, CancellationToken.None ) .Returns(Task.CompletedTask); env.Service.Configure() - .SyncProjectCorporaAsync(User01, buildConfig, preTranslate: true, CancellationToken.None) + .SyncProjectCorporaAsync(User01, buildConfig, CancellationToken.None) .Returns(Task.FromResult>([])); // SUT @@ -952,7 +694,6 @@ public async Task BuildProjectAsync_ThrowsExceptionWhenServalDataMissing() env.Service.BuildProjectAsync( User01, buildConfig, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ) @@ -974,7 +715,6 @@ await env.Projects.UpdateAsync( await env.Service.BuildProjectAsync( User01, new BuildConfig { ProjectId = Project02 }, - preTranslate: true, draftGenerationRequestId: null, cancellationToken: CancellationToken.None ); @@ -982,7 +722,7 @@ await env .TranslationEnginesClient.Received() .StartBuildAsync( TranslationEngine01, - Arg.Is(b => ((int)((JObject)b.Options)["max_steps"]) == 35), + Arg.Is(b => (int)((JObject?)b.Options)!["max_steps"]! == 35), CancellationToken.None ); } @@ -1075,12 +815,7 @@ public async Task CreateServalProjectAsync_ExistingPreTranslationProject() await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: true, - useEcho: false, - CancellationToken.None - ); + string actual = await env.Service.CreateServalProjectAsync(project, useEcho: false, CancellationToken.None); Assert.AreEqual(TranslationEngine01, actual); await env.TranslationEnginesClient.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any()); } @@ -1092,144 +827,70 @@ public async Task CreateServalProjectAsync_ExistingServalDataInProjectSecretsFor var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData()); var project = new SFProject { Id = Project01 }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns("de"); + env.Service.Configure().GetSourceLanguage(project).Returns("en"); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns("de"); env.TranslationEnginesClient.CreateAsync(Arg.Any()) .Returns(Task.FromResult(new TranslationEngine { Id = TranslationEngine01 })); // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: true, - useEcho: false, - CancellationToken.None - ); + string actual = await env.Service.CreateServalProjectAsync(project, useEcho: false, CancellationToken.None); Assert.AreEqual(TranslationEngine01, actual); Assert.AreEqual(TranslationEngine01, env.ProjectSecrets.Get(Project01).ServalData?.PreTranslationEngineId); } [Test] - public async Task CreateServalProjectAsync_ExistingServalDataInProjectSecretsForSmtTranslation() + public async Task CreateServalProjectAsync_NoServalDataInProjectSecretsForPreTranslation() { // Set up test environment var env = new TestEnvironment(); - await env.SetupProjectSecretAsync(Project01, new ServalData()); var project = new SFProject { Id = Project01 }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: false).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: false, useEcho: false).Returns("de"); + env.Service.Configure().GetSourceLanguage(project).Returns("en"); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns("de"); env.TranslationEnginesClient.CreateAsync(Arg.Any()) .Returns(Task.FromResult(new TranslationEngine { Id = TranslationEngine01 })); // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: false, - useEcho: false, - CancellationToken.None - ); + string actual = await env.Service.CreateServalProjectAsync(project, useEcho: false, CancellationToken.None); Assert.AreEqual(TranslationEngine01, actual); - Assert.AreEqual(TranslationEngine01, env.ProjectSecrets.Get(Project01).ServalData?.TranslationEngineId); + Assert.AreEqual(TranslationEngine01, env.ProjectSecrets.Get(Project01).ServalData?.PreTranslationEngineId); } [Test] - public async Task CreateServalProjectAsync_ExistingSmtTranslationProject() + public void CreateServalProjectAsync_NoTranslationEngineIdFromServal() { // Set up test environment var env = new TestEnvironment(); var project = new SFProject { Id = Project01 }; - await env.SetupProjectSecretAsync(Project01, new ServalData { TranslationEngineId = TranslationEngine01 }); + env.Service.Configure().GetSourceLanguage(project).Returns("en"); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns("de"); + env.TranslationEnginesClient.CreateAsync(Arg.Any()) + .Returns(Task.FromResult(new TranslationEngine())); // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: false, - useEcho: false, - CancellationToken.None + Assert.ThrowsAsync(() => + env.Service.CreateServalProjectAsync(project, useEcho: false, CancellationToken.None) ); - Assert.AreEqual(TranslationEngine01, actual); - await env.TranslationEnginesClient.DidNotReceiveWithAnyArgs().CreateAsync(Arg.Any()); } [Test] - public async Task CreateServalProjectAsync_NoServalDataInProjectSecretsForPreTranslation() + public async Task CreateZipFileFromParatextDirectoryAsync_DoesNotCrashWhenFileNotFound() { - // Set up test environment + // Set up test environment with two files, one will be invalid var env = new TestEnvironment(); - var project = new SFProject { Id = Project01 }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns("de"); - env.TranslationEnginesClient.CreateAsync(Arg.Any()) - .Returns(Task.FromResult(new TranslationEngine { Id = TranslationEngine01 })); + MemoryStream outputStream = new MemoryStream(); + env.FileSystemService.EnumerateFiles(Arg.Any()) + .Returns(callInfo => + [Path.Join(callInfo.ArgAt(0), "file"), Path.Join(callInfo.ArgAt(0), "invalid_file")] + ); + var ex = new FileNotFoundException(); + env.FileSystemService.OpenFile(Arg.Is(f => f.EndsWith("invalid_file")), FileMode.Open).Throws(ex); // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: true, - useEcho: false, - CancellationToken.None - ); - Assert.AreEqual(TranslationEngine01, actual); - Assert.AreEqual(TranslationEngine01, env.ProjectSecrets.Get(Project01).ServalData?.PreTranslationEngineId); - } - - [Test] - public async Task CreateServalProjectAsync_NoServalDataInProjectSecretsForSmtTranslation() - { - // Set up test environment - var env = new TestEnvironment(); - var project = new SFProject { Id = Project01 }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: false).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: false, useEcho: false).Returns("de"); - env.TranslationEnginesClient.CreateAsync(Arg.Any()) - .Returns(Task.FromResult(new TranslationEngine { Id = TranslationEngine01 })); - - // SUT - string actual = await env.Service.CreateServalProjectAsync( - project, - preTranslate: false, - useEcho: false, - CancellationToken.None - ); - Assert.AreEqual(TranslationEngine01, actual); - Assert.AreEqual(TranslationEngine01, env.ProjectSecrets.Get(Project01).ServalData?.TranslationEngineId); - } - - [Test] - public void CreateServalProjectAsync_NoTranslationEngineIdFromServal() - { - // Set up test environment - var env = new TestEnvironment(); - var project = new SFProject { Id = Project01 }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns("de"); - env.TranslationEnginesClient.CreateAsync(Arg.Any()) - .Returns(Task.FromResult(new TranslationEngine())); - - // SUT - Assert.ThrowsAsync(() => - env.Service.CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None) - ); - } - - [Test] - public async Task CreateZipFileFromParatextDirectoryAsync_DoesNotCrashWhenFileNotFound() - { - // Set up test environment with two files, one will be invalid - var env = new TestEnvironment(); - MemoryStream outputStream = new MemoryStream(); - env.FileSystemService.EnumerateFiles(Arg.Any()) - .Returns(callInfo => - [Path.Join(callInfo.ArgAt(0), "file"), Path.Join(callInfo.ArgAt(0), "invalid_file")] - ); - var ex = new FileNotFoundException(); - env.FileSystemService.OpenFile(Arg.Is(f => f.EndsWith("invalid_file")), FileMode.Open).Throws(ex); - - // SUT - await env.Service.CreateZipFileFromParatextDirectoryAsync(Project01, outputStream, CancellationToken.None); + await env.Service.CreateZipFileFromParatextDirectoryAsync(Project01, outputStream, CancellationToken.None); // Validate the zip file outputStream.Seek(0, SeekOrigin.Begin); - using var archive = new ZipArchive(outputStream, ZipArchiveMode.Read); + await using var archive = new ZipArchive(outputStream, ZipArchiveMode.Read); Assert.AreEqual(1, archive.Entries.Count); Assert.AreEqual("file", archive.Entries[0].FullName); env.MockLogger.AssertHasEvent(logEvent => logEvent.Exception == ex && logEvent.LogLevel == LogLevel.Warning); @@ -1247,7 +908,7 @@ public async Task CreateZipFileFromParatextDirectoryAsync_Success() // Validate the zip file outputStream.Seek(0, SeekOrigin.Begin); - using var archive = new ZipArchive(outputStream, ZipArchiveMode.Read); + await using var archive = new ZipArchive(outputStream, ZipArchiveMode.Read); Assert.AreEqual(1, archive.Entries.Count); Assert.AreEqual("file", archive.Entries[0].FullName); } @@ -1330,7 +991,7 @@ public async Task EnsureTranslationEngineExistsAsync_PreTranslationEngineAlready var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(true)); // Retrieve required objects @@ -1344,7 +1005,6 @@ public async Task EnsureTranslationEngineExistsAsync_PreTranslationEngineAlready User01, projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ); @@ -1358,7 +1018,7 @@ public async Task EnsureTranslationEngineExistsAsync_ProjectDeletedBeforeExecuti var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(false)); // Retrieve required objects @@ -1374,7 +1034,6 @@ public async Task EnsureTranslationEngineExistsAsync_ProjectDeletedBeforeExecuti User01, projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -1389,7 +1048,7 @@ public async Task EnsureTranslationEngineExistsAsync_ProjectDeletedDuringExecuti var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(false)); // Retrieve required objects @@ -1409,7 +1068,6 @@ public async Task EnsureTranslationEngineExistsAsync_ProjectDeletedDuringExecuti User01, projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -1417,52 +1075,19 @@ public async Task EnsureTranslationEngineExistsAsync_ProjectDeletedDuringExecuti env.ParatextService.Received(1).GetWritingSystem(Arg.Any(), Arg.Any()); } - [Test] - public async Task EnsureTranslationEngineExistsAsync_ProjectSourceRemoved() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); - env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: false, CancellationToken.None) - .Returns(Task.FromResult(false)); - - // Retrieve required objects - await using IConnection connection = await env.RealtimeService.ConnectAsync(); - IDocument projectDoc = connection.Get(Project03); - await projectDoc.FetchAsync(); - await projectDoc.SubmitJson0OpAsync(op => op.Unset(p => p.TranslateConfig.Source)); - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project03); - - // SUT - Assert.ThrowsAsync(() => - env.Service.EnsureTranslationEngineExistsAsync( - User01, - projectDoc, - projectSecret, - preTranslate: false, - useEcho: false, - CancellationToken.None - ) - ); - } - [Test] public async Task EnsureTranslationEngineExistsAsync_SetsUpTheProjectAndTranslationEngineForPreTranslation() { // Set up test environment var env = new TestEnvironment(); - const string sourceLanguage = "en"; const string targetLanguage = "fr"; await env.SetupProjectSecretAsync(Project03, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project03, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project03, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(false)); env.Service.Configure() - .CreateServalProjectAsync(Arg.Any(), preTranslate: true, useEcho: false, CancellationToken.None) + .CreateServalProjectAsync(Arg.Any(), useEcho: false, CancellationToken.None) .Returns(Task.FromResult(TranslationEngine02)); - env.ParatextService.GetWritingSystem(Arg.Any(), Paratext01) - .Returns(new WritingSystem { Tag = sourceLanguage }); env.ParatextService.GetWritingSystem(Arg.Any(), Paratext03) .Returns(new WritingSystem { Tag = targetLanguage }); @@ -1477,134 +1102,26 @@ public async Task EnsureTranslationEngineExistsAsync_SetsUpTheProjectAndTranslat User01, projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ); Assert.AreEqual(TranslationEngine02, actual); Assert.IsNull(env.ProjectSecrets.Get(Project03).ServalData?.PreTranslationEngineId); - Assert.AreEqual(sourceLanguage, env.Projects.Get(Project03).TranslateConfig.Source?.WritingSystem.Tag); Assert.AreEqual(targetLanguage, env.Projects.Get(Project03).WritingSystem.Tag); } [Test] - public async Task EnsureTranslationEngineExistsAsync_SetsUpTheProjectAndTranslationEngineForPreTranslationWithNoSource() + public async Task EnsureTranslationEngineExistsAsync_PreTranslationEngineCouldNotBeCreated() { // Set up test environment var env = new TestEnvironment(); - const string targetLanguage = "fr"; - await env.SetupProjectSecretAsync(Project03, new ServalData { PreTranslationEngineId = TranslationEngine01 }); - env.Service.Configure() - .TranslationEngineExistsAsync(Project03, TranslationEngine01, preTranslate: true, CancellationToken.None) - .Returns(Task.FromResult(false)); - env.Service.Configure() - .CreateServalProjectAsync(Arg.Any(), preTranslate: true, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(TranslationEngine02)); - env.ParatextService.GetWritingSystem(Arg.Any(), Paratext03) - .Returns(new WritingSystem { Tag = targetLanguage }); - - // Retrieve required objects, and remove the source - await using IConnection connection = await env.RealtimeService.ConnectAsync(); - IDocument projectDoc = connection.Get(Project03); - await projectDoc.FetchAsync(); - await projectDoc.SubmitJson0OpAsync(op => op.Unset(p => p.TranslateConfig.Source)); - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project03); - - // SUT - string actual = await env.Service.EnsureTranslationEngineExistsAsync( - User01, - projectDoc, - projectSecret, - preTranslate: true, - useEcho: false, - CancellationToken.None - ); - Assert.AreEqual(TranslationEngine02, actual); - Assert.IsNull(env.ProjectSecrets.Get(Project03).ServalData?.PreTranslationEngineId); - Assert.AreEqual(targetLanguage, env.Projects.Get(Project03).WritingSystem.Tag); - } - - [Test] - public async Task EnsureTranslationEngineExistsAsync_SetsUpTheProjectAndTranslationEngineForSmtTranslation() - { - // Set up test environment - var env = new TestEnvironment(); - const string sourceLanguage = "en"; - const string targetLanguage = "fr"; - await env.SetupProjectSecretAsync(Project03, new ServalData { TranslationEngineId = TranslationEngine01 }); - env.Service.Configure() - .TranslationEngineExistsAsync(Project03, TranslationEngine01, preTranslate: false, CancellationToken.None) - .Returns(Task.FromResult(false)); - env.Service.Configure() - .CreateServalProjectAsync(Arg.Any(), preTranslate: false, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(TranslationEngine02)); - env.ParatextService.GetWritingSystem(Arg.Any(), Paratext01) - .Returns(new WritingSystem { Tag = sourceLanguage }); - env.ParatextService.GetWritingSystem(Arg.Any(), Paratext03) - .Returns(new WritingSystem { Tag = targetLanguage }); - - // Retrieve required objects - await using IConnection connection = await env.RealtimeService.ConnectAsync(); - IDocument projectDoc = connection.Get(Project03); - await projectDoc.FetchAsync(); - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project03); - - // SUT - string actual = await env.Service.EnsureTranslationEngineExistsAsync( - User01, - projectDoc, - projectSecret, - preTranslate: false, - useEcho: false, - CancellationToken.None - ); - Assert.AreEqual(TranslationEngine02, actual); - Assert.IsNull(env.ProjectSecrets.Get(Project03).ServalData?.TranslationEngineId); - Assert.AreEqual(sourceLanguage, env.Projects.Get(Project03).TranslateConfig.Source?.WritingSystem.Tag); - Assert.AreEqual(targetLanguage, env.Projects.Get(Project03).WritingSystem.Tag); - Assert.IsFalse(env.Projects.Get(Project03).TranslateConfig.PreTranslate); - } - - [Test] - public async Task EnsureTranslationEngineExistsAsync_SmtTranslationEngineAlreadyExists() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync(Project01, new ServalData { TranslationEngineId = TranslationEngine01 }); - env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: false, CancellationToken.None) - .Returns(Task.FromResult(true)); - - // Retrieve required objects - await using IConnection connection = await env.RealtimeService.ConnectAsync(); - IDocument projectDoc = connection.Get(Project01); - await projectDoc.FetchAsync(); - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project01); - - // SUT - string actual = await env.Service.EnsureTranslationEngineExistsAsync( - User01, - projectDoc, - projectSecret, - preTranslate: false, - useEcho: false, - CancellationToken.None - ); - Assert.AreEqual(TranslationEngine01, actual); - } - - [Test] - public async Task EnsureTranslationEngineExistsAsync_TranslationEngineCouldNotBeCreated() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync(Project01, new ServalData { TranslationEngineId = TranslationEngine01 }); + await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(false)); env.Service.Configure() - .CreateServalProjectAsync(Arg.Any(), preTranslate: true, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(null)); + .CreateServalProjectAsync(Arg.Any(), useEcho: false, CancellationToken.None) + .Returns(Task.FromResult(string.Empty)); // Retrieve required objects await using IConnection connection = await env.RealtimeService.ConnectAsync(); @@ -1618,7 +1135,6 @@ public async Task EnsureTranslationEngineExistsAsync_TranslationEngineCouldNotBe User01, projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -1633,7 +1149,7 @@ public async Task EnsureTranslationEngineExistsAsync_UserSecretDoesNotExist() var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); env.Service.Configure() - .TranslationEngineExistsAsync(Project01, TranslationEngine01, preTranslate: true, CancellationToken.None) + .TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) .Returns(Task.FromResult(false)); // Retrieve required objects @@ -1648,7 +1164,6 @@ public async Task EnsureTranslationEngineExistsAsync_UserSecretDoesNotExist() "invalid_user_id", projectDoc, projectSecret, - preTranslate: true, useEcho: false, CancellationToken.None ) @@ -1662,7 +1177,7 @@ public async Task GetCorpusIdFromServalAsync_Null() var env = new TestEnvironment(); // SUT - string actual = await env.Service.GetCorpusIdFromServalAsync(corpusId: null, CancellationToken.None); + string? actual = await env.Service.GetCorpusIdFromServalAsync(corpusId: null, CancellationToken.None); Assert.IsNull(actual); } @@ -1674,7 +1189,7 @@ public async Task GetCorpusIdFromServalAsync_Missing() env.CorporaClient.GetAsync(Corpus01, CancellationToken.None).ThrowsAsync(ServalApiExceptions.NotFound); // SUT - string actual = await env.Service.GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None); + string? actual = await env.Service.GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None); Assert.IsNull(actual); } @@ -1687,7 +1202,7 @@ public async Task GetCorpusIdFromServalAsync_Success() .Returns(Task.FromResult(new Corpus { Id = Corpus01 })); // SUT - string actual = await env.Service.GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None); + string? actual = await env.Service.GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None); Assert.AreEqual(Corpus01, actual); } @@ -1720,14 +1235,14 @@ public void GetProjectZipAsync_ThrowsExceptionWhenProjectDocumentMissing() } [Test] - public void GetSourceLanguage_ThrowsExceptionWhenProjectDoesNotHaveASource() + public void GetSourceLanguage_ThrowsExceptionWhenProjectDoesNotHaveADraftingSource() { // Set up test environment var env = new TestEnvironment(); - var project = new SFProject { TranslateConfig = { Source = null } }; + var project = new SFProject(); // SUT - Assert.Throws(() => env.Service.GetSourceLanguage(project, preTranslate: false)); + Assert.Throws(() => env.Service.GetSourceLanguage(project)); } [Test] @@ -1737,7 +1252,7 @@ public void GetSourceLanguage_ThrowsExceptionWhenProjectNull() var env = new TestEnvironment(); // SUT - Assert.Throws(() => env.Service.GetSourceLanguage(null, preTranslate: true)); + Assert.Throws(() => env.Service.GetSourceLanguage(null)); } [Test] @@ -1757,25 +1272,11 @@ public void GetSourceLanguage_ThrowsExceptionWhenTheDraftingSourceDoesNotHaveAWr }; // SUT - Assert.Throws(() => env.Service.GetSourceLanguage(project, preTranslate: true)); - } - - [Test] - public void GetSourceLanguage_ThrowsExceptionWhenTheSourceDoesNotHaveAWritingTag() - { - // Set up test environment - var env = new TestEnvironment(); - var project = new SFProject - { - TranslateConfig = { Source = new TranslateSource { WritingSystem = new WritingSystem { Tag = null } } }, - }; - - // SUT - Assert.Throws(() => env.Service.GetSourceLanguage(project, preTranslate: false)); + Assert.Throws(() => env.Service.GetSourceLanguage(project)); } [Test] - public void GetSourceLanguage_UsesTheDraftingSourceIfPreTranslateIsTrue() + public void GetSourceLanguage_UsesTheDraftingSource() { // Set up test environment var env = new TestEnvironment(); @@ -1800,40 +1301,10 @@ public void GetSourceLanguage_UsesTheDraftingSourceIfPreTranslateIsTrue() }; // SUT - string actual = env.Service.GetSourceLanguage(project, preTranslate: true); + string actual = env.Service.GetSourceLanguage(project); Assert.AreEqual(draftingSourceWritingSystemTag, actual); } - [Test] - public void GetSourceLanguage_UsesTheSourceIfPreTranslateIsFalse() - { - // Set up test environment - var env = new TestEnvironment(); - const string draftingSourceWritingSystemTag = "drafting_source_writing_system_tag"; - const string sourceWritingSystemTag = "source_writing_system_tag"; - var project = new SFProject - { - TranslateConfig = - { - DraftConfig = new DraftConfig - { - DraftingSources = - [ - new TranslateSource - { - WritingSystem = new WritingSystem { Tag = draftingSourceWritingSystemTag }, - }, - ], - }, - Source = new TranslateSource { WritingSystem = new WritingSystem { Tag = sourceWritingSystemTag } }, - }, - }; - - // SUT - string actual = env.Service.GetSourceLanguage(project, preTranslate: false); - Assert.AreEqual(sourceWritingSystemTag, actual); - } - [Test] public void GetTextFileData_Success() { @@ -1854,10 +1325,10 @@ public void GetTargetLanguage_ReturnSourceIfEcho() var env = new TestEnvironment(); const string sourceWritingSystemTag = "source_writing_system_tag"; var project = new SFProject(); - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(sourceWritingSystemTag); + env.Service.Configure().GetSourceLanguage(project).Returns(sourceWritingSystemTag); // SUT - string actual = env.Service.GetTargetLanguage(project, preTranslate: true, useEcho: true); + string actual = env.Service.GetTargetLanguage(project, useEcho: true); Assert.AreEqual(sourceWritingSystemTag, actual); } @@ -1870,7 +1341,7 @@ public void GetTargetLanguage_Success() var project = new SFProject { WritingSystem = new WritingSystem { Tag = targetWritingSystemTag } }; // SUT - string actual = env.Service.GetTargetLanguage(project, preTranslate: true, useEcho: false); + string actual = env.Service.GetTargetLanguage(project, useEcho: false); Assert.AreEqual(targetWritingSystemTag, actual); } @@ -1887,7 +1358,7 @@ public void GetTranslationBuildConfig_AddsTagForDev() new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(MachineProjectService.TagDevelopment, (string)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(MachineProjectService.TagDevelopment, (string?)(actual.Options as JObject)?["tags"]); } [Test] @@ -1903,7 +1374,7 @@ public void GetTranslationBuildConfig_AddsTagForTest() new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(MachineProjectService.TagTest, (string)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(MachineProjectService.TagTest, (string?)(actual.Options as JObject)?["tags"]); } [Test] @@ -1919,7 +1390,7 @@ public void GetTranslationBuildConfig_AddsTagForStaging() new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(MachineProjectService.TagStaging, (string)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(MachineProjectService.TagStaging, (string?)(actual.Options as JObject)?["tags"]); } [Test] @@ -1935,7 +1406,7 @@ public void GetTranslationBuildConfig_AddsTagForProduction() new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(MachineProjectService.TagProduction, (string)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(MachineProjectService.TagProduction, (string?)(actual.Options as JObject)?["tags"]); } [Test] @@ -1952,7 +1423,7 @@ public void GetTranslationBuildConfig_DoesNotAddTagIfAlreadyInServalConfigAsArra new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(new JArray(MachineProjectService.TagProduction), (JArray)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(new JArray(MachineProjectService.TagProduction), (JArray?)(actual.Options as JObject)?["tags"]); } [Test] @@ -1969,7 +1440,7 @@ public void GetTranslationBuildConfig_DoesNotReplaceTagIfAlreadyInServalConfigAs new BuildConfig(), corporaSyncInfo: [] ); - Assert.AreEqual(MachineProjectService.TagProduction, (string)(actual.Options as JObject)?["tags"]); + Assert.AreEqual(MachineProjectService.TagProduction, (string?)(actual.Options as JObject)?["tags"]); } [Test] @@ -2013,7 +1484,7 @@ public void GetTranslationBuildConfig_MergesFastTrainingConfiguration() buildConfig, corporaSyncInfo: [] ); - Assert.AreEqual(20, (int)(actual.Options as JObject)?["max_steps"]); + Assert.AreEqual(20, (int?)(actual.Options as JObject)?["max_steps"]); } [Test] @@ -2033,7 +1504,7 @@ public void GetTranslationBuildConfig_MergesTagFromServalConfig() ); Assert.AreEqual( new JArray(tag, MachineProjectService.TagProduction), - (JArray)(actual.Options as JObject)?["tags"] + (JArray?)(actual.Options as JObject)?["tags"] ); } @@ -2055,7 +1526,7 @@ public void GetTranslationBuildConfig_MergesTagsFromServalConfig() ); Assert.AreEqual( new JArray(tag1, tag2, MachineProjectService.TagProduction), - (JArray)(actual.Options as JObject)?["tags"] + (JArray?)(actual.Options as JObject)?["tags"] ); } @@ -2140,7 +1611,7 @@ public void GetTranslationBuildConfig_PassesFastTrainingConfiguration() buildConfig, corporaSyncInfo: [] ); - Assert.AreEqual(20, (int)(actual.Options as JObject)?["max_steps"]); + Assert.AreEqual(20, (int?)(actual.Options as JObject)?["max_steps"]); } [Test] @@ -2159,7 +1630,7 @@ public void GetTranslationBuildConfig_PassesServalConfig() buildConfig, corporaSyncInfo: [] ); - Assert.AreEqual(35, (int)(actual.Options as JObject)?["max_steps"]); + Assert.AreEqual(35, (int?)(actual.Options as JObject)?["max_steps"]); } [Test] @@ -2346,17 +1817,15 @@ public void GetTranslationBuildConfig_UsesExplicitTargetTrainingScriptureRange() ); } - [TestCase(false, false, MachineProjectService.SmtTransfer)] - [TestCase(false, true, MachineProjectService.SmtTransfer)] - [TestCase(true, false, MachineProjectService.Nmt)] - [TestCase(true, true, MachineProjectService.Echo)] - public void GetTranslationEngineType(bool preTranslate, bool useEcho, string expected) + [TestCase(false, MachineProjectService.Nmt)] + [TestCase(true, MachineProjectService.Echo)] + public void GetTranslationEngineType(bool useEcho, string expected) { // Set up test environment var env = new TestEnvironment(); // SUT - var actual = env.Service.GetTranslationEngineType(preTranslate, useEcho); + var actual = env.Service.GetTranslationEngineType(useEcho); Assert.AreEqual(expected, actual); } @@ -2368,14 +1837,12 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_DoNotRecreate var project = new SFProject { Id = Project01 }; const string targetLanguage = "en"; const string sourceLanguage = "de"; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(sourceLanguage); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns(targetLanguage); + env.Service.Configure().GetSourceLanguage(project).Returns(sourceLanguage); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns(targetLanguage); env.Service.Configure() - .CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None) + .CreateServalProjectAsync(project, useEcho: false, CancellationToken.None) .Returns(Task.FromResult(string.Empty)); - env.Service.Configure() - .RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None) - .Returns(Task.CompletedTask); + env.Service.Configure().RemoveProjectAsync(Project01, CancellationToken.None).Returns(Task.CompletedTask); env.TranslationEnginesClient.GetAsync(TranslationEngine01) .Returns( Task.FromResult( @@ -2393,16 +1860,13 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_DoNotRecreate await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, project, - preTranslate: true, useEcho: false, CancellationToken.None ); + await env.Service.DidNotReceiveWithAnyArgs().RemoveProjectAsync(Project01, CancellationToken.None); await env .Service.DidNotReceiveWithAnyArgs() - .RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); - await env - .Service.DidNotReceiveWithAnyArgs() - .CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None); + .CreateServalProjectAsync(project, useEcho: false, CancellationToken.None); } [Test] @@ -2414,8 +1878,8 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_UpdateIfTheSo const string targetLanguage = "en"; const string oldSourceLanguage = "de"; const string newSourceLanguage = "fr"; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(oldSourceLanguage); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns(targetLanguage); + env.Service.Configure().GetSourceLanguage(project).Returns(oldSourceLanguage); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns(targetLanguage); env.TranslationEnginesClient.GetAsync(TranslationEngine01) .Returns( Task.FromResult( @@ -2433,7 +1897,6 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_UpdateIfTheSo await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, project, - preTranslate: true, useEcho: false, CancellationToken.None ); @@ -2451,10 +1914,8 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_UpdateIfTheTa const string oldTargetLanguage = "en"; const string newTargetLanguage = "fr"; const string sourceLanguage = "de"; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(sourceLanguage); - env.Service.Configure() - .GetTargetLanguage(project, preTranslate: true, useEcho: false) - .Returns(newTargetLanguage); + env.Service.Configure().GetSourceLanguage(project).Returns(sourceLanguage); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns(newTargetLanguage); env.TranslationEnginesClient.GetAsync(TranslationEngine01) .Returns( Task.FromResult( @@ -2472,7 +1933,6 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_UpdateIfTheTa await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, project, - preTranslate: true, useEcho: false, CancellationToken.None ); @@ -2490,7 +1950,7 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_RecreatePreTr var project = new SFProject { Id = Project01 }; ServalApiException ex = ServalApiExceptions.NotFound; env.Service.Configure() - .CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None) + .CreateServalProjectAsync(project, useEcho: false, CancellationToken.None) .Returns(Task.FromResult(string.Empty)); env.TranslationEnginesClient.GetAsync(TranslationEngine01).ThrowsAsync(ex); @@ -2498,14 +1958,11 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_RecreatePreTr await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( TranslationEngine01, project, - preTranslate: true, useEcho: false, CancellationToken.None ); Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.PreTranslationEngineId); - await env - .Service.Received(1) - .CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None); + await env.Service.Received(1).CreateServalProjectAsync(project, useEcho: false, CancellationToken.None); env.MockLogger.AssertHasEvent(l => l.Exception == ex && l.LogLevel == LogLevel.Information); } @@ -2516,357 +1973,41 @@ public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_RecreatePreTr var env = new TestEnvironment(); await env.SetupProjectSecretAsync(Project01, new ServalData { PreTranslationEngineId = TranslationEngine01 }); var project = new SFProject { Id = Project01 }; - const string oldTargetLanguage = "en"; - const string newTargetLanguage = "fr"; - const string sourceLanguage = "de"; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(sourceLanguage); - env.Service.Configure() - .GetTargetLanguage(project, preTranslate: true, useEcho: false) - .Returns(newTargetLanguage); - env.Service.Configure() - .CreateServalProjectAsync(project, preTranslate: true, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(string.Empty)); - env.Service.Configure() - .RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None) - .Returns(Task.CompletedTask); - env.TranslationEnginesClient.GetAsync(TranslationEngine01) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine01, - SourceLanguage = sourceLanguage, - TargetLanguage = oldTargetLanguage, - Type = MachineProjectService.Nmt, - } - ) - ); - - // SUT - await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( - TranslationEngine01, - project, - preTranslate: true, - useEcho: true, - CancellationToken.None - ); - await env.Service.Received(1).RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); - await env - .Service.Received(1) - .CreateServalProjectAsync(project, preTranslate: true, useEcho: true, CancellationToken.None); - } - - [Test] - public async Task RecreateOrUpdateTranslationEngineIfRequiredAsync_RecreateSmtTranslationEngineIfNotFound() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync(Project01, new ServalData { TranslationEngineId = TranslationEngine01 }); - var project = new SFProject { Id = Project01 }; - ServalApiException ex = ServalApiExceptions.NotFound; - env.Service.Configure() - .CreateServalProjectAsync(project, preTranslate: false, useEcho: false, CancellationToken.None) - .Returns(Task.FromResult(string.Empty)); - env.TranslationEnginesClient.GetAsync(TranslationEngine01).ThrowsAsync(ex); - - // SUT - await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( - TranslationEngine01, - project, - preTranslate: false, - useEcho: false, - CancellationToken.None - ); - Assert.IsNull(env.ProjectSecrets.Get(Project01).ServalData!.TranslationEngineId); - await env - .Service.Received(1) - .CreateServalProjectAsync(project, preTranslate: false, useEcho: false, CancellationToken.None); - env.MockLogger.AssertHasEvent(l => l.Exception == ex && l.LogLevel == LogLevel.Information); - } - - [Test] - [Obsolete("Tests legacy corpora")] - public async Task RemoveLegacyServalDataAsync_DoesNotCallServalIfNoTranslationEngineId() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - await env.Service.RemoveLegacyServalDataAsync(Project01, preTranslate: false, CancellationToken.None); - - // Ensure that the corpus and its files were not deleted - await env - .TranslationEnginesClient.DidNotReceiveWithAnyArgs() - .DeleteCorpusAsync(TranslationEngine01, Corpus01, deleteFiles: true, CancellationToken.None); - } - - [Test] - [Obsolete("Tests legacy corpora")] - public async Task RemoveLegacyServalDataAsync_LogsAnErrorWhenAServalErrorOccurs() - { - // Set up test environment - var env = new TestEnvironment( - new TestEnvironmentOptions { HasTranslationEngineForSmt = true, LegacyCorpora = true } - ); - env.TranslationEnginesClient.DeleteCorpusAsync( - TranslationEngine02, - Corpus01, - deleteFiles: true, - CancellationToken.None - ) - .ThrowsAsync(ServalApiExceptions.InternalServerError); - - // SUT - await env.Service.RemoveLegacyServalDataAsync(Project02, preTranslate: false, CancellationToken.None); - - // Ensure that the corpus and its files were deleted - env.MockLogger.AssertHasEvent(l => l.LogLevel == LogLevel.Error && l.Message!.Contains(TranslationEngine02)); - } - - [Test] - [Obsolete("Tests legacy corpora")] - public async Task RemoveLegacyServalDataAsync_LogsAnEventWhenTheFileIsNotFound() - { - // Set up test environment - var env = new TestEnvironment( - new TestEnvironmentOptions { HasTranslationEngineForSmt = true, LegacyCorpora = true } - ); - env.TranslationEnginesClient.DeleteCorpusAsync( - TranslationEngine02, - Corpus01, - deleteFiles: true, - CancellationToken.None - ) - .ThrowsAsync(ServalApiExceptions.NotFound); - - // SUT - await env.Service.RemoveLegacyServalDataAsync(Project02, preTranslate: false, CancellationToken.None); - - // Ensure that the corpus and its files were deleted - env.MockLogger.AssertHasEvent(l => - l.LogLevel == LogLevel.Information && l.Message!.Contains(TranslationEngine02) - ); - } - - [Test] - [Obsolete("Tests legacy corpora")] - public async Task RemoveLegacyServalDataAsync_OnlyRemovesRelevantCorpora() - { - // Set up test environment - var env = new TestEnvironment( - new TestEnvironmentOptions { HasTranslationEngineForSmt = true, LegacyCorpora = true } - ); - - // Verify there are two corpora - Assert.AreEqual(2, env.ProjectSecrets.Get(Project02).ServalData!.Corpora!.Count); - - // SUT - await env.Service.RemoveLegacyServalDataAsync(Project02, preTranslate: false, CancellationToken.None); - - // Ensure that the corpus and its files were deleted - await env - .TranslationEnginesClient.Received(1) - .DeleteCorpusAsync(TranslationEngine02, Corpus01, deleteFiles: true, CancellationToken.None); - Assert.AreEqual(1, env.ProjectSecrets.Get(Project02).ServalData!.Corpora!.Count); - } - - [Test] - [Obsolete("Tests legacy corpora")] - public async Task RemoveLegacyServalDataAsync_RemovesCorporaPropertyIfNoMoreCorpora() - { - // Set up test environment - var env = new TestEnvironment(new TestEnvironmentOptions { LegacyCorpora = true }); - await env.SetDataInSync( - Project02, - preTranslate: true, - uploadParatextZipFile: true, - alternateTrainingSource: true - ); - - // Verify there are two corpora - Assert.AreEqual(2, env.ProjectSecrets.Get(Project02).ServalData!.Corpora!.Count); - - // SUT - await env.Service.RemoveLegacyServalDataAsync(Project02, preTranslate: true, CancellationToken.None); - - // Ensure that the corpus and its files were deleted - await env - .TranslationEnginesClient.Received(1) - .DeleteCorpusAsync(TranslationEngine02, Corpus01, deleteFiles: true, CancellationToken.None); - Assert.IsNull(env.ProjectSecrets.Get(Project02).ServalData?.Corpora); - } - - [Test] - public void RemoveLegacyServalDataAsync_ThrowsExceptionWhenProjectSecretMissing() - { - // Set up test environment - var env = new TestEnvironment(); - - // SUT - Assert.ThrowsAsync(() => - env.Service.RemoveLegacyServalDataAsync("invalid_project_id", preTranslate: false, CancellationToken.None) - ); - } - - [Test] - public async Task RemoveProjectAsync_DeletesPreTranslationEngineAndAllCorporaAndFilesIfNoSmt() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync( - Project01, - new ServalData - { - PreTranslationEngineId = TranslationEngine01, - ParallelCorpusIdForPreTranslate = ParallelCorpus01, - ParallelCorpusIdForTrainOn = ParallelCorpus02, - PreTranslationsRetrieved = true, - CorpusFiles = - [ - new ServalCorpusFile { CorpusId = Corpus01, FileId = File01 }, - new ServalCorpusFile { CorpusId = Corpus02, FileId = File02 }, - ], - AdditionalTrainingData = new ServalAdditionalTrainingData - { - SourceCorpusId = Corpus03, - TargetCorpusId = Corpus04, - CorpusFiles = - [ - new ServalCorpusFile { CorpusId = Corpus03, FileId = File03 }, - new ServalCorpusFile { CorpusId = Corpus04, FileId = File04 }, - ], - }, - } - ); - - // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); - - // Ensure that the pre-translation engine, additional training corpora and files are deleted - await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); - await env.CorporaClient.Received(1).DeleteAsync(Corpus01); - await env.CorporaClient.Received(1).DeleteAsync(Corpus02); - await env.CorporaClient.Received(1).DeleteAsync(Corpus03); - await env.CorporaClient.Received(1).DeleteAsync(Corpus04); - await env.DataFilesClient.Received(1).DeleteAsync(File01); - await env.DataFilesClient.Received(1).DeleteAsync(File02); - await env.DataFilesClient.Received(1).DeleteAsync(File03); - await env.DataFilesClient.Received(1).DeleteAsync(File04); - - // Verify that the project secret is correct - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project01); - Assert.IsNull(projectSecret.ServalData!.AdditionalTrainingData); - Assert.IsNull(projectSecret.ServalData!.PreTranslationEngineId); - Assert.IsNull(projectSecret.ServalData!.PreTranslationsRetrieved); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForPreTranslate); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForTrainOn); - Assert.IsEmpty(projectSecret.ServalData!.CorpusFiles); - } - - [Test] - public async Task RemoveProjectAsync_DeletesPreTranslationEngineOnly() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync( - Project01, - new ServalData - { - PreTranslationEngineId = TranslationEngine01, - ParallelCorpusIdForPreTranslate = ParallelCorpus01, - ParallelCorpusIdForTrainOn = ParallelCorpus02, - PreTranslationsRetrieved = true, - TranslationEngineId = TranslationEngine02, - ParallelCorpusIdForSmt = ParallelCorpus03, - CorpusFiles = - [ - new ServalCorpusFile { CorpusId = Corpus01, FileId = File01 }, - new ServalCorpusFile { CorpusId = Corpus02, FileId = File02 }, - ], - AdditionalTrainingData = new ServalAdditionalTrainingData - { - SourceCorpusId = Corpus03, - TargetCorpusId = Corpus04, - CorpusFiles = - [ - new ServalCorpusFile { CorpusId = Corpus03, FileId = File03 }, - new ServalCorpusFile { CorpusId = Corpus03, FileId = File04 }, - new ServalCorpusFile { CorpusId = Corpus04, FileId = File05 }, - new ServalCorpusFile { CorpusId = Corpus04, FileId = File06 }, - ], - }, - } - ); - - // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); - - // Ensure that the pre-translation engine, additional training corpora and files are deleted - await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); - await env.CorporaClient.Received(1).DeleteAsync(Corpus03); - await env.CorporaClient.Received(1).DeleteAsync(Corpus04); - await env.DataFilesClient.Received(1).DeleteAsync(File03); - await env.DataFilesClient.Received(1).DeleteAsync(File04); - await env.DataFilesClient.Received(1).DeleteAsync(File05); - await env.DataFilesClient.Received(1).DeleteAsync(File06); - - // Ensure that the SMT translation engine, shared corpora, and shared files are not deleted - await env.TranslationEnginesClient.DidNotReceive().DeleteAsync(TranslationEngine02); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus01); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus02); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File01); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File02); - - // Verify that the project secret is correct - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project01); - Assert.IsNull(projectSecret.ServalData!.AdditionalTrainingData); - Assert.IsNull(projectSecret.ServalData!.PreTranslationEngineId); - Assert.IsNull(projectSecret.ServalData!.PreTranslationsRetrieved); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForPreTranslate); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForTrainOn); - Assert.IsNotEmpty(projectSecret.ServalData!.CorpusFiles); - Assert.AreEqual(TranslationEngine02, projectSecret.ServalData!.TranslationEngineId); - Assert.AreEqual(ParallelCorpus03, projectSecret.ServalData!.ParallelCorpusIdForSmt); - } - - [Test] - public async Task RemoveProjectAsync_DeletesTranslationEngineAndAllCorporaAndFilesIfNoNmt() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync( - Project01, - new ServalData - { - TranslationEngineId = TranslationEngine02, - ParallelCorpusIdForSmt = ParallelCorpus03, - CorpusFiles = - [ - new ServalCorpusFile { CorpusId = Corpus01, FileId = File01 }, - new ServalCorpusFile { CorpusId = Corpus02, FileId = File02 }, - ], - } - ); + const string oldTargetLanguage = "en"; + const string newTargetLanguage = "fr"; + const string sourceLanguage = "de"; + env.Service.Configure().GetSourceLanguage(project).Returns(sourceLanguage); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns(newTargetLanguage); + env.Service.Configure() + .CreateServalProjectAsync(project, useEcho: false, CancellationToken.None) + .Returns(Task.FromResult(string.Empty)); + env.Service.Configure().RemoveProjectAsync(Project01, CancellationToken.None).Returns(Task.CompletedTask); + env.TranslationEnginesClient.GetAsync(TranslationEngine01) + .Returns( + Task.FromResult( + new TranslationEngine + { + Id = TranslationEngine01, + SourceLanguage = sourceLanguage, + TargetLanguage = oldTargetLanguage, + Type = MachineProjectService.Nmt, + } + ) + ); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); - - // Ensure that the SMT translation engine, shared corpora, and shared files are not deleted - await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine02); - await env.CorporaClient.Received(1).DeleteAsync(Corpus01); - await env.CorporaClient.Received(1).DeleteAsync(Corpus02); - await env.DataFilesClient.Received(1).DeleteAsync(File01); - await env.DataFilesClient.Received(1).DeleteAsync(File02); - - // Verify that the project secret is correct - SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project01); - Assert.IsEmpty(projectSecret.ServalData!.CorpusFiles); - Assert.IsNull(projectSecret.ServalData!.TranslationEngineId); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForSmt); + await env.Service.RecreateOrUpdateTranslationEngineIfRequiredAsync( + TranslationEngine01, + project, + useEcho: true, + CancellationToken.None + ); + await env.Service.Received(1).RemoveProjectAsync(Project01, CancellationToken.None); + await env.Service.Received(1).CreateServalProjectAsync(project, useEcho: true, CancellationToken.None); } [Test] - public async Task RemoveProjectAsync_DeletesTranslationEngineOnly() + public async Task RemoveProjectAsync_DeletesPreTranslationEngineAndAllCorporaAndFiles() { // Set up test environment var env = new TestEnvironment(); @@ -2878,8 +2019,6 @@ await env.SetupProjectSecretAsync( ParallelCorpusIdForPreTranslate = ParallelCorpus01, ParallelCorpusIdForTrainOn = ParallelCorpus02, PreTranslationsRetrieved = true, - TranslationEngineId = TranslationEngine02, - ParallelCorpusIdForSmt = ParallelCorpus03, CorpusFiles = [ new ServalCorpusFile { CorpusId = Corpus01, FileId = File01 }, @@ -2892,43 +2031,34 @@ await env.SetupProjectSecretAsync( CorpusFiles = [ new ServalCorpusFile { CorpusId = Corpus03, FileId = File03 }, - new ServalCorpusFile { CorpusId = Corpus03, FileId = File04 }, - new ServalCorpusFile { CorpusId = Corpus04, FileId = File05 }, - new ServalCorpusFile { CorpusId = Corpus04, FileId = File06 }, + new ServalCorpusFile { CorpusId = Corpus04, FileId = File04 }, ], }, } ); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); - - // Ensure that the SMT translation engine, shared corpora, and shared files are not deleted - await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine02); + await env.Service.RemoveProjectAsync(Project01, CancellationToken.None); - // Ensure that the pre-translation engine, and any additional or shared corpora and files are not deleted - await env.TranslationEnginesClient.DidNotReceive().DeleteAsync(TranslationEngine01); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus01); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus02); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus03); - await env.CorporaClient.DidNotReceive().DeleteAsync(Corpus04); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File01); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File02); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File03); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File04); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File05); - await env.DataFilesClient.DidNotReceive().DeleteAsync(File06); + // Ensure that the pre-translation engine, additional training corpora and files are deleted + await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); + await env.CorporaClient.Received(1).DeleteAsync(Corpus01); + await env.CorporaClient.Received(1).DeleteAsync(Corpus02); + await env.CorporaClient.Received(1).DeleteAsync(Corpus03); + await env.CorporaClient.Received(1).DeleteAsync(Corpus04); + await env.DataFilesClient.Received(1).DeleteAsync(File01); + await env.DataFilesClient.Received(1).DeleteAsync(File02); + await env.DataFilesClient.Received(1).DeleteAsync(File03); + await env.DataFilesClient.Received(1).DeleteAsync(File04); // Verify that the project secret is correct SFProjectSecret projectSecret = env.ProjectSecrets.Get(Project01); - Assert.IsNotNull(projectSecret.ServalData!.AdditionalTrainingData); - Assert.AreEqual(TranslationEngine01, projectSecret.ServalData!.PreTranslationEngineId); - Assert.IsTrue(projectSecret.ServalData!.PreTranslationsRetrieved); - Assert.AreEqual(ParallelCorpus01, projectSecret.ServalData!.ParallelCorpusIdForPreTranslate); - Assert.AreEqual(ParallelCorpus02, projectSecret.ServalData!.ParallelCorpusIdForTrainOn); - Assert.IsNotEmpty(projectSecret.ServalData!.CorpusFiles); - Assert.IsNull(projectSecret.ServalData!.TranslationEngineId); - Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForSmt); + Assert.IsNull(projectSecret.ServalData!.AdditionalTrainingData); + Assert.IsNull(projectSecret.ServalData!.PreTranslationEngineId); + Assert.IsNull(projectSecret.ServalData!.PreTranslationsRetrieved); + Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForPreTranslate); + Assert.IsNull(projectSecret.ServalData!.ParallelCorpusIdForTrainOn); + Assert.IsEmpty(projectSecret.ServalData!.CorpusFiles); } [Test] @@ -2938,7 +2068,7 @@ public async Task RemoveProjectAsync_DoesNotCallServalIfNoTranslationEngineId() var env = new TestEnvironment(); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); + await env.Service.RemoveProjectAsync(Project01, CancellationToken.None); // Ensure that the translation engine, corpus and any files were not deleted await env.TranslationEnginesClient.DidNotReceiveWithAnyArgs().DeleteAsync(TranslationEngine01); @@ -2969,7 +2099,7 @@ await env.SetupProjectSecretAsync( env.CorporaClient.DeleteAsync(Corpus01).Throws(ServalApiExceptions.NotFound); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); + await env.Service.RemoveProjectAsync(Project01, CancellationToken.None); // Ensure that the translation engine, shared corpora, and shared files are not deleted await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); @@ -3000,7 +2130,7 @@ await env.SetupProjectSecretAsync( env.DataFilesClient.DeleteAsync(File01).Throws(ServalApiExceptions.NotFound); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); + await env.Service.RemoveProjectAsync(Project01, CancellationToken.None); // Ensure that the translation engine, shared corpora, and shared files are not deleted await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); @@ -3031,7 +2161,7 @@ await env.SetupProjectSecretAsync( env.TranslationEnginesClient.DeleteAsync(TranslationEngine01).Throws(ServalApiExceptions.NotFound); // SUT - await env.Service.RemoveProjectAsync(Project01, preTranslate: true, CancellationToken.None); + await env.Service.RemoveProjectAsync(Project01, CancellationToken.None); // Ensure that the translation engine, shared corpora, and shared files are not deleted await env.TranslationEnginesClient.Received(1).DeleteAsync(TranslationEngine01); @@ -3052,7 +2182,7 @@ public void RemoveProjectAsync_ThrowsExceptionWhenProjectSecretMissing() // SUT Assert.ThrowsAsync(() => - env.Service.RemoveProjectAsync("invalid_project_id", preTranslate: false, CancellationToken.None) + env.Service.RemoveProjectAsync("invalid_project_id", CancellationToken.None) ); } @@ -3142,7 +2272,7 @@ public async Task SyncAdditionalTrainingData_RemoveAdditionalTrainingDataWithout .Returns(Task.CompletedTask); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3178,7 +2308,7 @@ public async Task SyncAdditionalTrainingData_RemoveAdditionalTrainingDataWithMis .ThrowsAsync(ServalApiExceptions.NotFound); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3209,7 +2339,7 @@ public async Task SyncAdditionalTrainingData_RemoveAdditionalTrainingDataWithPar .Returns(Task.CompletedTask); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3267,8 +2397,8 @@ public async Task SyncAdditionalTrainingData_UploadAdditionalTrainingDataWithExi SourceCorpusId = Corpus01, TargetCorpusId = Corpus02, }; - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns("en"); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns("de"); + env.Service.Configure().GetSourceLanguage(project).Returns("en"); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns("de"); env.Service.Configure() .CreateOrUpdateParallelCorpusAsync( TranslationEngine01, @@ -3288,10 +2418,10 @@ public async Task SyncAdditionalTrainingData_UploadAdditionalTrainingDataWithExi Arg.Any>(), CancellationToken.None ) - .Returns(args => Task.FromResult(args[1] as string)); + .Returns(args => Task.FromResult((string)args[1])); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3323,8 +2453,8 @@ public async Task SyncAdditionalTrainingData_UploadAdditionalTrainingDataWithout var project = new SFProject { Id = Project01 }; var buildConfig = new BuildConfig { TrainingDataFiles = [Data01] }; var additionalTrainingData = new ServalAdditionalTrainingData(); - env.Service.Configure().GetSourceLanguage(project, preTranslate: true).Returns(sourceLanguage); - env.Service.Configure().GetTargetLanguage(project, preTranslate: true, useEcho: false).Returns("de"); + env.Service.Configure().GetSourceLanguage(project).Returns(sourceLanguage); + env.Service.Configure().GetTargetLanguage(project, useEcho: false).Returns("de"); env.Service.Configure() .CreateOrUpdateParallelCorpusAsync( TranslationEngine01, @@ -3359,7 +2489,7 @@ public async Task SyncAdditionalTrainingData_UploadAdditionalTrainingDataWithout }); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3391,7 +2521,7 @@ public async Task SyncAdditionalTrainingData_NoAdditionalTrainingData() var buildConfig = new BuildConfig(); // SUT - ServalAdditionalTrainingData actual = await env.Service.SyncAdditionalTrainingData( + ServalAdditionalTrainingData? actual = await env.Service.SyncAdditionalTrainingData( User01, project, TranslationEngine01, @@ -3407,16 +2537,10 @@ public async Task SyncAdditionalTrainingData_NoAdditionalTrainingData() public async Task SyncProjectCorporaAsync_Success(TestEnvironmentOptions options) { // Set up test environment - var env = new TestEnvironment( - options with - { - HasTranslationEngineForNmt = options.PreTranslate, - HasTranslationEngineForSmt = !options.PreTranslate, - } - ); + var env = new TestEnvironment(options with { HasTranslationEngineForNmt = true }); env.Service.Configure() .GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None) - .Returns(Task.FromResult(Corpus01)); + .Returns(Task.FromResult(Corpus01)); env.Service.Configure() .UploadParatextFileAsync(Arg.Any(), Arg.Any(), CancellationToken.None) .Returns(Task.CompletedTask); @@ -3425,7 +2549,7 @@ options with .Returns(Task.CompletedTask); env.Service.Configure() .CreateOrUpdateParallelCorpusAsync( - options.PreTranslate ? TranslationEngine01 : TranslationEngine02, + TranslationEngine01, Arg.Any(), Arg.Any(), Arg.Any>(), @@ -3437,7 +2561,7 @@ options with .SyncAdditionalTrainingData( User01, Arg.Any(), - options.PreTranslate ? TranslationEngine01 : TranslationEngine02, + TranslationEngine01, Arg.Any(), Arg.Any(), CancellationToken.None @@ -3448,7 +2572,6 @@ options with IList actual = await env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project02 }, - preTranslate: options.PreTranslate, CancellationToken.None ); await env.AssertSyncProjectCorporaAsync(options, actual, createsServalCorpora: true); @@ -3460,7 +2583,6 @@ options with actual = await env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project02 }, - preTranslate: options.PreTranslate, CancellationToken.None ); await env.AssertSyncProjectCorporaAsync(options, actual, createsServalCorpora: false); @@ -3471,10 +2593,6 @@ await env.Projects.UpdateAsync( op => { op.Set(p => p.WritingSystem.Tag, "fr"); - if (options.Source) - { - op.Set(p => p.TranslateConfig.Source.WritingSystem.Tag, "fr_be"); - } switch (options.DraftingSources) { @@ -3514,7 +2632,6 @@ await env.Projects.UpdateAsync( actual = await env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project02 }, - preTranslate: options.PreTranslate, CancellationToken.None ); await env.AssertSyncProjectCorporaAsync(options, actual, createsServalCorpora: true); @@ -3532,7 +2649,6 @@ public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenPreTranslationEngin env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: true, CancellationToken.None ) ); @@ -3550,7 +2666,6 @@ public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenProjectMissing() env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: false, CancellationToken.None ) ); @@ -3568,7 +2683,6 @@ public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenProjectSecretMissin env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: false, CancellationToken.None ) ); @@ -3586,26 +2700,6 @@ public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenServalConfigMissing env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: false, - CancellationToken.None - ) - ); - } - - [Test] - public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenSourceMissingForSmt() - { - // Set up test environment - var env = new TestEnvironment(); - await env.Projects.UpdateAsync(Project01, op => op.Unset(p => p.TranslateConfig.Source)); - await env.SetupProjectSecretAsync(Project01, new ServalData { TranslationEngineId = TranslationEngine01 }); - - // SUT - Assert.ThrowsAsync(() => - env.Service.SyncProjectCorporaAsync( - User01, - new BuildConfig { ProjectId = Project01 }, - preTranslate: false, CancellationToken.None ) ); @@ -3623,25 +2717,6 @@ public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenNoDraftingSourceFor env.Service.SyncProjectCorporaAsync( User01, new BuildConfig { ProjectId = Project01 }, - preTranslate: true, - CancellationToken.None - ) - ); - } - - [Test] - public async Task SyncProjectCorporaAsync_ThrowsExceptionWhenTranslationEngineIdMissing() - { - // Set up test environment - var env = new TestEnvironment(); - await env.ProjectSecrets.UpdateAsync(Project01, op => op.Set(p => p.ServalData, new ServalData())); - - // SUT - Assert.ThrowsAsync(() => - env.Service.SyncProjectCorporaAsync( - User01, - new BuildConfig { ProjectId = Project01 }, - preTranslate: false, CancellationToken.None ) ); @@ -3659,7 +2734,6 @@ public async Task TranslationEngineExistsAsync_Forbidden_False() bool actual = await env.Service.TranslationEngineExistsAsync( Project01, TranslationEngine01, - preTranslate: false, CancellationToken.None ); Assert.IsFalse(actual); @@ -3677,7 +2751,6 @@ public async Task TranslationEngineExistsAsync_NotFound_False() bool actual = await env.Service.TranslationEngineExistsAsync( Project01, TranslationEngine01, - preTranslate: false, CancellationToken.None ); Assert.IsFalse(actual); @@ -3693,7 +2766,6 @@ public async Task TranslationEngineExistsAsync_NullTranslationId_False() bool actual = await env.Service.TranslationEngineExistsAsync( Project01, translationEngineId: null, - preTranslate: false, CancellationToken.None ); Assert.IsFalse(actual); @@ -3711,33 +2783,6 @@ public async Task TranslationEngineExistsAsync_WrongProjectId_False() { Id = TranslationEngine01, Name = Project02, - Type = MachineProjectService.SmtTransfer, - } - ) - ); - - // SUT - bool actual = await env.Service.TranslationEngineExistsAsync( - Project01, - TranslationEngine01, - preTranslate: false, - CancellationToken.None - ); - Assert.IsFalse(actual); - } - - [Test] - public async Task TranslationEngineExistsAsync_Type_False() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine01, - Name = Project01, Type = MachineProjectService.Nmt, } ) @@ -3747,88 +2792,21 @@ public async Task TranslationEngineExistsAsync_Type_False() bool actual = await env.Service.TranslationEngineExistsAsync( Project01, TranslationEngine01, - preTranslate: false, CancellationToken.None ); Assert.IsFalse(actual); } - [Test] - public async Task TranslationEngineExistsAsync_Type_SupportsKebabCase() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine01, - Name = Project01, - Type = "smt-transfer", - } - ) - ); - - // SUT - bool actual = await env.Service.TranslationEngineExistsAsync( - Project01, - TranslationEngine01, - preTranslate: false, - CancellationToken.None - ); - Assert.IsTrue(actual); - } - - [Test] - public async Task TranslationEngineExistsAsync_Type_SupportsPascalCase() - { - // Set up test environment - var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine01, - Name = Project01, - Type = "SmtTransfer", - } - ) - ); - - // SUT - bool actual = await env.Service.TranslationEngineExistsAsync( - Project01, - TranslationEngine01, - preTranslate: false, - CancellationToken.None - ); - Assert.IsTrue(actual); - } - [Test] public async Task TranslationEngineExistsAsync_Success() { // Set up test environment var env = new TestEnvironment(); - env.TranslationEnginesClient.GetAsync(TranslationEngine01, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine01, - Name = Project01, - Type = MachineProjectService.SmtTransfer, - } - ) - ); // SUT bool actual = await env.Service.TranslationEngineExistsAsync( Project01, TranslationEngine01, - preTranslate: false, CancellationToken.None ); Assert.IsTrue(actual); @@ -3844,12 +2822,7 @@ public void TranslationEngineExistsAsync_ThrowsOtherErrors() // SUT Assert.ThrowsAsync(() => - env.Service.TranslationEngineExistsAsync( - Project01, - TranslationEngine01, - preTranslate: false, - CancellationToken.None - ) + env.Service.TranslationEngineExistsAsync(Project01, TranslationEngine01, CancellationToken.None) ); } @@ -3911,7 +2884,7 @@ public async Task UploadAdditionalTrainingDataAsync_OnlyReturnsUploadedServalCor .Returns(Task.FromResult(false)); env.Service.Configure() .GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None) - .Returns(Task.FromResult(Corpus01)); + .Returns(Task.FromResult(Corpus01)); string actual = await env.Service.UploadAdditionalTrainingDataAsync( Project01, @@ -4034,7 +3007,7 @@ public async Task UploadAdditionalTrainingDataAsync_UpdatesTheCorpus() .Returns(Task.FromResult(true)); env.Service.Configure() .GetCorpusIdFromServalAsync(Corpus01, CancellationToken.None) - .Returns(Task.FromResult(Corpus01)); + .Returns(Task.FromResult(Corpus01)); string actual = await env.Service.UploadAdditionalTrainingDataAsync( Project01, @@ -4226,77 +3199,53 @@ public static IEnumerable SyncProjectCorporaAsyncOptions get { bool[] boolValues = [false, true]; - foreach (bool preTranslate in boolValues) + foreach (bool oneDraftingAndTrainingSource in boolValues) { - foreach (bool source in boolValues) + foreach (bool twoTrainingSources in boolValues) { - foreach (bool oneDraftingAndTrainingSource in boolValues) + var options = new TestEnvironmentOptions { - foreach (bool twoTrainingSources in boolValues) - { - var options = new TestEnvironmentOptions - { - DraftingSources = oneDraftingAndTrainingSource ? 1 : 0, - TrainingSources = - twoTrainingSources ? 2 - : oneDraftingAndTrainingSource ? 1 - : 0, - PreTranslate = preTranslate, - Source = source, - }; - if (options.WillSucceed) - { - yield return options; - } - } + DraftingSources = oneDraftingAndTrainingSource ? 1 : 0, + TrainingSources = + twoTrainingSources ? 2 + : oneDraftingAndTrainingSource ? 1 + : 0, + }; + if (options.WillSucceed) + { + yield return options; } } + } - // Emit special test cases with pre-translate enabled or disabled - yield return new TestEnvironmentOptions - { - DraftingSources = 1, - TrainingSources = 1, - DraftingSourceAndTrainingSourceAreTheSame = true, - PreTranslate = preTranslate, - Source = true, - }; + // Emit special test cases with pre-translate enabled or disabled + yield return new TestEnvironmentOptions + { + DraftingSources = 1, + TrainingSources = 1, + DraftingSourceAndTrainingSourceAreTheSame = true, + }; - // Emit special cases for base projects - foreach (bool baseProjectIsDraftingSource in boolValues) - { - yield return new TestEnvironmentOptions - { - BaseProjectIsDraftingSource = baseProjectIsDraftingSource, - DraftingSources = 1, - HasBaseProject = true, - TrainingSources = 1, - DraftingSourceAndTrainingSourceAreTheSame = true, - PreTranslate = preTranslate, - Source = true, - }; - } - yield return new TestEnvironmentOptions - { - BaseProjectIsMissingWritingSystem = true, - DraftingSources = 1, - HasBaseProject = true, - TrainingSources = 1, - DraftingSourceAndTrainingSourceAreTheSame = true, - PreTranslate = preTranslate, - Source = true, - }; + // Emit special cases for base projects + foreach (bool baseProjectIsDraftingSource in boolValues) + { yield return new TestEnvironmentOptions { - BaseProjectIsMissingFromDisk = true, + BaseProjectIsDraftingSource = baseProjectIsDraftingSource, DraftingSources = 1, HasBaseProject = true, TrainingSources = 1, DraftingSourceAndTrainingSourceAreTheSame = true, - PreTranslate = preTranslate, - Source = true, }; } + yield return new TestEnvironmentOptions + { + BaseProjectIsMissingWritingSystem = true, + DraftingSources = 1, + HasBaseProject = true, + TrainingSources = 1, + DraftingSourceAndTrainingSourceAreTheSame = true, + }; } } @@ -4308,21 +3257,13 @@ public record TestEnvironmentOptions public bool DraftingSourceAndTrainingSourceAreTheSame { get; init; } public bool HasBaseProject { get; init; } public bool HasTranslationEngineForNmt { get; init; } - public bool HasTranslationEngineForSmt { get; init; } - public bool LegacyCorpora { get; init; } - public bool PreTranslate { get; init; } - public bool Source { get; init; } public int DraftingSources { get; init; } public int TrainingSources { get; init; } /// /// Determines if the test has the minimum required configuration to succeed. /// - public bool WillSucceed => TrainingAndDraftingSourceAndNmt || SourceAndSmt; - - private bool TrainingAndDraftingSourceAndNmt => DraftingSources > 0 && TrainingSources > 0 && PreTranslate; - - private bool SourceAndSmt => Source && !PreTranslate; + public bool WillSucceed => DraftingSources > 0 && TrainingSources > 0; } private class TestEnvironment @@ -4360,23 +3301,7 @@ public TestEnvironment(TestEnvironmentOptions? options = null) { Id = TranslationEngine01, Name = Project01, - SourceLanguage = "en_US", - TargetLanguage = "en_GB", - Type = MachineProjectService.SmtTransfer, - } - ) - ); - TranslationEnginesClient - .GetAsync(TranslationEngine02, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine02, - Name = Project02, - SourceLanguage = "en", - TargetLanguage = "en_US", - Type = MachineProjectService.SmtTransfer, + Type = MachineProjectService.Nmt, } ) ); @@ -4424,32 +3349,6 @@ public TestEnvironment(TestEnvironmentOptions? options = null) ServalData = new ServalData { PreTranslationEngineId = options.HasTranslationEngineForNmt ? TranslationEngine01 : null, - TranslationEngineId = options.HasTranslationEngineForSmt ? TranslationEngine02 : null, - Corpora = options.LegacyCorpora - ? new Dictionary - { - { - Corpus01, - new ServalCorpus - { - PreTranslate = false, - AlternateTrainingSource = false, - SourceFiles = [new ServalCorpusFile { FileId = File01, ProjectId = Project03 }], - TargetFiles = [new ServalCorpusFile { FileId = File02, ProjectId = Project01 }], - } - }, - { - Corpus02, - new ServalCorpus - { - PreTranslate = true, - AlternateTrainingSource = false, - SourceFiles = [new ServalCorpusFile { FileId = File01, ProjectId = Project03 }], - TargetFiles = [new ServalCorpusFile { FileId = File02, ProjectId = Project01 }], - } - }, - } - : null, }, }, new SFProjectSecret { Id = Project03 }, @@ -4475,17 +3374,6 @@ public TestEnvironment(TestEnvironmentOptions? options = null) ParatextId = Paratext01, CheckingConfig = new CheckingConfig(), UserRoles = [], - TranslateConfig = new TranslateConfig - { - TranslationSuggestionsEnabled = true, - Source = new TranslateSource - { - ProjectRef = Project02, - ParatextId = Paratext02, - WritingSystem = new WritingSystem { Tag = "en_US" }, - }, - DraftConfig = new DraftConfig(), - }, WritingSystem = new WritingSystem { Tag = "en_GB" }, }, new SFProject @@ -4498,15 +3386,6 @@ public TestEnvironment(TestEnvironmentOptions? options = null) UserRoles = [], TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = true, - Source = options.Source - ? new TranslateSource - { - ProjectRef = Project01, - ParatextId = Paratext01, - WritingSystem = new WritingSystem { Tag = "en" }, - } - : null, DraftConfig = new DraftConfig { DraftingSources = @@ -4577,11 +3456,6 @@ public TestEnvironment(TestEnvironmentOptions? options = null) ParatextId = Paratext03, CheckingConfig = new CheckingConfig(), UserRoles = [], - TranslateConfig = new TranslateConfig - { - TranslationSuggestionsEnabled = true, - Source = new TranslateSource { ProjectRef = Project01, ParatextId = Paratext01 }, - }, }, new SFProject { @@ -4630,7 +3504,7 @@ public TestEnvironment(TestEnvironmentOptions? options = null) EmailService.ValidateEmail(Arg.Any()).Returns(true); var localizationOptions = Options.Create(new LocalizationOptions { ResourcesPath = "Resources" }); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions, NullLoggerFactory.Instance); - Localizer = new StringLocalizer(factory); + var localizer = new StringLocalizer(factory); // We use this so we can mock any virtual methods in the class Service = Substitute.ForPartsOf( @@ -4640,7 +3514,7 @@ public TestEnvironment(TestEnvironmentOptions? options = null) Environment, ExceptionHandler, FileSystemService, - Localizer, + localizer, MockLogger, ParatextService, ProjectSecrets, @@ -4659,7 +3533,6 @@ public TestEnvironment(TestEnvironmentOptions? options = null) public IWebHostEnvironment Environment { get; } public IExceptionHandler ExceptionHandler { get; } public IFileSystemService FileSystemService { get; } - public IStringLocalizer Localizer { get; } public MockLogger MockLogger { get; } public IParatextService ParatextService { get; } public MemoryRepository Projects { get; } @@ -4690,33 +3563,18 @@ bool createsServalCorpora await CorporaClient .Received(createsServalCorpora ? 1 : 0) .CreateAsync(Arg.Is(c => c.Name == $"{Project02}_{Project02}")); - Assert.AreEqual(options.PreTranslate ? 2 : 1, actual.Count(s => s.ProjectId == Project02)); - - // SMT Source - if (options.Source) - { - await CorporaClient - .Received(createsServalCorpora ? 1 : 0) - .CreateAsync(Arg.Is(c => c.Name == $"{Project02}_{Project01}")); - numberOfServalCorpusFiles++; - - // See how many times the source corpus was used in the parallel corpora - Assert.AreEqual(options.PreTranslate ? 0 : 1, actual.Count(s => s.ProjectId == Project01)); - } + Assert.AreEqual(2, actual.Count(s => s.ProjectId == Project02)); // Drafting Source if (options.DraftingSources > 0) { - int expected = options switch - { - { PreTranslate: false } => 0, - { PreTranslate: true, DraftingSourceAndTrainingSourceAreTheSame: true } => 2, - { PreTranslate: true } => 1, - }; await CorporaClient .Received(createsServalCorpora ? 1 : 0) .CreateAsync(Arg.Is(c => c.Name == $"{Project02}_{Project03}")); - Assert.AreEqual(expected, actual.Count(s => s.ProjectId == Project03)); + Assert.AreEqual( + options.DraftingSourceAndTrainingSourceAreTheSame ? 2 : 1, + actual.Count(s => s.ProjectId == Project03) + ); numberOfServalCorpusFiles++; } @@ -4727,7 +3585,7 @@ await CorporaClient await CorporaClient .Received(createsServalCorpora ? 1 : 0) .CreateAsync(Arg.Is(c => c.Name == $"{Project02}_{Project04}")); - Assert.AreEqual(options.PreTranslate ? 1 : 0, actual.Count(s => s.ProjectId == Project04)); + Assert.AreEqual(1, actual.Count(s => s.ProjectId == Project04)); numberOfServalCorpusFiles++; } @@ -4737,7 +3595,7 @@ await CorporaClient await CorporaClient .Received(createsServalCorpora ? 1 : 0) .CreateAsync(Arg.Is(c => c.Name == $"{Project02}_{Project05}")); - Assert.AreEqual(options.PreTranslate ? 1 : 0, actual.Count(s => s.ProjectId == Project05)); + Assert.AreEqual(1, actual.Count(s => s.ProjectId == Project05)); numberOfServalCorpusFiles++; } @@ -4747,7 +3605,6 @@ await CorporaClient bool baseProjectUploaded = options is { - PreTranslate: true, BaseProjectIsDraftingSource: false, BaseProjectIsMissingFromDisk: false, BaseProjectIsMissingWritingSystem: false @@ -4774,9 +3631,9 @@ await Service // The parallel corpora will be created or updated await Service - .Received(options.PreTranslate ? 2 : 1) + .Received(2) .CreateOrUpdateParallelCorpusAsync( - options.PreTranslate ? TranslationEngine01 : TranslationEngine02, + TranslationEngine01, Arg.Any(), Arg.Any(), Arg.Any>(), @@ -4795,7 +3652,7 @@ await Service // The training data will be synced for pre-translation builds only await Service - .Received(options.PreTranslate ? 1 : 0) + .Received(1) .SyncAdditionalTrainingData( User01, Arg.Any(), @@ -4810,98 +3667,6 @@ await Service Service.ClearReceivedCalls(); } - public async Task SetDataInSync( - string projectId, - bool preTranslate = false, - bool uploadParatextZipFile = false, - bool alternateTrainingSource = false - ) => - await ProjectSecrets.UpdateAsync( - projectId, - u => - { - u.Set( - p => p.ServalData.Corpora[Corpus01], - new ServalCorpus - { - SourceFiles = - [ - new ServalCorpusFile - { - FileChecksum = "old_checksum", - FileId = File01, - ProjectId = Project03, - TextId = "textId", - }, - ], - TargetFiles = - [ - new ServalCorpusFile - { - FileChecksum = "old_checksum", - FileId = File02, - ProjectId = projectId, - TextId = "textId", - }, - ], - AlternateTrainingSource = false, - PreTranslate = preTranslate, - UploadParatextZipFile = uploadParatextZipFile, - } - ); - if (alternateTrainingSource) - { - u.Set( - p => p.ServalData.Corpora[Corpus02], - new ServalCorpus - { - SourceFiles = - [ - new ServalCorpusFile - { - FileChecksum = "old_checksum", - FileId = File01, - ProjectId = Project01, - TextId = "textId", - }, - ], - TargetFiles = - [ - new ServalCorpusFile - { - FileChecksum = "old_checksum", - FileId = File02, - ProjectId = projectId, - TextId = "textId", - }, - ], - AlternateTrainingSource = true, - PreTranslate = preTranslate, - UploadParatextZipFile = uploadParatextZipFile, - } - ); - } - if (preTranslate) - { - u.Set(p => p.ServalData.PreTranslationEngineId, TranslationEngine02); - TranslationEnginesClient - .GetAsync(TranslationEngine02, CancellationToken.None) - .Returns( - Task.FromResult( - new TranslationEngine - { - Id = TranslationEngine02, - Name = Project02, - SourceLanguage = "en", - TargetLanguage = "en_US", - Type = MachineProjectService.Nmt, - } - ) - ); - } - } - ); - /// /// Sets up the Project Secret. /// @@ -4969,20 +3734,7 @@ public async Task SetupTrainingDataAsync(string projectId, bool existingData = f ); await ProjectSecrets.UpdateAsync( Project02, - u => - { - u.Set(p => p.ServalData.PreTranslationEngineId, TranslationEngine02); - u.Set( - p => p.ServalData.Corpora[Corpus03], - new ServalCorpus - { - PreTranslate = true, - AdditionalTrainingData = true, - SourceFiles = [new ServalCorpusFile { FileId = File01 }], - TargetFiles = [new ServalCorpusFile { FileId = File02 }], - } - ); - } + u => u.Set(p => p.ServalData!.PreTranslationEngineId, TranslationEngine02) ); } } diff --git a/test/SIL.XForge.Scripture.Tests/Services/ParatextServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/ParatextServiceTests.cs index b7a8e031185..7f6056f8a85 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/ParatextServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/ParatextServiceTests.cs @@ -7199,7 +7199,6 @@ public SFProject NewSFProject(string? projectId = null) WritingSystem = new WritingSystem { Tag = "en" }, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = true, Source = new TranslateSource { ParatextId = "paratextId", diff --git a/test/SIL.XForge.Scripture.Tests/Services/ParatextSyncRunnerTests.cs b/test/SIL.XForge.Scripture.Tests/Services/ParatextSyncRunnerTests.cs index 7bc758fd294..243651ebc61 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/ParatextSyncRunnerTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/ParatextSyncRunnerTests.cs @@ -47,7 +47,7 @@ public async Task SyncAsync_ProjectDoesNotExist() public async Task SyncAsync_UserDoesNotExist() { var env = new TestEnvironment(); - env.SetupSFData(true, true, true, false); + env.SetupSFData(true, true, false); env.ParatextService.GetLatestSharedVersion(Arg.Any(), "target").Returns("beforeSR"); await env.Runner.RunAsync("project01", "user03", "project01", false, CancellationToken.None); @@ -64,7 +64,7 @@ public async Task SyncAsync_UserDoesNotExist() public async Task SyncAsync_Error() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); env.DeltaUsxMapper.When(d => d.ToChapterDeltas(Arg.Any())).Do(x => throw new Exception()); @@ -83,7 +83,7 @@ public async Task SyncAsync_Error() public async Task SyncAsync_UserPermissionError() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.ParatextService.GetParatextUsersAsync( Arg.Any(), Arg.Any(), @@ -105,7 +105,7 @@ public async Task SyncAsync_UserPermissionError() public async Task SyncAsync_UserPermissionErrorBackTranslation() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.ParatextService.GetParatextUsersAsync( Arg.Any(), Arg.Any(), @@ -129,7 +129,7 @@ public async Task SyncAsync_KeepsErrorStateWhenRunningAgain() { var env = new TestEnvironment(); int count = 0; - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); env.DeltaUsxMapper.When(d => d.ToChapterDeltas(Arg.Any())) .Do(x => @@ -171,10 +171,10 @@ public async Task SyncAsync_KeepsErrorStateWhenRunningAgain() } [Test] - public async Task SyncAsync_NewProjectTranslationSuggestionsAndCheckingDisabled() + public async Task SyncAsync_NewProjectCheckingEnabled() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2, false)); await env.Runner.RunAsync("project01", "user01", "project01", true, CancellationToken.None); @@ -206,117 +206,10 @@ public async Task SyncAsync_NewProjectTranslationSuggestionsAndCheckingDisabled( } [Test] - public async Task SyncAsync_NewProjectTranslationSuggestionsAndCheckingEnabled() + public async Task SyncAsync_NewProjectOnlyNoMatchingSourceText() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); - env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2, false)); - - await env.Runner.RunAsync("project02", "user01", "project02", true, CancellationToken.None); - await env.Runner.RunAsync("project01", "user01", "project01", true, CancellationToken.None); - - Assert.That(env.ContainsText("project01", "MAT", 1), Is.True); - Assert.That(env.ContainsText("project01", "MAT", 2), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 1), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 2), Is.True); - - Assert.That(env.ContainsText("project02", "MAT", 1), Is.True); - Assert.That(env.ContainsText("project02", "MAT", 2), Is.True); - Assert.That(env.ContainsText("project02", "MRK", 1), Is.False); - Assert.That(env.ContainsText("project02", "MRK", 2), Is.False); - - Assert.That(env.ContainsQuestion("MAT", 1), Is.False); - Assert.That(env.ContainsQuestion("MAT", 2), Is.False); - Assert.That(env.ContainsQuestion("MRK", 1), Is.False); - Assert.That(env.ContainsQuestion("MRK", 2), Is.False); - - env.VerifyProjectSync(true); - - // Verify the sync metrics - SyncMetrics syncMetrics = env.GetSyncMetrics("project01"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 2, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 4, deleted: 0, updated: 0))); - syncMetrics = env.GetSyncMetrics("project02"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 1, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 2, deleted: 0, updated: 0))); - } - - [Test] - public async Task SyncAsync_NewProjectOnlyTranslationSuggestionsEnabled() - { - var env = new TestEnvironment(); - env.SetupSFData(true, false, false, false); - env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2, false)); - - await env.Runner.RunAsync("project02", "user01", "project02", true, CancellationToken.None); - await env.Runner.RunAsync("project01", "user01", "project01", true, CancellationToken.None); - - Assert.That(env.ContainsText("project01", "MAT", 1), Is.True); - Assert.That(env.ContainsText("project01", "MAT", 2), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 1), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 2), Is.True); - - Assert.That(env.ContainsText("project02", "MAT", 1), Is.True); - Assert.That(env.ContainsText("project02", "MAT", 2), Is.True); - Assert.That(env.ContainsText("project02", "MRK", 1), Is.False); - Assert.That(env.ContainsText("project02", "MRK", 2), Is.False); - - Assert.That(env.ContainsQuestion("MAT", 1), Is.False); - Assert.That(env.ContainsQuestion("MAT", 2), Is.False); - Assert.That(env.ContainsQuestion("MRK", 1), Is.False); - Assert.That(env.ContainsQuestion("MRK", 2), Is.False); - - env.VerifyProjectSync(true); - - // Verify the sync metrics - SyncMetrics syncMetrics = env.GetSyncMetrics("project01"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 2, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 4, deleted: 0, updated: 0))); - syncMetrics = env.GetSyncMetrics("project02"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 1, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 2, deleted: 0, updated: 0))); - } - - [Test] - public async Task SyncAsync_NewProjectOnlyCheckingEnabled() - { - var env = new TestEnvironment(); - env.SetupSFData(false, true, false, false); - env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2, false)); - - await env.Runner.RunAsync("project01", "user01", "project01", true, CancellationToken.None); - - Assert.That(env.ContainsText("project01", "MAT", 1), Is.True); - Assert.That(env.ContainsText("project01", "MAT", 2), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 1), Is.True); - Assert.That(env.ContainsText("project01", "MRK", 2), Is.True); - - Assert.That(env.ContainsText("project02", "MAT", 1), Is.False); - Assert.That(env.ContainsText("project02", "MAT", 2), Is.False); - Assert.That(env.ContainsText("project02", "MRK", 1), Is.False); - Assert.That(env.ContainsText("project02", "MRK", 2), Is.False); - - Assert.That(env.ContainsQuestion("MAT", 1), Is.False); - Assert.That(env.ContainsQuestion("MAT", 2), Is.False); - Assert.That(env.ContainsQuestion("MRK", 1), Is.False); - Assert.That(env.ContainsQuestion("MRK", 2), Is.False); - - env.VerifyProjectSync(true); - - // Verify the sync metrics - SyncMetrics syncMetrics = env.GetSyncMetrics("project01"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 2, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 4, deleted: 0, updated: 0))); - syncMetrics = env.GetSyncMetrics("project02"); - Assert.That(syncMetrics.Books, Is.EqualTo(new SyncMetricInfo(added: 0, deleted: 0, updated: 0))); - Assert.That(syncMetrics.TextDocs, Is.EqualTo(new SyncMetricInfo(added: 0, deleted: 0, updated: 0))); - } - - [Test] - public async Task SyncAsync_NewProjectOnlyNoMatchingSourceText_TranslationSuggestionEnabled() - { - var env = new TestEnvironment(); - env.SetupSFData(true, false, false, false); + env.SetupSFData(false, false, false); env.SetupPTData(new Book("MAT", 2, false)); await env.Runner.RunAsync("project02", "user01", "project02", true, CancellationToken.None); @@ -343,7 +236,7 @@ public async Task SyncAsync_DataNotChanged() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); // SUT @@ -393,7 +286,7 @@ public async Task SyncAsync_DataChangedTranslateAndCheckingEnabled() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); await env.Runner.RunAsync("project02", "user01", "project02", false, CancellationToken.None); @@ -436,7 +329,7 @@ public async Task SyncAsync_DataChangedTranslateEnabledCheckingDisabled() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, false, true, false, books); + env.SetupSFData(false, true, false, books); env.SetupPTData(books); await env.Runner.RunAsync("project02", "user01", "project02", false, CancellationToken.None); @@ -486,7 +379,7 @@ await env public async Task SyncAsync_ChaptersChanged() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 3), new Book("MRK", 1)); Book[] books = [new Book("MRK", 2)]; env.AddParatextNoteThreadData(books); @@ -549,7 +442,7 @@ await env public async Task SyncAsync_ChapterValidityChanged() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2) { InvalidChapters = { 1 } }); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2) { InvalidChapters = { 1 } }); env.SetupPTData(new Book("MAT", 2) { InvalidChapters = { 2 } }, new Book("MRK", 2)); await env.Runner.RunAsync("project01", "user01", "project01", false, CancellationToken.None); @@ -566,7 +459,7 @@ public async Task SyncAsync_ChapterValidityChanged() public async Task SyncAsync_BooksChanged() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 2), new Book("LUK", 2)); // Need to make sure we have notes BEFORE the sync Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; @@ -638,7 +531,7 @@ public async Task SyncAsync_UserRoleChangedAndUserRemoved() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync( Arg.Any(), @@ -663,7 +556,7 @@ public async Task SyncAsync_UpdatesPermissionsForProjects() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync( Arg.Any(), @@ -694,7 +587,7 @@ public async Task SyncAsync_RefreshToken_UnauthorizedAccessException() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync(Arg.Any(), Arg.Any(), CancellationToken.None) .Throws(); @@ -716,7 +609,7 @@ public async Task SyncAsync_ProjectTextSetToNotEditable() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); SFProject project = env.GetProject("project01"); Assert.That(project.Editable, Is.True, "setup"); @@ -742,7 +635,7 @@ public async Task SyncAsync_CreatesNewBooks() { var env = new TestEnvironment(); Book[] sfBooks = [new Book("2JN", 1), new Book("3JN", 1)]; - env.SetupSFData(false, false, true, false, sfBooks); + env.SetupSFData(false, true, false, sfBooks); Book[] ptBooks = [new Book("2JN", 1)]; env.SetupPTData(ptBooks); @@ -771,7 +664,7 @@ public async Task SyncAsync_CreatesNoteTagIcon() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(true, true, false, true, books); + env.SetupSFData(true, false, true, books); await env.SetupUndefinedNoteTag("project01", false); SFProject project = env.GetProject(); Assert.That(project.TranslateConfig.DefaultNoteTagId, Is.Null); @@ -801,7 +694,7 @@ public async Task SyncAsync_CreatesCheckingNoteTag() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(false, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); SFProject project = env.GetProject("project05"); @@ -847,7 +740,7 @@ public async Task SyncAsync_UpdatesExistingNoteTags() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(true, true, false, true, books); + env.SetupSFData(true, false, true, books); var noteTags = new List { new NoteTag @@ -899,7 +792,7 @@ public async Task SyncAsync_SetsProjectSettings() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync( @@ -1020,7 +913,7 @@ public async Task SyncAsync_ProjectSettingsIsNull_SyncFailsAndTextNotUpdated() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 1)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync( @@ -1045,7 +938,7 @@ public async Task SyncAsync_CheckerWithPTAccountNotRemoved() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, false, false, books); + env.SetupSFData(true, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextUsersAsync( Arg.Any(), @@ -1072,7 +965,7 @@ public async Task SyncAsync_LanguageIsRightToLeft_ProjectPropertySet() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, false, false, false, books); + env.SetupSFData(false, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextSettings(Arg.Any(), "target") @@ -1089,7 +982,7 @@ public async Task SyncAsync_FullName_ProjectPropertyNotSetIfNull() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, false, false, false, books); + env.SetupSFData(false, false, false, books); env.SetupPTData(books); env.ParatextService.GetParatextSettings(Arg.Any(), "target").Returns(new ParatextSettings()); @@ -1107,7 +1000,7 @@ public async Task SyncAsync_FullName_ProjectPropertySet() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, false, false, false, books); + env.SetupSFData(false, false, false, books); env.SetupPTData(books); string newFullName = "New Full Name"; @@ -1126,7 +1019,7 @@ public async Task SyncAsync_FullName_ProjectPropertySet() public async Task SyncAsync_TextDocAlreadyExists() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(false, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.RealtimeService.GetRepository() .Add(new TextData(Delta.New().InsertText("old text")) { Id = TextData.GetTextDocId("project01", 42, 1) }); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2), new Book("LUK", 2)); @@ -1154,7 +1047,7 @@ public async Task SyncAsync_DbMissingChapter() { // The project in the DB has a book, but a Source chapter is missing from that book. var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 3, 3) { MissingSourceChapters = { 2 } }); + env.SetupSFData(true, false, false, new Book("MAT", 3, 3) { MissingSourceChapters = { 2 } }); env.SetupPTData(new Book("MAT", 3, true)); // DB should start with Target chapter 2 but without Source chapter 2. @@ -1189,7 +1082,7 @@ public async Task SyncAsync_ParatextMissingChapter() { // The project in Paratext has a book, but a chapter is missing from that book. var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 3, true)); + env.SetupSFData(true, false, false, new Book("MAT", 3, true)); env.SetupPTData(new Book("MAT", 3, 3) { MissingTargetChapters = { 2 }, MissingSourceChapters = { 2 } }); var chapterContent = Delta.New().InsertText("text"); @@ -1232,7 +1125,7 @@ public async Task SyncAsync_DbAndParatextMissingChapter() { // The project has a book, but a Source chapter is missing from that book. Both in the DB and in Paratext. var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 3, 3) { MissingSourceChapters = { 2 } }); + env.SetupSFData(true, false, false, new Book("MAT", 3, 3) { MissingSourceChapters = { 2 } }); env.SetupPTData(new Book("MAT", 3, 3) { MissingSourceChapters = { 2 } }); // DB should start without Source chapter 2. @@ -1263,7 +1156,7 @@ public async Task SyncAsync_ParatextMissingAllChapters() { // The project in PT has a book, but no chapters. var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 3, true)); + env.SetupSFData(true, false, false, new Book("MAT", 3, true)); env.SetupPTData(new Book("MAT", 0, true)); var chapterContent = Delta.New().InsertText("text"); @@ -1420,7 +1313,7 @@ public async Task SyncAsync_TaskAbortedByExceptionWritesToLog() { // Set up the environment var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1448,7 +1341,7 @@ public async Task SyncAsync_TaskAbortedByExceptionWritesToLog() public async Task SyncAsync_DataInSyncTrueAfterRestore() { var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); // Simulate a successful backup to a hg repo at a revision not matching our project doc // after a failed send/receive @@ -1481,7 +1374,7 @@ public async Task SyncAsync_TaskCancelledByException() { // Set up the environment var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1518,7 +1411,7 @@ public async Task SyncAsync_TaskCancelledMidway() { // Set up the environment var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1550,7 +1443,7 @@ public async Task SyncAsync_TaskCancelledMidway() public async Task SyncAsync_TaskCancelledAndRestoreFails_DataNotInSync() { var env = new TestEnvironment(); - env.SetupSFData(true, false, true, false); + env.SetupSFData(false, true, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); env.ParatextService.BackupExists(Arg.Any(), Arg.Any()).Returns(true); @@ -1583,12 +1476,12 @@ public async Task SyncAsync_TaskCancelledPrematurely() { // Set up the environment var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); // Cancel the token before awaiting the task - cancellationTokenSource.Cancel(); + await cancellationTokenSource.CancelAsync(); // Run the task await env.Runner.RunAsync("project01", "user01", "project01", false, cancellationTokenSource.Token); @@ -1607,7 +1500,7 @@ public async Task SyncAsync_TaskCancelledExecutesRollback() { // Set up the environment var env = new TestEnvironment(substituteRealtimeService: true); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1646,7 +1539,7 @@ public async Task SyncAsync_ExcludesPropertiesFromTransactions() { // Set up the environment var env = new TestEnvironment(substituteRealtimeService: true); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1685,7 +1578,7 @@ public async Task SyncAsync_TaskCancelledTooLate() { // Set up the environment var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); using var cancellationTokenSource = new CancellationTokenSource(); @@ -1817,7 +1710,7 @@ public async Task SyncAsync_UpdatesParatextComments() { var env = new TestEnvironment(); var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); const string dataId = "dataId01"; env.SetupNoteChanges(dataId, "thread01", "MAT 1:1", false); @@ -1858,7 +1751,7 @@ public async Task SyncAsync_AddParatextComments() { var env = new TestEnvironment(); var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); Book[] books = [book]; env.AddParatextNoteThreadData(books, true, true); @@ -1909,7 +1802,7 @@ await env public async Task SyncAsync_SavesNewParatextUser() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, true); + env.SetupSFData(false, false, true); env.SetupPTData(new Book("MAT", 1, true)); SFProject project = env.GetProject(); Assert.That(project.ParatextUsers.Select(u => u.Username), Is.EquivalentTo(["User 1", "User 2"])); @@ -1938,7 +1831,7 @@ public async Task SyncAsync_SavesNewParatextUser() public async Task SyncAsync_UpdatesParatextUserRole() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, true); + env.SetupSFData(false, false, true); env.SetupPTData(new Book("MAT", 1, true)); SFProject project = env.GetProject(); Assert.That(project.ParatextUsers.Select(u => u.Username), Is.EquivalentTo(new[] { "User 1", "User 2" })); @@ -1966,7 +1859,7 @@ public async Task SyncAsync_UpdatesParatextUserRole() public async Task SyncAsync_UpdatesExistingParatextUser() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, true); + env.SetupSFData(false, false, true); env.SetupPTData(new Book("MAT", 1, true)); SFProject project = env.GetProject(); Assert.That(project.ParatextUsers.Select(u => u.Username), Is.EquivalentTo(new[] { "User 1", "User 2" })); @@ -1996,7 +1889,7 @@ public async Task SyncAsync_UpdatesExistingParatextUser() public async Task SyncAsync_UpdatesRoleIfUserNoLongerAMember() { var env = new TestEnvironment(); - env.SetupSFData(false, false, false, true); + env.SetupSFData(false, false, true); env.SetupPTData(new Book("MAT", 1, true)); SFProject project = env.GetProject(); Assert.That(project.ParatextUsers.Select(u => u.Username), Is.EquivalentTo(new[] { "User 1", "User 2" })); @@ -2017,7 +1910,7 @@ public async Task SyncAsync_UpdatesParatextNoteThreadDoc() { var env = new TestEnvironment(); var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); const string dataId = "dataId01"; NoteThread thread01Before = env.GetNoteThread("project01", "dataId01"); @@ -2072,7 +1965,7 @@ public async Task SyncAsync_ParatextNoteThreadReattached() { var env = new TestEnvironment(); var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); string dataId = "dataId01"; string threadId = "thread01"; @@ -2103,7 +1996,7 @@ public async Task SyncAsync_NewBook_AddParatextNoteThreadDoc() { var env = new TestEnvironment(); var book = new Book("MAT", 1); - env.SetupSFData(false, true, false, false); + env.SetupSFData(true, false, false); env.SetupPTData(book); env.SetupNewNoteThreadChange("thread02", "syncuser01"); @@ -2136,7 +2029,7 @@ public async Task SyncAsync_AddParatextNoteThreadDoc() { var env = new TestEnvironment(); var book = new Book("MAT", 3, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); env.SetupNewNoteThreadChange("thread02", "syncuser01"); string dataId = "dataId02"; @@ -2192,7 +2085,7 @@ public async Task SyncAsync_RemovesNoteFromThreadDoc() string threadId = "thread01"; string dataId = "dataId01"; var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); List beginningNoteSet = env.GetNoteThread(sfProjectId, dataId).Notes; beginningNoteSet.Add( new Note @@ -2259,7 +2152,7 @@ public async Task SyncAsync_RemovesMultipleNotesFromThreadDoc() string threadId = "thread01"; string dataId = "dataId01"; var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); List beginningNoteSet = env.GetNoteThread(sfProjectId, dataId).Notes; beginningNoteSet.Add( new Note @@ -2300,7 +2193,7 @@ public async Task SyncAsync_NoteThreadDeleted() { var env = new TestEnvironment(); var book = new Book("MAT", 1); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); env.SetupNoteRemovedChange("dataId01", "thread01", ["n01", "n02"]); @@ -2320,7 +2213,7 @@ public async Task SyncAsync_NoteThreadsGetResolved() { var env = new TestEnvironment(); var book = new Book("MAT", 3, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); string threadId = "thread02"; string dataId = "dataId02"; @@ -2384,7 +2277,7 @@ public async Task SyncAsync_NoteChange_None() // Set up some PT and SF project data, including a Note. string projectId = "project01"; var book = new Book("MAT", 3, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); string threadId = "thread01"; string dataId = "dataId01"; @@ -2454,7 +2347,7 @@ public async Task SyncAsync_ResourceChanged() { // Setup the environment so there will be Paratext changes var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 3), new Book("MRK", 1)); // Setup the environment so the Paratext service will return that the resource has changed @@ -2508,7 +2401,7 @@ public async Task SyncAsync_ResourceNotChanged() { // Setup the environment so there will be no Paratext changes var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); // Setup the environment so the Paratext service will return that the resource has not changed @@ -2557,7 +2450,7 @@ await env public async Task SyncAsync_SyncMetricsSetsDateStartedAndDateFinished() { var env = new TestEnvironment(); - env.SetupSFData(true, true, true, false); + env.SetupSFData(true, true, false); await env.Runner.RunAsync("project01", "user03", "project01", false, CancellationToken.None); @@ -2574,7 +2467,7 @@ public async Task SyncAsync_SyncMetricsSetsDateStartedAndDateFinished() public async Task SyncAsync_SyncMetricsRecordsLogs() { var env = new TestEnvironment(); - env.SetupSFData(true, true, true, false); + env.SetupSFData(true, true, false); await env.Runner.RunAsync("project01", "user03", "project01", false, CancellationToken.None); @@ -2589,7 +2482,7 @@ public async Task SyncAsync_SyncMetricsRecordsLogs() public async Task SyncAsync_SyncMetricsRecordsBackupCreated() { var env = new TestEnvironment(); - env.SetupSFData(true, true, true, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, true, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 2), new Book("MRK", 2)); // Simulate that there is no backup, and that the backups are created successfully @@ -2613,7 +2506,7 @@ public async Task SyncAsync_SyncMetricsRecordsParatextNotes() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); var syncMetricInfo = new SyncMetricInfo(1, 2, 3); env.ParatextService.PutNotes(Arg.Any(), "target", Arg.Any()).Returns(syncMetricInfo); @@ -2634,7 +2527,7 @@ public async Task SyncAsync_SyncMetricsRecordsParatextBooks() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); env.ParatextService.PutBookText( Arg.Any(), @@ -2672,7 +2565,7 @@ public async Task SyncAsync_OnlyTargetParatextUsersAreGivenResourceAccess() { // Setup the environment so there will be Paratext changes var env = new TestEnvironment(); - env.SetupSFData(true, true, false, false, new Book("MAT", 2), new Book("MRK", 2)); + env.SetupSFData(true, false, false, new Book("MAT", 2), new Book("MRK", 2)); env.SetupPTData(new Book("MAT", 3), new Book("MRK", 1)); // Make user02 an SF only user @@ -2716,7 +2609,7 @@ public async Task SyncAsync_BiblicalTermsAreUpdated() { var env = new TestEnvironment(); Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - env.SetupSFData(true, true, true, false, books); + env.SetupSFData(true, true, false, books); env.SetupPTData(books); env.ParatextService.UpdateBiblicalTerms( @@ -2887,7 +2780,7 @@ public async Task SyncAsync_AddParatextBiblicalTermNotes() { var env = new TestEnvironment(); var book = new Book("MAT", 1, true); - env.SetupSFData(true, false, false, true, book); + env.SetupSFData(false, false, true, book); env.SetupPTData(book); Book[] books = [book]; env.AddParatextNoteThreadData(books, true, true, true); @@ -3333,7 +3226,6 @@ public async Task CoreRoundtrip_NoUnexpectedDataChanges() DefaultFont = ProjectSettings.defaultFontName, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = false, Source = new TranslateSource { ParatextId = "source", @@ -3805,29 +3697,12 @@ public TextInfo SetupChapterAuthorsAndGetTextInfo(bool setChapterPermissions) return textInfo; } - public void SetupSFData( - bool translationSuggestionsEnabled, - bool checkingEnabled, - bool changed, - bool noteOnFirstBook, - params Book[] books - ) - { - SetupSFData( - "project01", - "project02", - translationSuggestionsEnabled, - checkingEnabled, - changed, - noteOnFirstBook, - books - ); - } + public void SetupSFData(bool checkingEnabled, bool changed, bool noteOnFirstBook, params Book[] books) => + SetupSFData("project01", "project02", checkingEnabled, changed, noteOnFirstBook, books); public void SetupSFData( string targetProjectSFId, string sourceProjectSFId, - bool translationSuggestionsEnabled, bool checkingEnabled, bool changed, bool noteOnFirstBook, @@ -3876,7 +3751,6 @@ params Book[] books DefaultFont = ProjectSettings.defaultFontName, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = translationSuggestionsEnabled, Source = new TranslateSource { ParatextId = "source", @@ -3929,7 +3803,6 @@ params Book[] books UserRoles = [], ParatextId = "source", IsRightToLeft = false, - TranslateConfig = new TranslateConfig { TranslationSuggestionsEnabled = false }, NoteTags = [], CheckingConfig = new CheckingConfig { @@ -3956,7 +3829,6 @@ params Book[] books IsRightToLeft = false, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = translationSuggestionsEnabled, Source = new TranslateSource { ParatextId = "paratext-project04", @@ -4004,7 +3876,6 @@ params Book[] books UserRoles = [], ParatextId = "paratext-project04", IsRightToLeft = false, - TranslateConfig = new TranslateConfig { TranslationSuggestionsEnabled = false }, CheckingConfig = new CheckingConfig { CheckingEnabled = checkingEnabled, @@ -4036,7 +3907,6 @@ params Book[] books IsRightToLeft = false, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = translationSuggestionsEnabled, Source = new TranslateSource { ParatextId = "paratext-project04", @@ -4436,7 +4306,7 @@ T newData // Set up some PT and SF project data, including a note. string projectId = "project01"; var book = new Book("MAT", 3, true); - SetupSFData(true, false, false, true, book); + SetupSFData(false, false, true, book); SetupPTData(book); string dataId = "dataId01"; string threadId = "thread01"; @@ -4544,14 +4414,12 @@ public SFProject SetupProjectWithExpectedImportedRev( ) { Book[] books = [new Book("MAT", 2), new Book("MRK", 2)]; - bool translationSuggestionsEnabled = false; bool checkingEnabled = true; bool changed = true; bool hasNoteThreads = false; SetupSFData( targetProjectSFId: projectSFId, sourceProjectSFId: "project04", - translationSuggestionsEnabled, checkingEnabled, changed, hasNoteThreads, diff --git a/test/SIL.XForge.Scripture.Tests/Services/PreTranslationServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/PreTranslationServiceTests.cs index 956b0afc593..455835f5a4b 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/PreTranslationServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/PreTranslationServiceTests.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -16,41 +15,9 @@ namespace SIL.XForge.Scripture.Services; public class PreTranslationServiceTests { private const string Project01 = "project01"; - private const string Corpus01 = "corpus01"; private const string ParallelCorpus01 = "parallelCorpus01"; private const string TranslationEngine01 = "translationEngine01"; - [Test] - public async Task GetPreTranslationParametersAsync_CompatibleWithLegacyCorpora() - { - // Set up test environment - var env = new TestEnvironment(); - await env.SetupProjectSecretAsync( - new ServalData - { - PreTranslationEngineId = TranslationEngine01, - Corpora = new Dictionary - { - { - "another_corpus", - new ServalCorpus { PreTranslate = false } - }, - { - Corpus01, - new ServalCorpus { PreTranslate = true } - }, - }, - } - ); - - // SUT - (string translationEngineId, string? corpusId, string? parallelCorpusId) = - await env.Service.GetPreTranslationParametersAsync(Project01); - Assert.AreEqual(TranslationEngine01, translationEngineId); - Assert.AreEqual(Corpus01, corpusId); - Assert.IsNull(parallelCorpusId); - } - [Test] public async Task GetPreTranslationParametersAsync_CompatibleWithParallelCorpora() { @@ -65,10 +32,10 @@ await env.SetupProjectSecretAsync( ); // SUT - (string translationEngineId, string? corpusId, string? parallelCorpusId) = - await env.Service.GetPreTranslationParametersAsync(Project01); + (string translationEngineId, string parallelCorpusId) = await env.Service.GetPreTranslationParametersAsync( + Project01 + ); Assert.AreEqual(TranslationEngine01, translationEngineId); - Assert.IsNull(corpusId); Assert.AreEqual(ParallelCorpus01, parallelCorpusId); } @@ -117,37 +84,6 @@ public void GetPreTranslationParametersAsync_ThrowsExceptionWhenProjectSecretMis ); } - [Test] - [Obsolete("Uses legacy corpus")] - public async Task GetPreTranslationUsfmAsync_LegacyCorpus() - { - // Set up test environment - var env = new TestEnvironment(new TestEnvironmentOptions { MockLegacyPreTranslationParameters = true }); - env.TranslationEnginesClient.GetCorpusPretranslatedUsfmAsync( - id: Arg.Any(), - corpusId: Arg.Any(), - textId: "MAT", - textOrigin: PretranslationUsfmTextOrigin.OnlyPretranslated, - template: PretranslationUsfmTemplate.Source, - paragraphMarkerBehavior: Arg.Any(), - embedBehavior: PretranslationUsfmMarkerBehavior.Strip, - styleMarkerBehavior: PretranslationUsfmMarkerBehavior.Strip, - quoteNormalizationBehavior: Arg.Any(), - cancellationToken: CancellationToken.None - ) - .Returns(TestEnvironment.MatthewBookUsfm); - - // SUT - string usfm = await env.Service.GetPreTranslationUsfmAsync( - Project01, - 40, - 0, - new DraftUsfmConfig(), - CancellationToken.None - ); - Assert.AreEqual(TestEnvironment.MatthewBookUsfm, usfm); - } - [Test] public async Task GetPreTranslationUsfmAsync_ReturnsEntireBook() { @@ -345,20 +281,6 @@ public async Task GetPreTranslationUsfmAsync_ReturnsEmptyStringForMissingChapter Assert.IsEmpty(usfm); } - [Test] - public async Task GetVerseConfidencesAsync_LegacyCorpus() - { - // Set up test environment - var env = new TestEnvironment(new TestEnvironmentOptions { MockLegacyPreTranslationParameters = true }); - - // SUT - IEnumerable actual = await env.Service.GetVerseConfidencesAsync( - Project01, - CancellationToken.None - ); - Assert.IsEmpty(actual); - } - [Test] public async Task GetVerseConfidencesAsync_Success() { @@ -377,7 +299,6 @@ .. await env.Service.GetVerseConfidencesAsync(Project01, CancellationToken.None) private class TestEnvironmentOptions { - public bool MockLegacyPreTranslationParameters { get; init; } public bool MockPreTranslationParameters { get; init; } } @@ -467,21 +388,12 @@ public TestEnvironment(TestEnvironmentOptions? options = null) ]) ); Service = Substitute.ForPartsOf(ProjectSecrets, TranslationEnginesClient); - if (options.MockLegacyPreTranslationParameters) - { - Service - .Configure() - .GetPreTranslationParametersAsync(Project01) - .Returns(Task.FromResult<(string, string?, string?)>((TranslationEngine01, Corpus01, null))); - } - else if (options.MockPreTranslationParameters) + if (options.MockPreTranslationParameters) { Service .Configure() .GetPreTranslationParametersAsync(Project01) - .Returns( - Task.FromResult<(string, string?, string?)>((TranslationEngine01, null, ParallelCorpus01)) - ); + .Returns(Task.FromResult<(string, string)>((TranslationEngine01, ParallelCorpus01))); } } diff --git a/test/SIL.XForge.Scripture.Tests/Services/SFProjectServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/SFProjectServiceTests.cs index d856fc44449..f6033608cf8 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/SFProjectServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/SFProjectServiceTests.cs @@ -2541,12 +2541,6 @@ await env.Service.UpdateSettingsAsync( Assert.That(draftingSourceProject.ParatextId, Is.EqualTo(newResourceParatextId)); Assert.That(draftingSourceProject.Name, Is.EqualTo("ResourceProject")); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.Received(1).SyncAsync(Arg.Any()); // Check that the project was created @@ -2628,12 +2622,6 @@ await env.Service.UpdateSettingsAsync( Assert.That(project.ParatextId, Is.EqualTo(paratextId)); Assert.That(project.TranslateConfig.DraftConfig.DraftingSources, Is.Empty); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.DidNotReceive().SyncAsync(Arg.Any()); } @@ -2670,12 +2658,6 @@ await env.Service.UpdateSettingsAsync( Assert.That(draftingSourceProject.ParatextId, Is.EqualTo(newProjectParatextId)); Assert.That(draftingSourceProject.Name, Is.EqualTo("NewSource")); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.Received(1).SyncAsync(Arg.Any()); // Check that the project was created @@ -2737,12 +2719,6 @@ await env.Service.UpdateSettingsAsync( Assert.That(project.ParatextId, Is.EqualTo(paratextId)); Assert.That(project.TranslateConfig.DraftConfig.TrainingSources, Is.Empty); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.DidNotReceive().SyncAsync(Arg.Any()); } @@ -2778,12 +2754,6 @@ await env.Service.UpdateSettingsAsync( Assert.That(trainingSourceProject.ParatextId, Is.EqualTo(newProjectParatextId)); Assert.That(trainingSourceProject.Name, Is.EqualTo("NewSource")); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.Received(1).SyncAsync(Arg.Any()); // Check that the project was created @@ -2889,22 +2859,18 @@ public async Task UpdateSettingsAsync_ChangeSourceProject_RecreateMachineProject await env.Service.UpdateSettingsAsync( User01, Project01, - new SFProjectSettings { SourceParatextId = "changedId", TranslationSuggestionsEnabled = true } + new SFProjectSettings { SourceParatextId = "changedId" } ); SFProject project = env.GetProject(Project01); Assert.That(project.TranslateConfig.Source.ParatextId, Is.EqualTo("changedId")); Assert.That(project.TranslateConfig.Source.Name, Is.EqualTo("NewSource")); - await env - .MachineProjectService.Received() - .RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); - await env.MachineProjectService.Received().AddSmtProjectAsync(Project01, CancellationToken.None); await env.SyncService.Received().SyncAsync(Arg.Any()); } [Test] - public async Task UpdateSettingsAsync_SelectSourceProject_NoMachineProjectAndSync() + public async Task UpdateSettingsAsync_SelectSourceProject_Sync() { var env = new TestEnvironment(); await env.Service.UpdateSettingsAsync( @@ -2914,64 +2880,25 @@ await env.Service.UpdateSettingsAsync( ); SFProject project = env.GetProject(Project02); - Assert.That(project.TranslateConfig.TranslationSuggestionsEnabled, Is.False); - Assert.That(project.TranslateConfig.Source.ParatextId, Is.EqualTo("changedId")); + Assert.That(project.TranslateConfig.Source!.ParatextId, Is.EqualTo("changedId")); Assert.That(project.TranslateConfig.Source.Name, Is.EqualTo("NewSource")); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); - await env.SyncService.Received().SyncAsync(Arg.Any()); - } - - [Test] - public async Task UpdateSettingsAsync_EnableTranslate_CreateMachineProjectAndSync() - { - var env = new TestEnvironment(); - await env.Service.UpdateSettingsAsync( - User01, - Project03, - new SFProjectSettings { TranslationSuggestionsEnabled = true } - ); - - SFProject project = env.GetProject(Project03); - Assert.That(project.TranslateConfig.TranslationSuggestionsEnabled, Is.True); - Assert.That(project.TranslateConfig.Source.Name, Is.EqualTo("Source Only Project")); - - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env.MachineProjectService.Received().AddSmtProjectAsync(Project03, CancellationToken.None); await env.SyncService.Received().SyncAsync(Arg.Any()); } [Test] - public async Task UpdateSettingsAsync_UnsetSourceProject_RemoveMachineProjectAndSync() + public async Task UpdateSettingsAsync_UnsetSourceProject_Sync() { var env = new TestEnvironment(); await env.Service.UpdateSettingsAsync( User01, Project01, - new SFProjectSettings - { - SourceParatextId = SFProjectService.ProjectSettingValueUnset, - TranslationSuggestionsEnabled = false, - } + new SFProjectSettings { SourceParatextId = SFProjectService.ProjectSettingValueUnset } ); SFProject project = env.GetProject(Project01); - Assert.That(project.TranslateConfig.TranslationSuggestionsEnabled, Is.False); Assert.That(project.TranslateConfig.Source, Is.Null); - await env - .MachineProjectService.Received() - .RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.Received().SyncAsync(Arg.Any()); } @@ -2985,12 +2912,6 @@ public async Task UpdateSettingsAsync_EnableChecking_Sync() SFProject project = env.GetProject(Project01); Assert.That(project.CheckingConfig.CheckingEnabled, Is.True); - await env - .MachineProjectService.DidNotReceive() - .RemoveProjectAsync(Arg.Any(), Arg.Any(), Arg.Any()); - await env - .MachineProjectService.DidNotReceive() - .AddSmtProjectAsync(Arg.Any(), Arg.Any()); await env.SyncService.Received().SyncAsync(Arg.Any()); } @@ -3044,9 +2965,7 @@ await env Assert.That(env.ContainsProject(Project01), Is.False); User user = env.GetUser(User01); Assert.That(user.Sites[SiteId].Projects, Does.Not.Contain(Project01)); - await env - .MachineProjectService.Received() - .RemoveProjectAsync(Project01, preTranslate: false, CancellationToken.None); + await env.MachineProjectService.Received().RemoveProjectAsync(Project01, CancellationToken.None); env.FileSystemService.Received().DeleteDirectory(ptProjectDir); Assert.That(env.ProjectSecrets.Contains(Project01), Is.False); @@ -3073,9 +2992,7 @@ await env Arg.Any(), Arg.Any() ); - await env - .MachineProjectService.Received() - .RemoveProjectAsync(SourceOnly, preTranslate: false, CancellationToken.None); + await env.MachineProjectService.Received().RemoveProjectAsync(SourceOnly, CancellationToken.None); env.FileSystemService.Received().DeleteDirectory(ptProjectDir); Assert.That(env.ContainsProject(SourceOnly), Is.False); Assert.That(env.GetUser(User01).Sites[SiteId].Projects, Does.Not.Contain(SourceOnly)); @@ -3312,7 +3229,7 @@ public async Task CreateProjectAsync_RequestingPTUserHasPTPermissions() // SUT string sfProjectId = await env.Service.CreateProjectAsync( User03, - new SFProjectCreateSettings() { ParatextId = targetProjectPTId, SourceParatextId = sourceProjectPTId } + new SFProjectCreateSettings { ParatextId = targetProjectPTId, SourceParatextId = sourceProjectPTId } ); SFProject project = env.GetProject(sfProjectId); @@ -3329,7 +3246,7 @@ public async Task CreateProjectAsync_RequestingPTUserHasPTPermissions() // permissions on them. await env .SyncService.Received() - .SyncAsync(Arg.Is(s => s.ProjectId == sfProjectId && !s.TrainEngine && s.UserId == User03)); + .SyncAsync(Arg.Is(s => s.ProjectId == sfProjectId && s.UserId == User03)); // Don't check that permissions were added to the target project, because we mock the Sync functionality. // But we can show that source resource permissions were set: @@ -5336,7 +5253,6 @@ public TestEnvironment() TranslateConfig = new TranslateConfig { PreTranslate = true, - TranslationSuggestionsEnabled = true, Source = new TranslateSource { ProjectRef = Resource01, @@ -5501,7 +5417,6 @@ public TestEnvironment() CheckingConfig = new CheckingConfig { CheckingEnabled = true }, TranslateConfig = { - TranslationSuggestionsEnabled = false, Source = new TranslateSource { ProjectRef = SourceOnly, @@ -5529,7 +5444,6 @@ public TestEnvironment() ParatextId = "paratext_" + Project04, TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = true, Source = new TranslateSource { ProjectRef = "Invalid_Source", ParatextId = "P04" }, }, RolePermissions = @@ -5553,7 +5467,6 @@ public TestEnvironment() ShortName = "P05", TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = true, Source = new TranslateSource { ProjectRef = Resource01, diff --git a/test/SIL.XForge.Scripture.Tests/Services/SyncServiceTests.cs b/test/SIL.XForge.Scripture.Tests/Services/SyncServiceTests.cs index f84ff3a5bdb..43ede37a8e5 100644 --- a/test/SIL.XForge.Scripture.Tests/Services/SyncServiceTests.cs +++ b/test/SIL.XForge.Scripture.Tests/Services/SyncServiceTests.cs @@ -1,4 +1,3 @@ -#nullable disable warnings using System; using System.Linq; using System.Threading.Tasks; @@ -161,14 +160,7 @@ public async Task SyncAsync_DoesNotTrainWhenNoSource() env.BackgroundJobClient.Create(Arg.Any(), Arg.Any()).Returns("jobid"); // Run sync - await env.Service.SyncAsync( - new SyncConfig - { - ProjectId = Project01, - UserId = "userid", - TrainEngine = true, - } - ); + await env.Service.SyncAsync(new SyncConfig { ProjectId = Project01, UserId = "userid" }); // Verify that only a sync for the target was received env.BackgroundJobClient.Received(1).Create(Arg.Any(), Arg.Any()); @@ -228,32 +220,6 @@ await env.Service.SyncAsync( Assert.That(env.SyncMetrics.Query().Count(s => s.ProjectRef == Project03), Is.EqualTo(1)); } - [Test] - public async Task SyncAsync_EnqueuesTrainingJob() - { - // Set up test environment - var env = new TestEnvironment(); - env.BackgroundJobClient.Create(Arg.Any(), Arg.Any()).Returns("jobid"); - - // Run sync - await env.Service.SyncAsync( - new SyncConfig - { - ProjectId = Project03, - UserId = "userid", - TrainEngine = true, - } - ); - - // Verify that three jobs were created - source, target, and training - env.BackgroundJobClient.Received(3).Create(Arg.Any(), Arg.Any()); - - // Verify the project secret - Assert.That(env.ProjectSecrets.Get(Project03).JobIds.Count, Is.EqualTo(1)); - Assert.That(env.ProjectSecrets.Get(Project03).ServalData?.TranslationQueuedAt, Is.Not.Null); - Assert.That(env.ProjectSecrets.Get(Project03).ServalData?.TranslationJobId, Is.Not.Null); - } - [Test] public async Task SyncAsync_EnqueuesSourceAndTarget() { @@ -551,25 +517,25 @@ public void SyncAsync_WarnIfAnomalousQueuedCount() env.Service.WarnIfAnomalousQueuedCount(0, ""); env.MockLogger.AssertNoEvent( - logEvent => logEvent.Message.Contains("QueuedCount"), + logEvent => logEvent.Message!.Contains("QueuedCount"), "No warning should have been logged for reasonable queued count 0." ); env.Service.WarnIfAnomalousQueuedCount(1, ""); env.MockLogger.AssertNoEvent( - logEvent => logEvent.Message.Contains("QueuedCount"), + logEvent => logEvent.Message!.Contains("QueuedCount"), "No warning should have been logged for reasonable queued count 1." ); env.Service.WarnIfAnomalousQueuedCount(-1, ""); env.MockLogger.AssertHasEvent( - logEvent => logEvent.Message.Contains("QueuedCount"), + logEvent => logEvent.Message!.Contains("QueuedCount"), "Warn for unexpected queued count -1." ); env.Service.WarnIfAnomalousQueuedCount(2, ""); env.MockLogger.AssertHasEvent( - logEvent => logEvent.Message.Contains("QueuedCount"), + logEvent => logEvent.Message!.Contains("QueuedCount"), "Warn for less expected queued count 2." ); } @@ -614,7 +580,6 @@ public TestEnvironment() ShortName = "P03", TranslateConfig = new TranslateConfig { - TranslationSuggestionsEnabled = true, Source = new TranslateSource { ProjectRef = Project01 }, }, }, diff --git a/test/SIL.XForge.Scripture.Tests/packages.lock.json b/test/SIL.XForge.Scripture.Tests/packages.lock.json index 67e30f0d9a3..c77b5edc35c 100644 --- a/test/SIL.XForge.Scripture.Tests/packages.lock.json +++ b/test/SIL.XForge.Scripture.Tests/packages.lock.json @@ -1250,8 +1250,8 @@ }, "Serval.Client": { "type": "Transitive", - "resolved": "1.18.0", - "contentHash": "/MdHjylYh96F1/VaU9yJQpVurnAl2gBNvDUuM/C5rwk2/UghqYBTc5yKr+m6sIz3HROlO1TSr9LFz8ITWSf2kQ==", + "resolved": "1.19.0", + "contentHash": "A91+0tRMko9v0XqCBcwHo8FRPyXZPkzgvOHnzqdTBXTq/DGt1nqZDkwyiZfNa/ynkYYn3wejtM4GB80Vmg6qRg==", "dependencies": { "Newtonsoft.Json": "13.0.4", "System.ComponentModel.Annotations": "5.0.0" @@ -1281,8 +1281,8 @@ }, "SIL.Machine": { "type": "Transitive", - "resolved": "3.9.0", - "contentHash": "OdVAM9KLWZDcCS09XHmXG7LXW7388SRv0voZ+3ckrTL6e25+1g3GpTpDE3EbJG8hsOeLVRuadvBgFMsccvZM+w==", + "resolved": "3.9.1", + "contentHash": "w2xPVUaLLuelgsiYwoNnQ758DEEKkiKai72dEEXDoVTvFlKAeHpkZYj2B9+TcPohyRP42kZ8GIr7baOQN9CsRA==", "dependencies": { "CaseExtensions": "1.1.0", "Newtonsoft.Json": "13.0.4", @@ -1694,9 +1694,9 @@ "ParatextData": "[9.5.0.24, )", "Polly": "[8.7.0, )", "SIL.Converters.Usj": "[1.0.0, )", - "SIL.Machine": "[3.9.0, )", + "SIL.Machine": "[3.9.1, )", "SIL.XForge": "[1.0.0, )", - "Serval.Client": "[1.18.0, )", + "Serval.Client": "[1.19.0, )", "Swashbuckle.AspNetCore": "[10.2.3, )", "Swashbuckle.AspNetCore.Newtonsoft": "[10.2.3, )" } diff --git a/tools/ServalBuildReport/ServalBuildReport.csproj b/tools/ServalBuildReport/ServalBuildReport.csproj index 43e385cc5af..efa1d02cfaa 100644 --- a/tools/ServalBuildReport/ServalBuildReport.csproj +++ b/tools/ServalBuildReport/ServalBuildReport.csproj @@ -23,7 +23,7 @@ - + diff --git a/tools/ServalDownloader/ServalDownloader.csproj b/tools/ServalDownloader/ServalDownloader.csproj index 4901164c2c8..a0c4263ce43 100644 --- a/tools/ServalDownloader/ServalDownloader.csproj +++ b/tools/ServalDownloader/ServalDownloader.csproj @@ -22,7 +22,7 @@ - +