From aebe654c38174f11522c9d3a303b97175cfffd24 Mon Sep 17 00:00:00 2001 From: Lisoveliy <1986developer@gmail.com> Date: Mon, 12 May 2025 19:44:33 +0300 Subject: [PATCH] chore: init commit from GitHub --- .github/workflows/docker-deploy.yml | 19 + .github/workflows/dotnet.yml | 26 + .gitignore | 415 +- ApiTest/.gitignore | 365 + ApiTest/ApiTest.csproj | 38 + ApiTest/MusicApi/Spotify.cs | 26 + README.md | 40 +- SWAD.API.sln | 42 + SWAD.API.sln.DotSettings | 3 + SWAD.API/.editorconfig | 4 + SWAD.API/.gitignore | 364 + SWAD.API/Consts/Enums/MusicService.cs | 17 + SWAD.API/Consts/Enums/ServiceResult.cs | 31 + SWAD.API/Consts/ErrorResources.cs | 14 + SWAD.API/Controllers/DTOs/LinkDtos.cs | 39 + SWAD.API/Controllers/LinkController.cs | 111 + SWAD.API/Controllers/ProblemsController.cs | 22 + SWAD.API/Controllers/SwadController.cs | 11 + SWAD.API/Dockerfile | 15 + SWAD.API/Exceptions/TrackNotFoundException.cs | 3 + SWAD.API/Middlewares/ExceptionMiddleware.cs | 90 + .../Config/ApiServices/ApiServicesConfig.cs | 13 + .../Config/ApiServices/Structure/ApiPaths.cs | 10 + .../ApiServices/Structure/ApiServiceData.cs | 12 + .../Structure/ApiServiceEndpoints.cs | 11 + .../Models/Config/ServicesEndpointsConfig.cs | 8 + .../MusicAPI/DefaultAuthResponse.cs | 28 + .../MusicAPI/Spotify/SpotifyAuthResponse.cs | 6 + .../MusicAPI/Spotify/SpotifySearchResponse.cs | 31 + .../MusicAPI/Spotify/SpotifyTrackResponse.cs | 30 + .../MusicAPI/Tidal/TidalArtistResponse.cs | 25 + .../MusicAPI/Tidal/TidalAuthResponse.cs | 3 + .../MusicAPI/Tidal/TidalSearchResponse.cs | 15 + .../MusicAPI/Tidal/TidalTrackResponse.cs | 53 + .../MusicAPI/Yandex/YandexSearchResponse.cs | 268 + .../MusicAPI/Yandex/YandexTrackResponse.cs | 222 + SWAD.API/Program.cs | 34 + SWAD.API/Properties/launchSettings.json | 37 + SWAD.API/SWAD.API.csproj | 37 + SWAD.API/Services/Links/LinksService.cs | 121 + SWAD.API/Services/MusicAPI/Api/ApiService.cs | 35 + .../Services/MusicAPI/Api/SpotifyService.cs | 109 + .../Services/MusicAPI/Api/TidalService.cs | 189 + .../Services/MusicAPI/Api/YandexService.cs | 88 + .../MusicAPI/Auth/AbstractAuthService.cs | 33 + .../MusicAPI/Auth/SpotifyAuthService.cs | 44 + .../MusicAPI/Auth/TidalAuthService.cs | 46 + SWAD.API/Startup.cs | 117 + SWAD.API/appsettings.json | 73 + SWAD.API/doc.xml | 249 + SWAD.API/index.html | 119 + SWAD.API/wwwroot/swagger-ui/theme-flattop.css | 1673 +++ SWAD.code-workspace | 8 + SwapDude.Front/.editorconfig | 16 + SwapDude.Front/.gitignore | 42 + SwapDude.Front/.hintrc | 13 + SwapDude.Front/.vscode/extensions.json | 4 + SwapDude.Front/.vscode/launch.json | 20 + SwapDude.Front/.vscode/tasks.json | 42 + SwapDude.Front/README.md | 27 + SwapDude.Front/angular.json | 99 + SwapDude.Front/package-lock.json | 12343 ++++++++++++++++ SwapDude.Front/package.json | 48 + SwapDude.Front/server.ts | 56 + SwapDude.Front/src/app/app.component.html | 2 + SwapDude.Front/src/app/app.component.scss | 0 SwapDude.Front/src/app/app.component.spec.ts | 29 + SwapDude.Front/src/app/app.component.ts | 14 + SwapDude.Front/src/app/app.config.server.ts | 11 + SwapDude.Front/src/app/app.config.ts | 9 + SwapDude.Front/src/app/app.routes.ts | 3 + .../src/app/pages/home/home.component.html | 4 + .../src/app/pages/home/home.component.scss | 0 .../src/app/pages/home/home.component.spec.ts | 23 + .../src/app/pages/home/home.component.ts | 18 + SwapDude.Front/src/assets/.gitkeep | 0 SwapDude.Front/src/favicon.ico | Bin 0 -> 15086 bytes SwapDude.Front/src/index.html | 13 + SwapDude.Front/src/locale/messages.ru.xlf | 14 + SwapDude.Front/src/locale/messages.xlf | 14 + SwapDude.Front/src/main.server.ts | 7 + SwapDude.Front/src/main.ts | 8 + SwapDude.Front/src/styles.scss | 4 + SwapDude.Front/tsconfig.app.json | 19 + SwapDude.Front/tsconfig.json | 34 + SwapDude.Front/tsconfig.spec.json | 15 + TelegramBot/.gitignore | 366 + TelegramBot/BotHandler.cs | 61 + .../ChangelogCommandMessage.cs | 20 + .../CommandMessages/CommandMessage.cs | 12 + .../CommandMessages/StartCommandMessage.cs | 20 + TelegramBot/Commands/ErrorMessage.cs | 12 + TelegramBot/Commands/IMessage.cs | 11 + TelegramBot/Commands/LinkMessage.cs | 98 + TelegramBot/Config/AppSettings.cs | 15 + TelegramBot/DTOs/GetLink.cs | 15 + TelegramBot/Dockerfile | 15 + TelegramBot/EnumExtensions.cs | 13 + TelegramBot/Program.cs | 71 + TelegramBot/TelegramBot.csproj | 47 + TelegramBot/telegramconfig.json | 16 + docker-compose.yaml | 31 + docker/images/nginx/conf.d/default.conf | 19 + docker/images/nginx/devareapass | 1 + docker/images/nginx/static/index.html | 110 + docker/images/nginx/static/logo.png | Bin 0 -> 99458 bytes docker/images/nginx/static/style.css | 10 + 107 files changed, 18953 insertions(+), 403 deletions(-) create mode 100644 .github/workflows/docker-deploy.yml create mode 100644 .github/workflows/dotnet.yml create mode 100644 ApiTest/.gitignore create mode 100644 ApiTest/ApiTest.csproj create mode 100644 ApiTest/MusicApi/Spotify.cs create mode 100644 SWAD.API.sln create mode 100644 SWAD.API.sln.DotSettings create mode 100644 SWAD.API/.editorconfig create mode 100644 SWAD.API/.gitignore create mode 100644 SWAD.API/Consts/Enums/MusicService.cs create mode 100644 SWAD.API/Consts/Enums/ServiceResult.cs create mode 100644 SWAD.API/Consts/ErrorResources.cs create mode 100644 SWAD.API/Controllers/DTOs/LinkDtos.cs create mode 100644 SWAD.API/Controllers/LinkController.cs create mode 100644 SWAD.API/Controllers/ProblemsController.cs create mode 100644 SWAD.API/Controllers/SwadController.cs create mode 100644 SWAD.API/Dockerfile create mode 100644 SWAD.API/Exceptions/TrackNotFoundException.cs create mode 100644 SWAD.API/Middlewares/ExceptionMiddleware.cs create mode 100644 SWAD.API/Models/Config/ApiServices/ApiServicesConfig.cs create mode 100644 SWAD.API/Models/Config/ApiServices/Structure/ApiPaths.cs create mode 100644 SWAD.API/Models/Config/ApiServices/Structure/ApiServiceData.cs create mode 100644 SWAD.API/Models/Config/ApiServices/Structure/ApiServiceEndpoints.cs create mode 100644 SWAD.API/Models/Config/ServicesEndpointsConfig.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/DefaultAuthResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyAuthResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifySearchResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyTrackResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalArtistResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalAuthResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalSearchResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalTrackResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexSearchResponse.cs create mode 100644 SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexTrackResponse.cs create mode 100644 SWAD.API/Program.cs create mode 100644 SWAD.API/Properties/launchSettings.json create mode 100644 SWAD.API/SWAD.API.csproj create mode 100644 SWAD.API/Services/Links/LinksService.cs create mode 100644 SWAD.API/Services/MusicAPI/Api/ApiService.cs create mode 100644 SWAD.API/Services/MusicAPI/Api/SpotifyService.cs create mode 100644 SWAD.API/Services/MusicAPI/Api/TidalService.cs create mode 100644 SWAD.API/Services/MusicAPI/Api/YandexService.cs create mode 100644 SWAD.API/Services/MusicAPI/Auth/AbstractAuthService.cs create mode 100644 SWAD.API/Services/MusicAPI/Auth/SpotifyAuthService.cs create mode 100644 SWAD.API/Services/MusicAPI/Auth/TidalAuthService.cs create mode 100644 SWAD.API/Startup.cs create mode 100644 SWAD.API/appsettings.json create mode 100644 SWAD.API/doc.xml create mode 100644 SWAD.API/index.html create mode 100644 SWAD.API/wwwroot/swagger-ui/theme-flattop.css create mode 100644 SWAD.code-workspace create mode 100644 SwapDude.Front/.editorconfig create mode 100644 SwapDude.Front/.gitignore create mode 100644 SwapDude.Front/.hintrc create mode 100644 SwapDude.Front/.vscode/extensions.json create mode 100644 SwapDude.Front/.vscode/launch.json create mode 100644 SwapDude.Front/.vscode/tasks.json create mode 100644 SwapDude.Front/README.md create mode 100644 SwapDude.Front/angular.json create mode 100644 SwapDude.Front/package-lock.json create mode 100644 SwapDude.Front/package.json create mode 100644 SwapDude.Front/server.ts create mode 100644 SwapDude.Front/src/app/app.component.html create mode 100644 SwapDude.Front/src/app/app.component.scss create mode 100644 SwapDude.Front/src/app/app.component.spec.ts create mode 100644 SwapDude.Front/src/app/app.component.ts create mode 100644 SwapDude.Front/src/app/app.config.server.ts create mode 100644 SwapDude.Front/src/app/app.config.ts create mode 100644 SwapDude.Front/src/app/app.routes.ts create mode 100644 SwapDude.Front/src/app/pages/home/home.component.html create mode 100644 SwapDude.Front/src/app/pages/home/home.component.scss create mode 100644 SwapDude.Front/src/app/pages/home/home.component.spec.ts create mode 100644 SwapDude.Front/src/app/pages/home/home.component.ts create mode 100644 SwapDude.Front/src/assets/.gitkeep create mode 100644 SwapDude.Front/src/favicon.ico create mode 100644 SwapDude.Front/src/index.html create mode 100644 SwapDude.Front/src/locale/messages.ru.xlf create mode 100644 SwapDude.Front/src/locale/messages.xlf create mode 100644 SwapDude.Front/src/main.server.ts create mode 100644 SwapDude.Front/src/main.ts create mode 100644 SwapDude.Front/src/styles.scss create mode 100644 SwapDude.Front/tsconfig.app.json create mode 100644 SwapDude.Front/tsconfig.json create mode 100644 SwapDude.Front/tsconfig.spec.json create mode 100644 TelegramBot/.gitignore create mode 100644 TelegramBot/BotHandler.cs create mode 100644 TelegramBot/Commands/CommandMessages/ChangelogCommandMessage.cs create mode 100644 TelegramBot/Commands/CommandMessages/CommandMessage.cs create mode 100644 TelegramBot/Commands/CommandMessages/StartCommandMessage.cs create mode 100644 TelegramBot/Commands/ErrorMessage.cs create mode 100644 TelegramBot/Commands/IMessage.cs create mode 100644 TelegramBot/Commands/LinkMessage.cs create mode 100644 TelegramBot/Config/AppSettings.cs create mode 100644 TelegramBot/DTOs/GetLink.cs create mode 100644 TelegramBot/Dockerfile create mode 100644 TelegramBot/EnumExtensions.cs create mode 100644 TelegramBot/Program.cs create mode 100644 TelegramBot/TelegramBot.csproj create mode 100644 TelegramBot/telegramconfig.json create mode 100644 docker-compose.yaml create mode 100644 docker/images/nginx/conf.d/default.conf create mode 100644 docker/images/nginx/devareapass create mode 100644 docker/images/nginx/static/index.html create mode 100644 docker/images/nginx/static/logo.png create mode 100644 docker/images/nginx/static/style.css diff --git a/.github/workflows/docker-deploy.yml b/.github/workflows/docker-deploy.yml new file mode 100644 index 0000000..0e14a34 --- /dev/null +++ b/.github/workflows/docker-deploy.yml @@ -0,0 +1,19 @@ +name: Deploy + +on: + push: + branches: [ "main" ] +jobs: + update: + runs-on: self-hosted + steps: + - name: Update Git Repository + working-directory: /home/swapdude/MainStack + run: | + pwd + git fetch --all + git reset --hard origin/main + - name: Build & Deploy on docker-compose + working-directory: /home/swapdude/MainStack + run: | + docker compose up -d --build diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml new file mode 100644 index 0000000..5c364b5 --- /dev/null +++ b/.github/workflows/dotnet.yml @@ -0,0 +1,26 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: Build Project .NET + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 6.0.x + - name: Restore dependencies + run: dotnet restore + - name: Build + run: dotnet build --no-restore diff --git a/.gitignore b/.gitignore index ed6d1d2..3e8d78c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,402 +1,13 @@ -# ---> VisualStudio -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -# but not Directory.Build.rsp, as it configures directory-level build defaults -!Directory.Build.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml - +################################################################################ +# Данный GITIGNORE-файл был автоматически создан Microsoft(R) Visual Studio. +################################################################################ + +/SWAD.API/appsettings.local.json +/SWAD.API/appsettings.Development.json +.vs +.idea + +#Rider sucks +.idea/.idea.SWAD.API/.idea/workspace.xml +SWAD.Front/node_modules +TelegramBot/obj \ No newline at end of file diff --git a/ApiTest/.gitignore b/ApiTest/.gitignore new file mode 100644 index 0000000..4521be4 --- /dev/null +++ b/ApiTest/.gitignore @@ -0,0 +1,365 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# DocFx +/.vscode/ +log/ +obj/ +_site/ +.optemp/ +_themes/ +_themes.MSDN.Modern/ +_themes.VS.Modern/ + +.openpublishing.buildcore.ps1 +.openpublishing.redirection.sorted.json + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Folder configuration on Mac +.DS_Store + +# Custom added by ghogen +settings.json \ No newline at end of file diff --git a/ApiTest/ApiTest.csproj b/ApiTest/ApiTest.csproj new file mode 100644 index 0000000..fa275a0 --- /dev/null +++ b/ApiTest/ApiTest.csproj @@ -0,0 +1,38 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + + + + true + PreserveNewest + PreserveNewest + + + + diff --git a/ApiTest/MusicApi/Spotify.cs b/ApiTest/MusicApi/Spotify.cs new file mode 100644 index 0000000..e49014e --- /dev/null +++ b/ApiTest/MusicApi/Spotify.cs @@ -0,0 +1,26 @@ +using FluentAssertions; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Services.MusicAPI.Auth; + +namespace ApiTest.MusicApi; + +public class Spotify +{ + [Test] + public async Task SpotifyAuthTest() + { + var confbuilder = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory) + .AddJsonFile("appsettings.json") + .Build().GetSection(ApiServicesConfig.ConfigName); + //throw new Exception(Environment.CurrentDirectory); + IOptions config = new OptionsWrapper(confbuilder.Get()); + var authService = new SpotifyAuthService(config); + var authResponse = await authService.GetToken(); + authResponse.Should() + .NotBeNull(); + authResponse.Token.Should() + .NotBeNull(); + } +} \ No newline at end of file diff --git a/README.md b/README.md index da8c7ae..728346e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,41 @@ # SwapDude +Platform for sharing music links from one music service to another for free! -SwapDude - Platform for sharing music links from one music service to another for free! \ No newline at end of file +![build dotnet](https://github.com/SpectruMProjects/SwapDude/actions/workflows/dotnet.yml/badge.svg) +## Supported Services*: + +- [X] Spotify +- [ ] Deezer +- [X] Tidal +- [ ] Apple Music +- [X] Yandex.Music +- [ ] VK/BOOM +- ~~SoundCloud~~ + +_*Where_ ☑ _is released and_ ☐ _in development or ~~not planned~~_ +## Features*: + +- [ ] Creating link for multiplie services +- [X] Finding links with track on another services +- [ ] Proxy links to service based on your SWAD account + +_*Where_ ☑ _is released and_ ☐ _in development._ + +## Source code: + ### Stack: + #### Angular (Front-end SPA) + ##### Projects: + SWAD.Front + #### C# Asp.NET (Back-end REST API) + ##### Projects: + SWAD.API + ### Build: + + ```docker compose up``` + + So i think you are not so stupid to guess it yourself. Enjoy! + +## Problem songs: +https://open.spotify.com/track/0IF9nrOlmE3iVKRkJ1QkuQ - (Possible latin symbols instead cyrilic) + +response: not found diff --git a/SWAD.API.sln b/SWAD.API.sln new file mode 100644 index 0000000..762fef4 --- /dev/null +++ b/SWAD.API.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34330.188 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SWAD.API", ".\SWAD.API\SWAD.API.csproj", "{36313BFE-46A8-44E7-BD08-2652A90C03D1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{30A2E1AB-5617-47D9-9FB5-F441645C4513}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiTest", "ApiTest\ApiTest.csproj", "{DF986307-4329-49A6-926E-C23D34C65173}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelegramBot", "TelegramBot\TelegramBot.csproj", "{E4B6CD72-213C-404C-824F-3A74C1722EAD}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {36313BFE-46A8-44E7-BD08-2652A90C03D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36313BFE-46A8-44E7-BD08-2652A90C03D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36313BFE-46A8-44E7-BD08-2652A90C03D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36313BFE-46A8-44E7-BD08-2652A90C03D1}.Release|Any CPU.Build.0 = Release|Any CPU + {DF986307-4329-49A6-926E-C23D34C65173}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF986307-4329-49A6-926E-C23D34C65173}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF986307-4329-49A6-926E-C23D34C65173}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF986307-4329-49A6-926E-C23D34C65173}.Release|Any CPU.Build.0 = Release|Any CPU + {E4B6CD72-213C-404C-824F-3A74C1722EAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4B6CD72-213C-404C-824F-3A74C1722EAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4B6CD72-213C-404C-824F-3A74C1722EAD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4B6CD72-213C-404C-824F-3A74C1722EAD}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {31ECAE7B-5C42-4C80-A7F8-81DADD6DAD8E} + EndGlobalSection +EndGlobal diff --git a/SWAD.API.sln.DotSettings b/SWAD.API.sln.DotSettings new file mode 100644 index 0000000..a7e9cae --- /dev/null +++ b/SWAD.API.sln.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/SWAD.API/.editorconfig b/SWAD.API/.editorconfig new file mode 100644 index 0000000..368178d --- /dev/null +++ b/SWAD.API/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CS1591: Отсутствует комментарий XML для открытого видимого типа или члена +dotnet_diagnostic.CS1591.severity = none diff --git a/SWAD.API/.gitignore b/SWAD.API/.gitignore new file mode 100644 index 0000000..50c27b3 --- /dev/null +++ b/SWAD.API/.gitignore @@ -0,0 +1,364 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# DocFx +/.vscode/ +log/ +obj/ +_site/ +.optemp/ +_themes/ +_themes.MSDN.Modern/ +_themes.VS.Modern/ + +.openpublishing.buildcore.ps1 +.openpublishing.redirection.sorted.json + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Folder configuration on Mac +.DS_Store + +appsettings.Development.json \ No newline at end of file diff --git a/SWAD.API/Consts/Enums/MusicService.cs b/SWAD.API/Consts/Enums/MusicService.cs new file mode 100644 index 0000000..0211c1d --- /dev/null +++ b/SWAD.API/Consts/Enums/MusicService.cs @@ -0,0 +1,17 @@ +namespace SWAD.API.Consts.Enums; + +public enum MusicService +{ + /// + /// Spotify Service + /// + Spotify, + /// + /// Tidal Service + /// + Tidal, + /// + /// Yandex Service + /// + Yandex +} \ No newline at end of file diff --git a/SWAD.API/Consts/Enums/ServiceResult.cs b/SWAD.API/Consts/Enums/ServiceResult.cs new file mode 100644 index 0000000..11f2f89 --- /dev/null +++ b/SWAD.API/Consts/Enums/ServiceResult.cs @@ -0,0 +1,31 @@ +namespace SWAD.API.Consts.Enums; + +/// +/// Service errors for controller +/// +public enum ServiceResult +{ + /// + /// Returns on the successful executed state + /// + Success, + + /// + /// Returns on the unsuccessful executed state + /// + Failure, + + /// + /// Returns on the unsuccessful executed state not by code + /// + NoResponse, + + /// + /// Returns on the unsuccessful executed state by user + /// + BadRequest, + /// + /// Returns on the unsuccessful executed state by service + /// + NotFound +} \ No newline at end of file diff --git a/SWAD.API/Consts/ErrorResources.cs b/SWAD.API/Consts/ErrorResources.cs new file mode 100644 index 0000000..238f53e --- /dev/null +++ b/SWAD.API/Consts/ErrorResources.cs @@ -0,0 +1,14 @@ +namespace SWAD.API.Consts; + +public static class ErrorResources +{ + public const string SomethingWentWrong = "I don't know what but something went wrong"; + public const string ApiNotRespond = "Service provider not respond, please try later"; + public const string BadRequest = "Oops, request is bad, dude!"; + public const string Unknown = "Problem really unknown... I don't even know what else to say"; + public const string NotFound = "That service is really dummy, man... Not found that track"; + + //For exceptions + + public const string Unsuccessful = "Request unsuccessful"; +} \ No newline at end of file diff --git a/SWAD.API/Controllers/DTOs/LinkDtos.cs b/SWAD.API/Controllers/DTOs/LinkDtos.cs new file mode 100644 index 0000000..bfecf3f --- /dev/null +++ b/SWAD.API/Controllers/DTOs/LinkDtos.cs @@ -0,0 +1,39 @@ +using System.ComponentModel.DataAnnotations; +using SWAD.API.Consts.Enums; + +namespace SWAD.API.Controllers.DTOs; + +/// +/// Track directly from query +/// +/// Name of track +/// Artist of track +/// AlbumObject of track +/// Service provider +public record TrackDto([Required] string Name, [Required] string Artist, string Album, MusicService Service); + +/// +/// Track from service link +/// +/// +/// Spotify example: https://open.spotify.com/track/2K7xn816oNHJZ0aVqdQsha +/// Tidal example: https://tidal.com/track/294942856 +/// Yandex.Music example: https://music.yandex.by/Albums/25851387/track/113810002 P.S.: Будда какая параша, даже тут +/// яндекс отличился +/// +/// +/// +public record TrackLinkDto([Required] string Link, [Required] MusicService Service); + +/// +/// Service Name +/// +/// Enum MusicService +/// MusicService.ToString +public record ServiceDto(MusicService Service, string Name); + +/// +/// Result of GetLink method +/// +/// +public record LinkResultDto(string? Link); \ No newline at end of file diff --git a/SWAD.API/Controllers/LinkController.cs b/SWAD.API/Controllers/LinkController.cs new file mode 100644 index 0000000..2ed50d7 --- /dev/null +++ b/SWAD.API/Controllers/LinkController.cs @@ -0,0 +1,111 @@ +using System.ComponentModel.DataAnnotations; +using Microsoft.AspNetCore.Mvc; +using SWAD.API.Consts; +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Services.Links; + +namespace SWAD.API.Controllers; + +/// +/// Controller for get links from music providers +/// +[Tags($"{nameof(LinkController)}: Controller for get links from music providers")] +[Route("[controller]")] +[ApiController] +public class LinkController(LinksService linksService) : SwadController +{ + /// + /// Get link from other link + /// + /// Track query such as Name, artist, Albums + /// Link for track + [HttpPost("FromLink")] + [ProducesResponseType(typeof(LinkResultDto), 200)] + [ProducesResponseType(typeof(ProblemDetails), 400)] + [ProducesResponseType(typeof(ProblemDetails), 404)] + [ProducesResponseType(typeof(ProblemDetails), 502)] + public async Task GetLink(TrackLinkDto track) + { + var serviceResult = await linksService.MapLinks(track); + + switch (serviceResult.result) + { + case ServiceResult.Success: + return Ok(new LinkResultDto(serviceResult.link)); + + case ServiceResult.Failure: + return BadRequest($"{track.Link} is not recognized. Try other link"); + + case ServiceResult.NoResponse: + return BadGateway("Bad gateway with one of services"); + + case ServiceResult.BadRequest: + return BadRequest($"Unknown service {track.Service} or parameters not valid"); + + case ServiceResult.NotFound: + return NotFound(ErrorResources.NotFound); + default: + throw new ApplicationException("Unknown response from service"); + } + } + + /// + /// Get link from search query such as artist and song Name + /// + /// Track query such as Name, artist, Albums + /// Link for track + [HttpPost("FromQuery")] + [ProducesResponseType(typeof(LinkResultDto), 200)] + [ProducesResponseType(typeof(ProblemDetails), 400)] + [ProducesResponseType(typeof(ProblemDetails), 404)] + [ProducesResponseType(typeof(ProblemDetails), 502)] + public async Task GetLink(TrackDto track) + { + var serviceResult = await linksService.GetLinkByQuery(track); + + switch (serviceResult.result) + { + case ServiceResult.Success: + return Ok(new LinkResultDto(serviceResult.link)); + + case ServiceResult.Failure: + return NotFound($"Track {track.Name} - {track.Artist} not found!"); + + case ServiceResult.NoResponse: + return BadGateway($"Bad gateway with service {track.Service}"); + + case ServiceResult.BadRequest: + return BadRequest($"Unknown service {track.Service} or parameters not valid"); + + case ServiceResult.NotFound: + return BadRequest(ErrorResources.NotFound); + default: + throw new ApplicationException($"Unknown response from service {linksService}"); + } + } + + /// + /// Get service what uses that link + /// + /// + /// + /// + [HttpGet("GetService")] + [ProducesResponseType(typeof(ServiceDto), 200)] + [ProducesResponseType(typeof(ProblemDetails), 400)] + public async Task GetServiceOfLink([Required] string link) + { + var serviceResult = await linksService.GetServiceByLink(link); + switch (serviceResult.result) + { + case ServiceResult.Success: + return Ok(new ServiceDto(serviceResult.service!.Value, + serviceResult.service.Value.ToString())); + case ServiceResult.Failure: + return BadRequest($"{link} is not recognized. Try other link"); + default: + throw new ApplicationException("WTF are you doing?"); + } + } +} \ No newline at end of file diff --git a/SWAD.API/Controllers/ProblemsController.cs b/SWAD.API/Controllers/ProblemsController.cs new file mode 100644 index 0000000..e18a01f --- /dev/null +++ b/SWAD.API/Controllers/ProblemsController.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Mvc; + +namespace SWAD.API.Controllers; + +public abstract class ProblemsController : ControllerBase +{ + protected ObjectResult BadRequest(string? detail) + { + return Problem(statusCode: StatusCodes.Status400BadRequest, title: "Bad request!", detail: detail); + } + + protected ObjectResult NotFound(string? detail) + { + return Problem(statusCode: StatusCodes.Status404NotFound, title: "Not found :c", detail: detail); + } + + protected ObjectResult BadGateway(string? detail) + { + return Problem(statusCode: StatusCodes.Status502BadGateway, title: "Some problems in other side, dude!", + detail: detail); + } +} \ No newline at end of file diff --git a/SWAD.API/Controllers/SwadController.cs b/SWAD.API/Controllers/SwadController.cs new file mode 100644 index 0000000..212b30a --- /dev/null +++ b/SWAD.API/Controllers/SwadController.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Mvc; + +namespace SWAD.API.Controllers; + +public class SwadController : ProblemsController +{ + public static string GetTitleForSwagger(string controllerName, string description) + { + return $"{controllerName}: {description}"; + } +} \ No newline at end of file diff --git a/SWAD.API/Dockerfile b/SWAD.API/Dockerfile new file mode 100644 index 0000000..4f07eb6 --- /dev/null +++ b/SWAD.API/Dockerfile @@ -0,0 +1,15 @@ +# https://hub.docker.com/_/microsoft-dotnet +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY ./ ./ +RUN dotnet restore +WORKDIR /source/SWAD.API +RUN dotnet publish -c release -o /app --no-restore + +# final stage/image +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build /app ./ +ENTRYPOINT ["dotnet", "/app/SWAD.API.dll"] \ No newline at end of file diff --git a/SWAD.API/Exceptions/TrackNotFoundException.cs b/SWAD.API/Exceptions/TrackNotFoundException.cs new file mode 100644 index 0000000..b2300af --- /dev/null +++ b/SWAD.API/Exceptions/TrackNotFoundException.cs @@ -0,0 +1,3 @@ +namespace SWAD.API.Exceptions; + +public class TrackNotFoundException(string? message) : Exception(message); \ No newline at end of file diff --git a/SWAD.API/Middlewares/ExceptionMiddleware.cs b/SWAD.API/Middlewares/ExceptionMiddleware.cs new file mode 100644 index 0000000..d3992cb --- /dev/null +++ b/SWAD.API/Middlewares/ExceptionMiddleware.cs @@ -0,0 +1,90 @@ +using System.ComponentModel.DataAnnotations; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Mvc; + +namespace SWAD.API.Middlewares; + +/// +/// DONT TOUCH THAT!!! Generate good messages for responses and handle to logger exceptions +/// +/// +/// +/// +public class ExceptionMiddleware(ILogger logger, IWebHostEnvironment env, RequestDelegate next) +{ + private const string DefaultMessage = "An unexpected error has occurred, dude."; + + private const string ResponseStartedMessage = + "The response has already started, the http status code middleware will not be executed."; + + public async Task InvokeAsync(HttpContext httpContext) + { + try + { + await next(httpContext); + } + catch (Exception e) + { + if (httpContext.Response.HasStarted) + { + logger.LogWarning(ResponseStartedMessage); + throw; + } + + var id = string.IsNullOrEmpty(httpContext?.TraceIdentifier) + ? Guid.NewGuid().ToString() + : httpContext.TraceIdentifier; + logger.LogError($"An exception was thrown during the request, dude. " + + $"{id} \n{(env.IsDevelopment() ? "strcstart:\n" + e : e.GetType().Name) + e.StackTrace + e.Source + e.InnerException}"); + // logger.LogError($"An exception was thrown during the request, dude. " + + // $"{id} \n{(env.IsDevelopment() ? "strcstart:\n" + e : e.GetType().Name)}"); + + await ProblemExceptionResponse(httpContext!, e, id); + } + } + + private async Task ProblemExceptionResponse(HttpContext httpContext, Exception e, string id) + { + //Create problem + var problem = new ProblemDetails + { + Title = DefaultMessage, + Status = StatusCodes.Status500InternalServerError + }; + //Add stacktrace if env is development + if (env.IsDevelopment()) + { + problem.Detail = $"{e.Message} in {e.GetType().Name}"; + var lines = new List { "Next strings is stacktrace. Enjoy, dude :)", "strcstart:" } + .Concat(e.StackTrace!.Split("\r\n").Select(e => e.TrimStart())); + + problem.Extensions.Add(new KeyValuePair("StackTrace", lines)); + } + else + { + problem.Detail = $"{e.Message} in {e}"; + } + + switch (e) + { + case NotImplementedException: + problem.Status = StatusCodes.Status501NotImplemented; + break; + case ValidationException ve: + return; + } + + var jsonResponse = JsonSerializer + .Serialize(problem, new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }); + + httpContext.Response.StatusCode = problem.Status ?? StatusCodes.Status500InternalServerError; + httpContext.Response.ContentType = "application/problem+json"; + + await httpContext.Response + .WriteAsync(jsonResponse); + } +} \ No newline at end of file diff --git a/SWAD.API/Models/Config/ApiServices/ApiServicesConfig.cs b/SWAD.API/Models/Config/ApiServices/ApiServicesConfig.cs new file mode 100644 index 0000000..6601389 --- /dev/null +++ b/SWAD.API/Models/Config/ApiServices/ApiServicesConfig.cs @@ -0,0 +1,13 @@ +using SWAD.API.Models.Config.ApiServices.Structure; + +namespace SWAD.API.Models.Config.ApiServices; + +// ReSharper disable once ClassNeverInstantiated.Global because: Is structure for config +public class ApiServicesConfig +{ + public const string ConfigName = "APIServices"; + + // ReSharper disable once PropertyCanBeMadeInitOnly.Global + // ReSharper disable once NullableWarningSuppressionIsUsed + public ApiServiceData[] ServicesData { get; set; } = null!; +} \ No newline at end of file diff --git a/SWAD.API/Models/Config/ApiServices/Structure/ApiPaths.cs b/SWAD.API/Models/Config/ApiServices/Structure/ApiPaths.cs new file mode 100644 index 0000000..ea7e183 --- /dev/null +++ b/SWAD.API/Models/Config/ApiServices/Structure/ApiPaths.cs @@ -0,0 +1,10 @@ +namespace SWAD.API.Models.Config.ApiServices.Structure; + +// ReSharper disable once ClassNeverInstantiated.Global because: Is structure for config +public class ApiPaths +{ + // ReSharper disable NullableWarningSuppressionIsUsed + public string Search { get; set; } = null!; + public string GetTrack { get; set; } = null!; + public string GetArtist { get; set; } = null!; +} \ No newline at end of file diff --git a/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceData.cs b/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceData.cs new file mode 100644 index 0000000..240adaa --- /dev/null +++ b/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceData.cs @@ -0,0 +1,12 @@ +namespace SWAD.API.Models.Config.ApiServices.Structure; + +// ReSharper disable once ClassNeverInstantiated.Global because: Is structure for config +public class ApiServiceData +{ + // ReSharper disable NullableWarningSuppressionIsUsed + public string Name { get; set; } = null!; + public string ClientId { get; set; } = null!; + public string Secret { get; set; } = null!; + public ApiServiceEndpoints Endpoints { get; set; } = null!; + public ApiPaths ApiPaths { get; set; } = null!; +} \ No newline at end of file diff --git a/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceEndpoints.cs b/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceEndpoints.cs new file mode 100644 index 0000000..9dd7b9a --- /dev/null +++ b/SWAD.API/Models/Config/ApiServices/Structure/ApiServiceEndpoints.cs @@ -0,0 +1,11 @@ +namespace SWAD.API.Models.Config.ApiServices.Structure; + +// ReSharper disable once ClassNeverInstantiated.Global because: Is structure for config +public class ApiServiceEndpoints +{ + // ReSharper disable NullableWarningSuppressionIsUsed + public string Base { get; set; } = null!; + public string Api { get; set; } = null!; + public string Token { get; set; } = null!; + public string[] MusicLink { get; set; } = null!; +} \ No newline at end of file diff --git a/SWAD.API/Models/Config/ServicesEndpointsConfig.cs b/SWAD.API/Models/Config/ServicesEndpointsConfig.cs new file mode 100644 index 0000000..cdca36e --- /dev/null +++ b/SWAD.API/Models/Config/ServicesEndpointsConfig.cs @@ -0,0 +1,8 @@ +namespace SWAD.API.Models.Config; + +public class ServicesEndpointsConfig +{ + public const string ConfigName = "ServicesEndpoints"; + // ReSharper disable once NullableWarningSuppressionIsUsed + public string Redis { get; init; } = null!; +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/DefaultAuthResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/DefaultAuthResponse.cs new file mode 100644 index 0000000..d1e0f9b --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/DefaultAuthResponse.cs @@ -0,0 +1,28 @@ +using System.Text.Json.Serialization; +using SWAD.API.Services.MusicAPI.Auth; + +namespace SWAD.API.Models.JsonStructures.MusicAPI; + +public abstract class DefaultAuthResponse : IAuthResponse +{ + private int? _expire; + private DateTime? _revokedAt; + + [JsonPropertyName("access_token")] + + // ReSharper disable once NullableWarningSuppressionIsUsed + public string Token { get; set; } = null!; + + [JsonPropertyName("expires_in")] + public int? ExpireTime + { + get => _expire; + set + { + _expire = value; + _revokedAt = DateTime.UtcNow; + } + } + + public DateTime? ExpireAt => _revokedAt?.AddSeconds(ExpireTime ?? 0); +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyAuthResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyAuthResponse.cs new file mode 100644 index 0000000..1c0a78e --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyAuthResponse.cs @@ -0,0 +1,6 @@ +namespace SWAD.API.Models.JsonStructures.MusicAPI.Spotify; + +/// +/// Json Structure for spotify auth response +/// +public class SpotifyAuthResponse : DefaultAuthResponse; \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifySearchResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifySearchResponse.cs new file mode 100644 index 0000000..3ed79fe --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifySearchResponse.cs @@ -0,0 +1,31 @@ +using System.Text.Json.Serialization; + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Spotify; + +/// +/// Json Structure for spotify search response +/// +internal class SpotifySearchResponse +{ + // ReSharper disable NullableWarningSuppressionIsUsed + [JsonPropertyName("tracks")] public TrackList Tracks { get; set; } = null!; + + public class TrackList + { + [JsonPropertyName("items")] public List Items { get; set; } = null!; + } + + public class ExternalUrls + { + [JsonPropertyName("spotify")] public string Spotify { get; set; } = null!; + } + + public class Item + { + [JsonPropertyName("href")] public string? Href { get; set; } = null!; + + [JsonPropertyName("id")] public string? Id { get; set; } = null!; + + [JsonPropertyName("external_urls")] public ExternalUrls ExternalUrls { get; set; } = null!; + } +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyTrackResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyTrackResponse.cs new file mode 100644 index 0000000..b2aff89 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Spotify/SpotifyTrackResponse.cs @@ -0,0 +1,30 @@ +using System.Text.Json.Serialization; + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Spotify; + +/// +/// Json Structure for tidal track response +/// +public class SpotifyTrackResponse +{ + // ReSharper disable NullableWarningSuppressionIsUsed + [JsonPropertyName("name")] public string Name { get; set; } = null!; + + [JsonPropertyName("artists")] public Artist[] Artists { get; set; } = null!; + + [JsonPropertyName("album")] public Album Albums { get; set; } = null!; + + public class Artist + { + [JsonPropertyName("id")] public string Id { get; set; } = null!; + + [JsonPropertyName("name")] public string Name { get; set; } = null!; + } + + public class Album + { + [JsonPropertyName("id")] public string Id { get; set; } = null!; + + [JsonPropertyName("name")] public string Name { get; set; } = null!; + } +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalArtistResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalArtistResponse.cs new file mode 100644 index 0000000..424bdb0 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalArtistResponse.cs @@ -0,0 +1,25 @@ +using System.Text.Json.Serialization; + +// ReSharper disable NullableWarningSuppressionIsUsed + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Tidal; + +/// +/// Json Structure for tidal track response +/// +public class TidalArtistResponse +{ + [JsonPropertyName("data")] public DataObject Data { get; set; } = new(); + + public class DataObject + { + [JsonPropertyName("attributes")] public AttributesObject Attributes { get; set; } = new(); + + } + + public class AttributesObject + { + [JsonPropertyName("name")] public string Name { get; set; } = null!; + + } +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalAuthResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalAuthResponse.cs new file mode 100644 index 0000000..d4f15d1 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalAuthResponse.cs @@ -0,0 +1,3 @@ +namespace SWAD.API.Models.JsonStructures.MusicAPI.Tidal; + +public class TidalAuthResponse : DefaultAuthResponse; \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalSearchResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalSearchResponse.cs new file mode 100644 index 0000000..c63daf3 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalSearchResponse.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +// ReSharper disable NullableWarningSuppressionIsUsed + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Tidal; + +internal class TidalSearchResponse +{ + [JsonPropertyName("data")] public TidalTrackResponse.DataObject Data { get; set; } = null!; + + public class Track + { + [JsonPropertyName("resource")] public TidalTrackResponse.DataObject DataObject { get; set; } = null!; + } +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalTrackResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalTrackResponse.cs new file mode 100644 index 0000000..dacca84 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Tidal/TidalTrackResponse.cs @@ -0,0 +1,53 @@ +using System.Text.Json.Serialization; + +// ReSharper disable NullableWarningSuppressionIsUsed + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Tidal; + +/// +/// Json Structure for tidal track response +/// +public class TidalTrackResponse +{ + [JsonPropertyName("data")] public DataObject Data { get; set; } = new(); + + public class DataObject + { + [JsonPropertyName("attributes")] public AttributesObject Attributes { get; set; } = new(); + [JsonPropertyName("relationships")] public RelationShipsObject RelationShips { get; set; } = new(); + + } + + public class AttributesObject + { + [JsonPropertyName("title")] public string Title { get; set; } = null!; + + } + + public class RelationShipsObject + { + [JsonPropertyName("artists")] public ArtistObject Artist { get; set; } = null!; + [JsonPropertyName("tracks")] public ArtistObject Track { get; set; } = null!; + } + + public class ArtistObject + { + [JsonPropertyName("data")] public List Data { get; set; } = null!; + } + + public class TrackObject + { + [JsonPropertyName("data")] public List Data { get; set; } = null!; + } + + public class TrackDataObject + { + [JsonPropertyName("id")] public string Id { get; set; } = null!; + } + + + public class ArtistDataObject + { + [JsonPropertyName("id")] public string Id { get; set; } = null!; + } +} \ No newline at end of file diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexSearchResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexSearchResponse.cs new file mode 100644 index 0000000..8c05255 --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexSearchResponse.cs @@ -0,0 +1,268 @@ +using System.Text.Json.Serialization; + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Yandex; +/* + * ВНИМАНИЕ + * Yandex API писали шизы поэтому когда будешь добавлять поля в YandexSearchResponse + * ПОМНИ: ID у артистов и альбомов в разных местах JSON в одних и тех же объектах то string то number + * ЭТО ВЫЗОВЕТ ИСКЛЮЧЕНИЕ + * Думой + */ +public class YandexSearchResponse +{ + [JsonPropertyName("status")] + public string Status { get; set; } + + [JsonPropertyName("entities")] + public List Entities { get; set; } +} +public class Album + { + [JsonPropertyName("title")] + public string Title { get; set; } + + [JsonPropertyName("year")] + public int? Year { get; set; } + + [JsonPropertyName("trackCount")] + public int? TrackCount { get; set; } + } + + public class Album2 + { + + [JsonPropertyName("title")] + public string Title { get; set; } + + [JsonPropertyName("year")] + public int? Year { get; set; } + + [JsonPropertyName("trackCount")] + public int? TrackCount { get; set; } + } + + public class Artist + { + + [JsonPropertyName("name")] + public string Name { get; set; } + } + + public class Artist2 + { + + [JsonPropertyName("name")] + public string Name { get; set; } + + } + + public class Counts + { + [JsonPropertyName("tracks")] + public int? Tracks { get; set; } + + [JsonPropertyName("directAlbums")] + public int? DirectAlbums { get; set; } + + [JsonPropertyName("alsoAlbums")] + public int? AlsoAlbums { get; set; } + + [JsonPropertyName("alsoTracks")] + public int? AlsoTracks { get; set; } + } + + public class Cover + { + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("prefix")] + public string Prefix { get; set; } + + [JsonPropertyName("uri")] + public string Uri { get; set; } + } + + public class DerivedColors + { + [JsonPropertyName("average")] + public string Average { get; set; } + + [JsonPropertyName("waveText")] + public string WaveText { get; set; } + + [JsonPropertyName("miniPlayer")] + public string MiniPlayer { get; set; } + + [JsonPropertyName("accent")] + public string Accent { get; set; } + } + + public class Entity + { + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("results")] + public List Results { get; set; } + } + + public class Fade + { + [JsonPropertyName("inStart")] + public double? InStart { get; set; } + + [JsonPropertyName("inStop")] + public double? InStop { get; set; } + + [JsonPropertyName("outStart")] + public double? OutStart { get; set; } + + [JsonPropertyName("outStop")] + public double? OutStop { get; set; } + } + + public class Label + { + [JsonPropertyName("id")] + public int? Id { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + } + + public class LyricsInfo + { + [JsonPropertyName("hasAvailableSyncLyrics")] + public bool? HasAvailableSyncLyrics { get; set; } + + [JsonPropertyName("hasAvailableTextLyrics")] + public bool? HasAvailableTextLyrics { get; set; } + } + + public class Major + { + [JsonPropertyName("id")] + public int? Id { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + } + + public class R128 + { + [JsonPropertyName("i")] + public double? I { get; set; } + + [JsonPropertyName("tp")] + public double? Tp { get; set; } + } + + public class Ratings + { + [JsonPropertyName("month")] + public int? Month { get; set; } + } + + public class Result + { + [JsonPropertyName("text")] + public string Text { get; set; } + + [JsonPropertyName("track")] + public Track Track { get; set; } + } + + public class Track + { + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("realId")] + public string RealId { get; set; } + + [JsonPropertyName("title")] + public string Title { get; set; } + + [JsonPropertyName("version")] + public string Version { get; set; } + + [JsonPropertyName("trackSource")] + public string TrackSource { get; set; } + + [JsonPropertyName("major")] + public Major Major { get; set; } + + [JsonPropertyName("available")] + public bool? Available { get; set; } + + [JsonPropertyName("availableForPremiumUsers")] + public bool? AvailableForPremiumUsers { get; set; } + + [JsonPropertyName("availableFullWithoutPermission")] + public bool? AvailableFullWithoutPermission { get; set; } + + [JsonPropertyName("disclaimers")] + public List Disclaimers { get; set; } + + [JsonPropertyName("availableForOptions")] + public List AvailableForOptions { get; set; } + + [JsonPropertyName("albums")] + public List Albums { get; set; } + + [JsonPropertyName("durationMs")] + public int? DurationMs { get; set; } + + [JsonPropertyName("storageDir")] + public string StorageDir { get; set; } + + [JsonPropertyName("fileSize")] + public int? FileSize { get; set; } + + [JsonPropertyName("r128")] + public R128 R128 { get; set; } + + [JsonPropertyName("fade")] + public Fade Fade { get; set; } + + [JsonPropertyName("previewDurationMs")] + public int? PreviewDurationMs { get; set; } + + [JsonPropertyName("coverUri")] + public string CoverUri { get; set; } + + [JsonPropertyName("ogImage")] + public string OgImage { get; set; } + + [JsonPropertyName("lyricsAvailable")] + public bool? LyricsAvailable { get; set; } + + [JsonPropertyName("lyricsInfo")] + public LyricsInfo LyricsInfo { get; set; } + + [JsonPropertyName("derivedColors")] + public DerivedColors DerivedColors { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("rememberPosition")] + public bool? RememberPosition { get; set; } + + [JsonPropertyName("trackSharingFlag")] + public string TrackSharingFlag { get; set; } + + [JsonPropertyName("contentWarning")] + public string ContentWarning { get; set; } + } + + public class TrackPosition + { + [JsonPropertyName("volume")] + public int? Volume { get; set; } + + [JsonPropertyName("index")] + public int? Index { get; set; } + } + diff --git a/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexTrackResponse.cs b/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexTrackResponse.cs new file mode 100644 index 0000000..bc81c1b --- /dev/null +++ b/SWAD.API/Models/JsonStructures/MusicAPI/Yandex/YandexTrackResponse.cs @@ -0,0 +1,222 @@ +using System.Text.Json.Serialization; + +namespace SWAD.API.Models.JsonStructures.MusicAPI.Yandex; + +public class YandexTrackResponse +{ + [JsonPropertyName("artists")] + public List Artists { get; set; } + + [JsonPropertyName("track")] public Track Track { get; set; } + + [JsonPropertyName("lyric")] public List Lyric { get; set; } +} + +public class AlsoInAlbum +{ + [JsonPropertyName("id")] public int Id { get; set; } + + [JsonPropertyName("title")] public string Title { get; set; } + + [JsonPropertyName("metaType")] public string MetaType { get; set; } + + [JsonPropertyName("contentWarning")] public string ContentWarning { get; set; } + + [JsonPropertyName("year")] public int Year { get; set; } + + [JsonPropertyName("releaseDate")] public DateTime ReleaseDate { get; set; } + + [JsonPropertyName("coverUri")] public string CoverUri { get; set; } + + [JsonPropertyName("ogImage")] public string OgImage { get; set; } + + [JsonPropertyName("genre")] public string Genre { get; set; } + + [JsonPropertyName("trackCount")] public int TrackCount { get; set; } + + [JsonPropertyName("likesCount")] public int LikesCount { get; set; } + + [JsonPropertyName("recent")] public bool Recent { get; set; } + + [JsonPropertyName("veryImportant")] public bool VeryImportant { get; set; } + + [JsonPropertyName("artists")] public List Artists { get; set; } + + [JsonPropertyName("labels")] public List Labels { get; set; } + + [JsonPropertyName("available")] public bool Available { get; set; } + + [JsonPropertyName("availableForPremiumUsers")] + public bool AvailableForPremiumUsers { get; set; } + + [JsonPropertyName("availableForOptions")] + public List AvailableForOptions { get; set; } + + [JsonPropertyName("availableForMobile")] + public bool AvailableForMobile { get; set; } + + [JsonPropertyName("availablePartially")] + public bool AvailablePartially { get; set; } + + [JsonPropertyName("bests")] public List Bests { get; set; } + + [JsonPropertyName("disclaimers")] public List Disclaimers { get; set; } + + [JsonPropertyName("trackPosition")] public TrackPosition TrackPosition { get; set; } +} + +public class Credit +{ + [JsonPropertyName("title")] public string Title { get; set; } + + [JsonPropertyName("value")] public string Value { get; set; } +} + +public class Link +{ + [JsonPropertyName("title")] public string Title { get; set; } + + [JsonPropertyName("href")] public string Href { get; set; } + + [JsonPropertyName("type")] public string Type { get; set; } + + [JsonPropertyName("socialNetwork")] public string SocialNetwork { get; set; } +} + +public class Live +{ + [JsonPropertyName("id")] public string Id { get; set; } + + [JsonPropertyName("realId")] public string RealId { get; set; } + + [JsonPropertyName("title")] public string Title { get; set; } + + [JsonPropertyName("version")] public string Version { get; set; } + + [JsonPropertyName("contentWarning")] public string ContentWarning { get; set; } + + [JsonPropertyName("major")] public Major Major { get; set; } + + [JsonPropertyName("available")] public bool Available { get; set; } + + [JsonPropertyName("availableForPremiumUsers")] + public bool AvailableForPremiumUsers { get; set; } + + [JsonPropertyName("availableFullWithoutPermission")] + public bool AvailableFullWithoutPermission { get; set; } + + [JsonPropertyName("availableForOptions")] + public List AvailableForOptions { get; set; } + + [JsonPropertyName("disclaimers")] public List Disclaimers { get; set; } + + [JsonPropertyName("storageDir")] public string StorageDir { get; set; } + + [JsonPropertyName("durationMs")] public int DurationMs { get; set; } + + [JsonPropertyName("fileSize")] public int FileSize { get; set; } + + [JsonPropertyName("r128")] public R128 R128 { get; set; } + + [JsonPropertyName("fade")] public Fade Fade { get; set; } + + [JsonPropertyName("previewDurationMs")] + public int PreviewDurationMs { get; set; } + + [JsonPropertyName("artists")] public List Artists { get; set; } + + [JsonPropertyName("albums")] public List Albums { get; set; } + + [JsonPropertyName("coverUri")] public string CoverUri { get; set; } + + [JsonPropertyName("derivedColors")] public DerivedColors DerivedColors { get; set; } + + [JsonPropertyName("ogImage")] public string OgImage { get; set; } + + [JsonPropertyName("lyricsAvailable")] public bool LyricsAvailable { get; set; } + + [JsonPropertyName("type")] public string Type { get; set; } + + [JsonPropertyName("rememberPosition")] public bool RememberPosition { get; set; } + + [JsonPropertyName("trackSharingFlag")] public string TrackSharingFlag { get; set; } + + [JsonPropertyName("lyricsInfo")] public LyricsInfo LyricsInfo { get; set; } + + [JsonPropertyName("trackSource")] public string TrackSource { get; set; } +} + +public class Lyric +{ + [JsonPropertyName("lyricsAvailable")] public bool LyricsAvailable { get; set; } + + [JsonPropertyName("fullLyrics")] public string FullLyrics { get; set; } + + [JsonPropertyName("lyrics")] public string Lyrics { get; set; } +} + +public class OtherVersions +{ + [JsonPropertyName("live")] public List Live { get; set; } +} + +public class SimilarTrack +{ + [JsonPropertyName("id")] public string Id { get; set; } + + [JsonPropertyName("realId")] public string RealId { get; set; } + + [JsonPropertyName("title")] public string Title { get; set; } + + [JsonPropertyName("major")] public Major Major { get; set; } + + [JsonPropertyName("available")] public bool Available { get; set; } + + [JsonPropertyName("availableForPremiumUsers")] + public bool AvailableForPremiumUsers { get; set; } + + [JsonPropertyName("availableFullWithoutPermission")] + public bool AvailableFullWithoutPermission { get; set; } + + [JsonPropertyName("availableForOptions")] + public List AvailableForOptions { get; set; } + + [JsonPropertyName("disclaimers")] public List Disclaimers { get; set; } + + [JsonPropertyName("storageDir")] public string StorageDir { get; set; } + + [JsonPropertyName("durationMs")] public int DurationMs { get; set; } + + [JsonPropertyName("fileSize")] public int FileSize { get; set; } + + [JsonPropertyName("r128")] public R128 R128 { get; set; } + + [JsonPropertyName("fade")] public Fade Fade { get; set; } + + [JsonPropertyName("previewDurationMs")] + public int PreviewDurationMs { get; set; } + + [JsonPropertyName("artists")] public List Artists { get; set; } + + [JsonPropertyName("albums")] public List Albums { get; set; } + + [JsonPropertyName("coverUri")] public string CoverUri { get; set; } + + [JsonPropertyName("derivedColors")] public DerivedColors DerivedColors { get; set; } + + [JsonPropertyName("ogImage")] public string OgImage { get; set; } + + [JsonPropertyName("lyricsAvailable")] public bool LyricsAvailable { get; set; } + + [JsonPropertyName("type")] public string Type { get; set; } + + [JsonPropertyName("rememberPosition")] public bool RememberPosition { get; set; } + + [JsonPropertyName("trackSharingFlag")] public string TrackSharingFlag { get; set; } + + [JsonPropertyName("lyricsInfo")] public LyricsInfo LyricsInfo { get; set; } + + [JsonPropertyName("trackSource")] public string TrackSource { get; set; } + + [JsonPropertyName("contentWarning")] public string ContentWarning { get; set; } +} \ No newline at end of file diff --git a/SWAD.API/Program.cs b/SWAD.API/Program.cs new file mode 100644 index 0000000..21cb4a2 --- /dev/null +++ b/SWAD.API/Program.cs @@ -0,0 +1,34 @@ +using System.Diagnostics; +using System.Reflection; + +namespace SWAD.API; + +public static class Program +{ + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + Startup.Configure(builder); + Startup.ConfigureServices(builder.Services); + + var app = builder.Build(); + Startup.ConfigureApplication(app); + Splash(app.Logger); + app.Run(); + } + + private static void Splash(ILogger logger) + { + var splash = """ + ____ ____ _ _ ____ ___ + / ___|_ ____ _ _ __ | _ \ _ _ __| | ___ / \ | _ \_ _| + \___ \ \ /\ / / _` | '_ \| | | | | | |/ _` |/ _ \ / _ \ | |_) | | + ___) \ V V / (_| | |_) | |_| | |_| | (_| | __/_ / ___ \| __/| | + |____/ \_/\_/ \__,_| .__/|____/ \__,_|\__,_|\___(_)_/ \_\_| |___| + |_| + """; + logger.LogWarning(splash); + logger.LogInformation( + $"Build assembly version: {FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion}"); + } +} \ No newline at end of file diff --git a/SWAD.API/Properties/launchSettings.json b/SWAD.API/Properties/launchSettings.json new file mode 100644 index 0000000..3ea8be9 --- /dev/null +++ b/SWAD.API/Properties/launchSettings.json @@ -0,0 +1,37 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5287" + }, + "https": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "https://localhost:7013;http://localhost:5287" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + }, + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:20004", + "sslPort": 44385 + } + } +} \ No newline at end of file diff --git a/SWAD.API/SWAD.API.csproj b/SWAD.API/SWAD.API.csproj new file mode 100644 index 0000000..8c54039 --- /dev/null +++ b/SWAD.API/SWAD.API.csproj @@ -0,0 +1,37 @@ + + + + net8.0 + enable + SWAD.API + enable + SWAD.API + 0.1.$([System.DateTime]::UtcNow.ToString(MMdd)).$([System.DateTime]::Now.ToString(HHmm)) + 0.0.0.1 + $(VersionSuffix) + 0.0.1.0 + $(VersionSuffix) + SpectruMTeamCode + Lisoveliy + Copyright © $(Company) $([System.DateTime]::UtcNow.ToString(yyyy)) + SWAD Platform + Platform for sharing music links from one music service to another for free! (REST API Back-end) + False + doc.xml + + + + + Always + + + + + + + + + + + + diff --git a/SWAD.API/Services/Links/LinksService.cs b/SWAD.API/Services/Links/LinksService.cs new file mode 100644 index 0000000..5472137 --- /dev/null +++ b/SWAD.API/Services/Links/LinksService.cs @@ -0,0 +1,121 @@ +using StackExchange.Redis; +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Exceptions; +using SWAD.API.Services.MusicAPI.Api; + +namespace SWAD.API.Services.Links; + +/// +/// Service for manipulating with links (LinkController) +/// +public class LinksService +{ + private readonly Dictionary _services; + private readonly IDatabase _redis; + private readonly ILogger _logger; + + public LinksService(IEnumerable services, IDatabase redis, ILogger logger) + { + _services = services.ToList() + .ConvertAll(x => new KeyValuePair(x.ServiceType, x)).ToDictionary(); + _redis = redis; + _logger = logger; + } + + /// + /// Get link by query + /// + /// Search query + /// Success, Failure, BadRequest, NoResponse + public async Task<(string? link, ServiceResult result)> GetLinkByQuery(TrackDto query) + { + //Mapping service + var service = _services.GetValueOrDefault(query.Service); + //Throw result + try + { + var output = await service!.GetLinkByQuery(query); + return (output, output != null ? ServiceResult.Success : ServiceResult.Failure); + } + catch (HttpRequestException) + { + return (null, ServiceResult.BadRequest); + } + catch (TimeoutException) + { + return (null, ServiceResult.NoResponse); + } + } + + /// + /// Get MusicService by url + /// + /// + /// Success, Failure + public async Task<(MusicService? service, ServiceResult result)> GetServiceByLink(string link) + { + var cacheKey = $"GET_SERVICE_{link}"; + var cache = await _redis.StringGetAsync(cacheKey); + if (cache.HasValue) + { + var result = (MusicService?)Enum.Parse(typeof(MusicService), cache.ToString()); + return (result, ServiceResult.Success); + } + + _logger.LogInformation($"Getting service for {link}..."); + foreach (var service in _services.Values) + if (service.Config.Endpoints.MusicLink.Any(link.StartsWith)) + { + await _redis.StringSetAsync(cacheKey, service.ServiceType.ToString(), TimeSpan.FromDays(30)); + return (service.ServiceType, ServiceResult.Success); + } + + _logger.LogInformation($"FAIL"); + return (null, ServiceResult.Failure); + } + + /// + /// Get Link from other service + /// + /// link from first service + /// link from another service, Success, Failure, BadRequest, NoResponse + public async Task<(string? link, ServiceResult result)> MapLinks(TrackLinkDto trackLink) + { + var service = await GetServiceByLink(trackLink.Link); + if (service.result != ServiceResult.Success) return (null, service.result); + + var cacheKey = $"{service.service}_{trackLink.Link}_{Enum.GetName(trackLink.Service)}"; + var cache = await _redis.StringGetAsync(cacheKey); + if (cache.HasValue) + { + return (cache.ToString(), ServiceResult.Success); + } + + _logger.LogInformation($"Getting {trackLink.Link} for {Enum.GetName(trackLink.Service)}..."); + + try + { + var apiService = _services[service.service!.Value]; + var query = await apiService.GetQueryObject(trackLink.Link); + var linkApiService = _services[trackLink.Service]; + var link = await linkApiService.GetLinkByQuery(query); + if (link == null) + return (null, ServiceResult.Failure); + await _redis.StringSetAsync(cacheKey, link, TimeSpan.FromDays(30)); + return (link, ServiceResult.Success); + } + catch (TrackNotFoundException) + { + return (null, ServiceResult.NotFound); + } + catch (HttpRequestException) + { + return (null, ServiceResult.BadRequest); + } + catch (TimeoutException) + { + return (null, ServiceResult.NoResponse); + } + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Api/ApiService.cs b/SWAD.API/Services/MusicAPI/Api/ApiService.cs new file mode 100644 index 0000000..94b2352 --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Api/ApiService.cs @@ -0,0 +1,35 @@ +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Models.Config.ApiServices.Structure; + +namespace SWAD.API.Services.MusicAPI.Api; + +/// +/// Abstract ApiService of music services +/// +public abstract class ApiService +{ + public ApiServiceData Config { get; protected init; } = null!; + public MusicService ServiceType { get; protected init; } + public abstract Task GetLinkByQuery(TrackDto query); + public abstract Task GetQueryObject(string link, string CountryCode = "US"); + protected string GetQuery(TrackDto dto) => $"{dto.Name} - {dto.Artist}"; + + /// + /// Get all implemented API Services + /// + /// API Services types + public static IEnumerable GetAllImplementations() + { + var type = typeof(ApiService); + var types = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(s => s.GetTypes()) + .Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract); + return types; + } + + protected struct Messages + { + public const string AuthFailMessage = "Update token request for service {0} failed"; + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Api/SpotifyService.cs b/SWAD.API/Services/MusicAPI/Api/SpotifyService.cs new file mode 100644 index 0000000..a6085dd --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Api/SpotifyService.cs @@ -0,0 +1,109 @@ +using System.Net.Http.Headers; +using System.Text.Json; +using System.Web; +using Microsoft.AspNetCore.Authentication; +using Microsoft.Extensions.Options; +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Models.JsonStructures.MusicAPI.Spotify; +using SWAD.API.Services.MusicAPI.Auth; + +namespace SWAD.API.Services.MusicAPI.Api; + +public class SpotifyService : ApiService +{ + private readonly SpotifyAuthService _authService; + private readonly Uri _searchUri; + private SpotifyAuthResponse? _token; + + public SpotifyService(IOptions config, IEnumerable authServices) + { + ServiceType = MusicService.Spotify; + var configServices = config.Value.ServicesData; + Config = configServices.First(x => x.Name == ServiceType.ToString()); + _authService = (authServices.First(x => x.ServiceType == ServiceType) as SpotifyAuthService) ?? throw new ApplicationException("Auth service not found"); + _searchUri = new Uri(new Uri(Config.Endpoints.Api), Config.ApiPaths.Search); + } + + //Auto revoke on Expire + private SpotifyAuthResponse? Token + { + get => _token?.ExpireAt < DateTime.UtcNow ? null : _token; + set => _token = value; + } + + /// + /// Get link to spotify by search query + /// + /// DTO with search query + /// link from spotify + /// If token problems + /// If response is bad + public override async Task GetLinkByQuery(TrackDto query) + { + if (Token == null) + { + var newToken = await _authService.GetToken() as SpotifyAuthResponse; + Token = newToken ?? + throw new AuthenticationFailureException(string.Format(Messages.AuthFailMessage, ServiceType)); + } + + using var client = new HttpClient(); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.Token); + + var url = new UriBuilder(_searchUri) + { + Port = -1 + }; + var urlQuery = HttpUtility.ParseQueryString(url.Query); + urlQuery["q"] = GetQuery(query); + urlQuery["type"] = "track"; + urlQuery["limit"] = "1"; + urlQuery["offset"] = "0"; + url.Query = urlQuery.ToString(); + + var response = await client.GetAsync(url.Uri); + if (!response.IsSuccessStatusCode) throw new HttpRequestException("Request unsuccessful"); + var json = await JsonSerializer.DeserializeAsync( + await response.Content.ReadAsStreamAsync()); + + // ReSharper disable once NullableWarningSuppressionIsUsed + return json!.Tracks.Items[0].ExternalUrls.Spotify; + } + + public override async Task GetQueryObject(string link, string countryCode = "US") + { + var url = new Uri(link); + var id = url.Segments[^1]; + + if (Token == null) + { + var newToken = await _authService.GetToken() as SpotifyAuthResponse; + Token = newToken ?? + throw new AuthenticationFailureException(string.Format(Messages.AuthFailMessage, ServiceType)); + } + using var client = new HttpClient(); + //Prepare request + var clientHeaders = client.DefaultRequestHeaders; + clientHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.Token); + + var builder = new UriBuilder(Config.Endpoints.Api + Path.Combine(Config.ApiPaths.GetTrack, id)) + { + Port = -1, + Query = $"market={countryCode}" + }; + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, builder.Uri); + //Get response + var response = await client.SendAsync(httpRequest); + if (!response.IsSuccessStatusCode) throw new HttpRequestException("Request unsuccessful"); + + var json = + await JsonSerializer.DeserializeAsync(await response.Content.ReadAsStreamAsync()); + // ReSharper disable once NullableWarningSuppressionIsUsed + var artists = string.Join(", ", json!.Artists.ToList().ConvertAll(x => x.Name)); + + return new TrackDto(json.Name, artists, json.Albums.Name, ServiceType); + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Api/TidalService.cs b/SWAD.API/Services/MusicAPI/Api/TidalService.cs new file mode 100644 index 0000000..e64432f --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Api/TidalService.cs @@ -0,0 +1,189 @@ +using System.Net; +using System.Net.Http.Headers; +using System.Text; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Web; +using Microsoft.AspNetCore.Authentication; +using Microsoft.Extensions.Options; +using SWAD.API.Consts; +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Exceptions; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Models.JsonStructures.MusicAPI.Tidal; +using SWAD.API.Services.MusicAPI.Auth; + +namespace SWAD.API.Services.MusicAPI.Api; + +public class TidalService : ApiService +{ + private readonly TidalAuthService _authService; + private TidalAuthResponse? _token; + + public TidalService(IOptions config, IEnumerable authServices) + { + ServiceType = MusicService.Tidal; + var configServices = config.Value.ServicesData; + Config = configServices.First(x => x.Name == ServiceType.ToString()); + _authService = authServices.First(x => x.ServiceType == ServiceType) as TidalAuthService + ?? throw new ApplicationException("Auth service not found"); + } + + //Auto revoke on Expire + private TidalAuthResponse? Token + { + get => _token?.ExpireAt < DateTime.UtcNow ? null : _token; + set => _token = value; + } + + public override async Task GetLinkByQuery(TrackDto query) + { + var searchUri = new UriBuilder(Config.Endpoints.Api); + if (Token == null) + { + var newToken = await _authService.GetToken() as TidalAuthResponse; + Token = newToken ?? + throw new AuthenticationFailureException(string.Format(Messages.AuthFailMessage, ServiceType)); + } + + using var client = new HttpClient(); + var clientHeaders = client.DefaultRequestHeaders; + clientHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.Token); + clientHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.api+json")); + + searchUri.Scheme = "https"; + searchUri.Path = Path.Combine(searchUri.Path, Config.ApiPaths.Search, WebUtility.UrlEncode(GetQuery(query) + //TODO: Это нужно, разработчики TIDAL дауны + )); + var url = new UriBuilder(searchUri.Uri) + { + Port = -1 + }; + var urlQuery = HttpUtility.ParseQueryString(url.Query); + //TODO: придумать что-то с этим + urlQuery["countryCode"] = "US"; + urlQuery["include"] = "tracks"; + + url.Query = urlQuery.ToString(); + var httpRequest = new HttpRequestMessage(HttpMethod.Get, url.Uri); + httpRequest.Content = + new StringContent(string.Empty, new MediaTypeHeaderValue("application/vnd.tidal.v1+json")); + + var response = await client.SendAsync(httpRequest); + if (!response.IsSuccessStatusCode) + { + var requestDebugData = await response.Content.ReadAsStringAsync(); + throw new HttpRequestException(ErrorResources.Unsuccessful); + } + + var json = + await JsonSerializer.DeserializeAsync(await response.Content.ReadAsStreamAsync()); + // ReSharper disable once NullableWarningSuppressionIsUsed + if (json.Data.RelationShips.Track.Data.Count < 1) + { + throw new TrackNotFoundException($"Track is not found in {ServiceType}"); + } + + //return null!; //TODO: Rewrite whole service + return Config.Endpoints.MusicLink[0] + json.Data.RelationShips.Track.Data[0].Id; + } + + public override async Task GetQueryObject(string link, string countryCode = "US") + { + var url = new Uri(link); + var id = url.Segments[^1]; + + if (Token == null) + { + var newToken = await _authService.GetToken() as TidalAuthResponse; + Token = newToken ?? + throw new AuthenticationFailureException(string.Format(Messages.AuthFailMessage, ServiceType)); + } + + //Prepare request + using var client = new HttpClient(); + + //Get response + var nameResponse = await client.SendAsync(GetRequestMessage(client, id, countryCode)); + if (!nameResponse.IsSuccessStatusCode) + if (nameResponse.StatusCode == HttpStatusCode.NotFound) + { + //TODO: переписать на норм обработку CountryCode + Thread.Sleep(1000); + nameResponse = await client.SendAsync(GetRequestMessage(client, id, "GB")); //Оверрайдим на европу + if (!nameResponse.IsSuccessStatusCode) + { + throw new HttpRequestException(ErrorResources.Unsuccessful); + } + } + else + throw new HttpRequestException(ErrorResources.Unsuccessful); + + var trackJson = + await JsonSerializer.DeserializeAsync(await nameResponse.Content.ReadAsStreamAsync()); + + StringBuilder artists = new(); + foreach (var data in trackJson?.Data.RelationShips.Artist.Data) + { + var artistsResponse = await client.SendAsync(GetRequestMessage(client, data.Id, countryCode, true)); + if (!artistsResponse.IsSuccessStatusCode) + if (artistsResponse.StatusCode == HttpStatusCode.NotFound) + { + //TODO: переписать на норм обработку CountryCode + Thread.Sleep(1000); + artistsResponse = + await client.SendAsync(GetRequestMessage(client, id, "GB", true)); //Оверрайдим на европу + if (!artistsResponse.IsSuccessStatusCode) + { + throw new HttpRequestException(ErrorResources.Unsuccessful); + } + } + else + throw new HttpRequestException(ErrorResources.Unsuccessful); + + var artistJson = + await JsonSerializer.DeserializeAsync( + await artistsResponse.Content.ReadAsStreamAsync()); + artists.AppendJoin(",", artistJson?.Data.Attributes.Name); + } + + // ReSharper disable once NullableWarningSuppressionIsUsed + //var artists = string.Join(", ", json!.Resource.Artists.ToList().ConvertAll(x => x.Name)); + return new TrackDto(trackJson?.Data.Attributes.Title!, artists.ToString(), null!, ServiceType); + } + + private HttpRequestMessage GetRequestMessage(HttpClient client, string id, string countryCode, + bool isArtist = false) + { + var clientHeaders = client.DefaultRequestHeaders; + clientHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token.Token); + clientHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.tidal.v1+json")); + + UriBuilder builder; + if (isArtist) + { + builder = new UriBuilder(Config.Endpoints.Api + Path.Combine(Config.ApiPaths.GetArtist, id)) + { + Port = -1 + }; + } + else + { + builder = new UriBuilder(Config.Endpoints.Api + Path.Combine(Config.ApiPaths.GetTrack, id)) + { + Port = -1, + Query = "include=artists" + }; + } + + var urlQuery = HttpUtility.ParseQueryString(builder.Query); + //TODO: Придумать что-то с countryCode + urlQuery["countryCode"] = countryCode; + builder.Query = urlQuery.ToString(); + + var httpRequest = new HttpRequestMessage(HttpMethod.Get, builder.Uri); + httpRequest.Content = new StringContent(string.Empty, Encoding.UTF8, "application/vnd.tidal.v1+json"); + return httpRequest; + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Api/YandexService.cs b/SWAD.API/Services/MusicAPI/Api/YandexService.cs new file mode 100644 index 0000000..5d05167 --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Api/YandexService.cs @@ -0,0 +1,88 @@ +using System.Net; +using System.Web; +using Microsoft.Extensions.Options; +using SWAD.API.Consts; +using SWAD.API.Consts.Enums; +using SWAD.API.Controllers.DTOs; +using SWAD.API.Exceptions; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Models.JsonStructures.MusicAPI.Yandex; +using SWAD.API.Services.MusicAPI.Auth; + +namespace SWAD.API.Services.MusicAPI.Api; + +public class YandexService : ApiService +{ + public YandexService(IOptions config, IEnumerable authServices) + { + ServiceType = MusicService.Yandex; + var configServices = config.Value.ServicesData; + Config = configServices.First(x => x.Name == ServiceType.ToString()); + } + + + public override async Task GetLinkByQuery(TrackDto query) + { + var searchUri = new Uri(new Uri(Config.Endpoints.Api), Config.ApiPaths.Search); + + using var client = new HttpClient(); + var clientHeaders = client.DefaultRequestHeaders; + + var response = await client.PostAsync(searchUri, new FormUrlEncodedContent([ + new("text", GetQuery(query)) + ])); + if (!response.IsSuccessStatusCode) + { + var requestDebugData = await response.Content.ReadAsStringAsync(); + throw new HttpRequestException($"{ErrorResources.Unsuccessful}\n Service returned: {requestDebugData}"); + } + + var json = await response.Content.ReadFromJsonAsync(); + // ReSharper disable once NullableWarningSuppressionIsUsed + if (json.Entities.Count < 1) + { + throw new TrackNotFoundException($"Track is not found in {ServiceType}"); + } + + var results = json.Entities.FirstOrDefault(x => x.Type == "track").Results; + /* + * ВНИМАНИЕ + * Yandex API писали шизы поэтому когда будешь добавлять поля в YandexSearchResponse и здесь их юзать + * ПОМНИ: ID у артистов и альбомов в разных местах JSON в одних и тех же объектах то string то number + * ЭТО ВЫЗОВЕТ ИСКЛЮЧЕНИЕ + * Думой + */ + var resultTrack = results.FirstOrDefault(x => x.Track.Title == query.Name) ?? + results[0]; + return $"{Config.Endpoints.MusicLink[0]}{resultTrack.Track.Id}"; + } + + public override async Task GetQueryObject(string link, string countryCode = "RU") + { + var url = new Uri(link); + var id = url.Segments[^1]; + //Prepare request + using var client = new HttpClient(); + var getTrackUrl = new UriBuilder(new Uri(new Uri(Config.Endpoints.Api), Config.ApiPaths.GetTrack)) + { + Port = -1 + }; + var urlQuery = HttpUtility.ParseQueryString(url.Query); + urlQuery["track"] = id; + getTrackUrl.Query = urlQuery.ToString(); + //Get response + var response = await client.GetAsync(getTrackUrl.Uri); + if (!response.IsSuccessStatusCode) + if (response.StatusCode == HttpStatusCode.NotFound) + { + throw new TrackNotFoundException("Ну, сори, яндекс кал"); + } + else + throw new HttpRequestException(ErrorResources.Unsuccessful); + + var json = await response.Content.ReadFromJsonAsync(); + // ReSharper disable once NullableWarningSuppressionIsUsed + var artists = string.Join(", ", json!.Artists.ToList().ConvertAll(x => x.Name)); + return new TrackDto(json.Track.Title, artists, json.Track.Albums[0].Title, ServiceType); + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Auth/AbstractAuthService.cs b/SWAD.API/Services/MusicAPI/Auth/AbstractAuthService.cs new file mode 100644 index 0000000..788fc0a --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Auth/AbstractAuthService.cs @@ -0,0 +1,33 @@ +using SWAD.API.Consts.Enums; +using SWAD.API.Models.Config.ApiServices.Structure; + +namespace SWAD.API.Services.MusicAPI.Auth; + +public abstract class AbstractAuthService +{ + public MusicService ServiceType { get; protected init; } + + // ReSharper disable once NullableWarningSuppressionIsUsed + protected ApiServiceData Data { get; init; } = null!; + public abstract Task GetToken(); + + /// + /// Get all implemented Auth Services + /// + /// API Services types + public static IEnumerable GetAllImplementations() + { + var type = typeof(AbstractAuthService); + var types = AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(s => s.GetTypes()) + .Where(p => type.IsAssignableFrom(p) && !p.IsInterface && !p.IsAbstract); + return types; + } +} + +public interface IAuthResponse +{ + public string Token { get; set; } + public int? ExpireTime { get; set; } + public DateTime? ExpireAt { get; } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Auth/SpotifyAuthService.cs b/SWAD.API/Services/MusicAPI/Auth/SpotifyAuthService.cs new file mode 100644 index 0000000..e7fd5f5 --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Auth/SpotifyAuthService.cs @@ -0,0 +1,44 @@ +using System.Text.Json; +using Microsoft.Extensions.Options; +using SWAD.API.Consts.Enums; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Models.JsonStructures.MusicAPI.Spotify; + +namespace SWAD.API.Services.MusicAPI.Auth; + +/// +public class SpotifyAuthService : AbstractAuthService +{ + public SpotifyAuthService(IOptions data) + { + ServiceType = MusicService.Spotify; + Data = data.Value.ServicesData.First(x => x.Name == ServiceType.ToString()); + } + + public override async Task GetToken() + { + using var httpClient = new HttpClient(); + var content = new Dictionary + { + { "grant_type", "client_credentials" }, + { "client_id", Data.ClientId }, + { "client_secret", Data.Secret } + }; + try + { + var response = await httpClient.PostAsync(Data.Endpoints.Token, new FormUrlEncodedContent(content)); + if (response.IsSuccessStatusCode) + { + var ans = await JsonSerializer.DeserializeAsync( + await response.Content.ReadAsStreamAsync()); + return ans; + } + } + catch (Exception) + { + return null; + } + + return null; + } +} \ No newline at end of file diff --git a/SWAD.API/Services/MusicAPI/Auth/TidalAuthService.cs b/SWAD.API/Services/MusicAPI/Auth/TidalAuthService.cs new file mode 100644 index 0000000..76950d3 --- /dev/null +++ b/SWAD.API/Services/MusicAPI/Auth/TidalAuthService.cs @@ -0,0 +1,46 @@ +using System.Net.Http.Headers; +using System.Text; +using System.Text.Json; +using Microsoft.Extensions.Options; +using SWAD.API.Consts.Enums; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Models.JsonStructures.MusicAPI.Tidal; + +namespace SWAD.API.Services.MusicAPI.Auth; + +/// +public class TidalAuthService : AbstractAuthService +{ + public TidalAuthService(IOptions data) + { + ServiceType = MusicService.Tidal; + Data = data.Value.ServicesData.First(x => x.Name == ServiceType.ToString()); + } + + public override async Task GetToken() + { + using var httpClient = new HttpClient(); + var base64Token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{Data.ClientId}:{Data.Secret}")); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token); + var content = new Dictionary + { + { "grant_type", "client_credentials" } + }; + try + { + var response = await httpClient.PostAsync(Data.Endpoints.Token, new FormUrlEncodedContent(content)); + if (response.IsSuccessStatusCode) + { + var ans = await JsonSerializer.DeserializeAsync( + await response.Content.ReadAsStreamAsync()); + return ans; + } + } + catch (Exception) + { + return null; + } + + return null; + } +} \ No newline at end of file diff --git a/SWAD.API/Startup.cs b/SWAD.API/Startup.cs new file mode 100644 index 0000000..7526e6a --- /dev/null +++ b/SWAD.API/Startup.cs @@ -0,0 +1,117 @@ +using System.Reflection; +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using StackExchange.Redis; +using SWAD.API.Middlewares; +using SWAD.API.Models.Config; +using SWAD.API.Models.Config.ApiServices; +using SWAD.API.Services.Links; +using SWAD.API.Services.MusicAPI.Api; +using SWAD.API.Services.MusicAPI.Auth; + +namespace SWAD.API; + +public static class Startup +{ + private static ServicesEndpointsConfig? _servicesEndpointsConfig; + + public static void Configure(WebApplicationBuilder builder) + { + SetConfigurations(builder); + } + + public static void ConfigureServices(IServiceCollection services) + { + SetServiceUsages(services); + SetCustomServices(services); + } + + public static void ConfigureApplication(WebApplication app) + { + SetAppUsages(app); + SetAppMappings(app); + } + + private static void SetConfigurations(WebApplicationBuilder builder) + { + //Json config setup + builder.Configuration.AddJsonFile("appsettings.json", false, true) //load base settings + .AddJsonFile("appsettings.local.json", true, true); //load local settings + + builder.Services.Configure + (builder.Configuration.GetSection(ApiServicesConfig.ConfigName)); + builder.Services.Configure + (builder.Configuration.GetSection(ServicesEndpointsConfig.ConfigName)); + + //Get config for setup + _servicesEndpointsConfig = builder.Configuration + .GetSection(ServicesEndpointsConfig.ConfigName) + .Get(); + } + + private static void SetServiceUsages(IServiceCollection services) + { + services.AddProblemDetails(); + services.AddControllers(); + + services.AddSwaggerGen(options => + { + options.SwaggerDoc("v1", new OpenApiInfo + { + Version = Assembly.GetExecutingAssembly().GetName().Version!.ToString(), + Title = "SWAD.API", + Description = + "Share With All, Dude - Platform for sharing music links from one music service to another for free!\n" + + "API Reference for SWAD.Front and for guys who trying to make themself stuff :)", + TermsOfService = new Uri("https://github.com/SpectruMTeamCode/SWAD/tree/main"), + Contact = new OpenApiContact + { + Name = "GitHub", + Url = new Uri("https://github.com/SpectruMTeamCode/SWAD/tree/main") + } + }); + options.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "doc.xml")); + options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); + }); + } + + private static void SetCustomServices(IServiceCollection services) + { + //Custom services setup + + //TODO read from config + services.AddSingleton(ConnectionMultiplexer.Connect(_servicesEndpointsConfig.Redis)); + services.AddSingleton(p => + p.GetService()?.GetDatabase() ?? + throw new NullReferenceException("Чёт с инжектом редиса не то")); + services.AddSingleton(p => ConnectionMultiplexer.Connect(_servicesEndpointsConfig.Redis)); + services.AddSingleton(p => p.GetService()!.GetDatabase()); + services.AddSingleton(); + + //Register all IAPIService implementations + foreach (var service in ApiService.GetAllImplementations()) services.AddSingleton(typeof(ApiService), service); + //Register all AuthService implementations + foreach (var service in AbstractAuthService.GetAllImplementations()) + services.AddSingleton(typeof(AbstractAuthService), service); + } + + private static void SetAppUsages(WebApplication app) + { + app.UseMiddleware(); + app.UseSwagger(); + app.UseSwaggerUI(options => + { + options.InjectStylesheet("/swagger-ui/theme-flattop.css"); + options.IndexStream = () => Assembly.GetEntryAssembly()!.GetManifestResourceStream("SWAD.API.index.html"); + }); + app.UseStaticFiles(); + } + + private static void SetAppMappings(WebApplication app) + { + app.MapControllers(); + + //Redirect to swagger + app.Map("/", () => { return Results.LocalRedirect("/swagger"); }); + } +} \ No newline at end of file diff --git a/SWAD.API/appsettings.json b/SWAD.API/appsettings.json new file mode 100644 index 0000000..8290087 --- /dev/null +++ b/SWAD.API/appsettings.json @@ -0,0 +1,73 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "APIServices": { + "ServicesData": [ + { + "Name": "Spotify", + "ClientId": "INSERT CLIENTID HERE", + "Secret": "INSERT SECRET HERE", + "Endpoints": { + "Base": "https://open.spotify.com/", + "Api": "https://api.spotify.com/v1/", + "Token": "https://accounts.spotify.com/api/token", + "MusicLink": [ + "https://play.spotify.com/track/", + "https://open.spotify.com/track/" + ] + }, + "APIPaths": { + "Search": "search", + "GetTrack": "tracks" + } + }, + { + "Name": "Tidal", + "ClientId": "INSERT CLIENTID HERE", + "Secret": "INSERT SECRET HERE", + "Endpoints": { + "Base": "https://tidal.com", + "Api": "https://openapi.tidal.com/v2/", + "Token": "https://auth.tidal.com/v1/oauth2/token", + "MusicLink": [ + "https://tidal.com/track/", + "https://tidal.com/browse/track/" + ] + }, + "APIPaths": { + "Search": "searchresults", + "GetTrack": "tracks", + "GetArtist": "artists" + } + }, + { + "Name": "Yandex", + "ClientId": "", + "Secret": "", + "Endpoints": { + "Base": "https://music.yandex.ru", + "Api": "https://music.yandex.ru", + "Token": "https://music.yandex.ru", + "MusicLink": [ + "https://music.yandex.ru/track/", + "https://music.yandex.ru/album/", + "https://music.yandex.by/track/", + "https://music.yandex.by/album/" + ] + }, + "APIPaths": { + "Search": "handlers/suggest.jsx", + "GetTrack": "handlers/track.jsx" + } + } + ] + }, + "ServicesEndpoints": { + "Redis": "redis:6379" + } +} \ No newline at end of file diff --git a/SWAD.API/doc.xml b/SWAD.API/doc.xml new file mode 100644 index 0000000..45e03dc --- /dev/null +++ b/SWAD.API/doc.xml @@ -0,0 +1,249 @@ + + + + SWAD.API + + + + + Spotify Service + + + + + Tidal Service + + + + + Yandex Service + + + + + Service errors for controller + + + + + Returns on the successful executed state + + + + + Returns on the unsuccessful executed state + + + + + Returns on the unsuccessful executed state not by code + + + + + Returns on the unsuccessful executed state by user + + + + + Returns on the unsuccessful executed state by service + + + + + Track directly from query + + Name of track + Artist of track + AlbumObject of track + Service provider + + + + Track directly from query + + Name of track + Artist of track + AlbumObject of track + Service provider + + + + Track from service link + + + Spotify example: https://open.spotify.com/track/2K7xn816oNHJZ0aVqdQsha + Tidal example: https://tidal.com/track/294942856 + Yandex.Music example: https://music.yandex.by/Albums/25851387/track/113810002 P.S.: Будда какая параша, даже тут + яндекс отличился + + + + + + + Track from service link + + + Spotify example: https://open.spotify.com/track/2K7xn816oNHJZ0aVqdQsha + Tidal example: https://tidal.com/track/294942856 + Yandex.Music example: https://music.yandex.by/Albums/25851387/track/113810002 P.S.: Будда какая параша, даже тут + яндекс отличился + + + + + + + Service Name + + Enum MusicService + MusicService.ToString + + + + Service Name + + Enum MusicService + MusicService.ToString + + + + Result of GetLink method + + + + + + Result of GetLink method + + + + + + Controller for get links from music providers + + + + + Controller for get links from music providers + + + + + Get link from other link + + Track query such as Name, artist, Albums + Link for track + + + + Get link from search query such as artist and song Name + + Track query such as Name, artist, Albums + Link for track + + + + Get service what uses that link + + + + + + + + DONT TOUCH THAT!!! Generate good messages for responses and handle to logger exceptions + + + + + + + + DONT TOUCH THAT!!! Generate good messages for responses and handle to logger exceptions + + + + + + + + Json Structure for spotify auth response + + + + + Json Structure for spotify search response + + + + + Json Structure for tidal track response + + + + + Json Structure for tidal track response + + + + + Service for manipulating with links (LinkController) + + + + + Get link by query + + Search query + Success, Failure, BadRequest, NoResponse + + + + Get MusicService by url + + + Success, Failure + + + + Get Link from other service + + link from first service + link from another service, Success, Failure, BadRequest, NoResponse + + + + Abstract ApiService of music services + + + + + Get all implemented API Services + + API Services types + + + + Get link to spotify by search query + + DTO with search query + link from spotify + If token problems + If response is bad + + + + Get all implemented Auth Services + + API Services types + + + + + + + + + diff --git a/SWAD.API/index.html b/SWAD.API/index.html new file mode 100644 index 0000000..bbc132c --- /dev/null +++ b/SWAD.API/index.html @@ -0,0 +1,119 @@ + + + + + + SWAD.API Reference + + + + + %(HeadContent) + + + +
+ + + + + + + + + diff --git a/SWAD.API/wwwroot/swagger-ui/theme-flattop.css b/SWAD.API/wwwroot/swagger-ui/theme-flattop.css new file mode 100644 index 0000000..62c8e40 --- /dev/null +++ b/SWAD.API/wwwroot/swagger-ui/theme-flattop.css @@ -0,0 +1,1673 @@ +@charset "UTF-8"; +.swagger-ui html { + box-sizing: border-box +} + +.swagger-ui *, .swagger-ui :after, .swagger-ui :before { + box-sizing: inherit +} + +.swagger-ui body { + margin: 0; + background: #fafafa +} + +.swagger-ui .wrapper { + width: 100%; + max-width: 1460px; + margin: 0 auto; + padding: 0 20px +} + +.swagger-ui .opblock-tag-section { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column +} + +.swagger-ui .opblock-tag { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 10px 20px 10px 10px; + cursor: pointer; + -webkit-transition: all .2s; + transition: all .2s; + border-bottom: 1px solid rgba(59, 65, 81, .3); + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .opblock-tag:hover { + background: rgba(0, 0, 0, .02) +} + +.swagger-ui .opblock-tag { + font-size: 24px; + margin: 0 0 5px; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .opblock-tag.no-desc span { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.swagger-ui .opblock-tag svg { + -webkit-transition: all .4s; + transition: all .4s +} + +.swagger-ui .opblock-tag small { + font-size: 14px; + font-weight: 400; + padding: 0 10px; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .parаmeter__type { + font-size: 12px; + padding: 5px 0; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .view-line-link { + position: relative; + top: 3px; + width: 20px; + margin: 0 5px; + cursor: pointer; + -webkit-transition: all .5s; + transition: all .5s +} + +.swagger-ui .opblock { + margin: 0 0 15px; + border: 1px solid #000; + border-radius: 4px; + box-shadow: 0 0 3px rgba(0, 0, 0, .19) +} + +.swagger-ui .opblock.is-open .opblock-summary { + border-bottom: 1px solid #000 +} + +.swagger-ui .opblock .opblock-section-header { + padding: 8px 20px; + background: hsla(0, 0%, 100%, .8); + box-shadow: 0 1px 2px rgba(0, 0, 0, .1) +} + +.swagger-ui .opblock .opblock-section-header, .swagger-ui .opblock .opblock-section-header label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .opblock .opblock-section-header label { + font-size: 12px; + font-weight: 700; + margin: 0; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .opblock .opblock-section-header label span { + padding: 0 10px 0 0 +} + +.swagger-ui .opblock .opblock-section-header h4 { + font-size: 14px; + margin: 0; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .opblock .opblock-summary-method { + font-size: 14px; + font-weight: 700; + min-width: 80px; + padding: 6px 15px; + text-align: center; + border-radius: 3px; + background: #000; + text-shadow: 0 1px 0 rgba(0, 0, 0, .1); + font-family: Titillium Web, sans-serif; + color: #fff +} + +.swagger-ui .opblock .opblock-summary-path, .swagger-ui .opblock .opblock-summary-path__deprecated { + font-size: 16px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 0 10px; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .opblock .opblock-summary-path .view-line-link, .swagger-ui .opblock .opblock-summary-path__deprecated .view-line-link { + position: relative; + top: 2px; + width: 0; + margin: 0; + cursor: pointer; + -webkit-transition: all .5s; + transition: all .5s +} + +.swagger-ui .opblock .opblock-summary-path:hover .view-line-link, .swagger-ui .opblock .opblock-summary-path__deprecated:hover .view-line-link { + width: 18px; + margin: 0 5px +} + +.swagger-ui .opblock .opblock-summary-path__deprecated { + text-decoration: line-through +} + +.swagger-ui .opblock .opblock-summary-description { + font-size: 13px; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .opblock .opblock-summary { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 5px; + cursor: pointer; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .opblock.opblock-post { + border-color: #49cc90; + background: rgba(73, 204, 144, .1) +} + +.swagger-ui .opblock.opblock-post .opblock-summary-method { + background: #49cc90 +} + +.swagger-ui .opblock.opblock-post .opblock-summary { + border-color: #49cc90 +} + +.swagger-ui .opblock.opblock-put { + border-color: #fca130; + background: rgba(252, 161, 48, .1) +} + +.swagger-ui .opblock.opblock-put .opblock-summary-method { + background: #fca130 +} + +.swagger-ui .opblock.opblock-put .opblock-summary { + border-color: #fca130 +} + +.swagger-ui .opblock.opblock-delete { + border-color: #f93e3e; + background: rgba(249, 62, 62, .1) +} + +.swagger-ui .opblock.opblock-delete .opblock-summary-method { + background: #f93e3e +} + +.swagger-ui .opblock.opblock-delete .opblock-summary { + border-color: #f93e3e +} + +.swagger-ui .opblock.opblock-get { + border-color: #61affe; + background: rgba(97, 175, 254, .1) +} + +.swagger-ui .opblock.opblock-get .opblock-summary-method { + background: #61affe +} + +.swagger-ui .opblock.opblock-get .opblock-summary { + border-color: #61affe +} + +.swagger-ui .opblock.opblock-patch { + border-color: #50e3c2; + background: rgba(80, 227, 194, .1) +} + +.swagger-ui .opblock.opblock-patch .opblock-summary-method { + background: #50e3c2 +} + +.swagger-ui .opblock.opblock-patch .opblock-summary { + border-color: #50e3c2 +} + +.swagger-ui .opblock.opblock-head { + border-color: #9012fe; + background: rgba(144, 18, 254, .1) +} + +.swagger-ui .opblock.opblock-head .opblock-summary-method { + background: #9012fe +} + +.swagger-ui .opblock.opblock-head .opblock-summary { + border-color: #9012fe +} + +.swagger-ui .opblock.opblock-options { + border-color: #0d5aa7; + background: rgba(13, 90, 167, .1) +} + +.swagger-ui .opblock.opblock-options .opblock-summary-method { + background: #0d5aa7 +} + +.swagger-ui .opblock.opblock-options .opblock-summary { + border-color: #0d5aa7 +} + +.swagger-ui .opblock.opblock-deprecated { + opacity: .6; + border-color: #ebebeb; + background: hsla(0, 0%, 92%, .1) +} + +.swagger-ui .opblock.opblock-deprecated .opblock-summary-method { + background: #ebebeb +} + +.swagger-ui .opblock.opblock-deprecated .opblock-summary { + border-color: #ebebeb +} + +.swagger-ui .tab { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin: 20px 0 10px; + padding: 0; + list-style: none +} + +.swagger-ui .tab li { + font-size: 12px; + min-width: 100px; + min-width: 90px; + padding: 0; + cursor: pointer; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .tab li:first-of-type { + position: relative; + padding-left: 0 +} + +.swagger-ui .tab li:first-of-type:after { + position: absolute; + top: 0; + right: 6px; + width: 1px; + height: 100%; + content: ""; + background: rgba(0, 0, 0, .2) +} + +.swagger-ui .tab li.active { + font-weight: 700 +} + +.swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-title_normal { + padding: 15px 20px +} + +.swagger-ui .opblock-description-wrapper, .swagger-ui .opblock-description-wrapper h4, .swagger-ui .opblock-title_normal, .swagger-ui .opblock-title_normal h4 { + font-size: 12px; + margin: 0 0 5px; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .opblock-description-wrapper p, .swagger-ui .opblock-title_normal p { + font-size: 14px; + margin: 0; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .execute-wrapper { + padding: 20px; + text-align: right +} + +.swagger-ui .execute-wrapper .btn { + width: 100%; + padding: 8px 40px +} + +.swagger-ui .body-param-options { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column +} + +.swagger-ui .body-param-options .body-param-edit { + padding: 10px 0 +} + +.swagger-ui .body-param-options label { + padding: 8px 0 +} + +.swagger-ui .body-param-options label select { + margin: 3px 0 0 +} + +.swagger-ui .responses-inner { + padding: 20px +} + +.swagger-ui .responses-inner h4, .swagger-ui .responses-inner h5 { + font-size: 12px; + margin: 10px 0 5px; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .response-col_status { + font-size: 14px; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .response-col_status .response-undocumented { + font-size: 11px; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #999 +} + +.swagger-ui .response-col_description__inner span { + font-size: 12px; + font-style: italic; + display: block; + margin: 10px 0; + padding: 10px; + border-radius: 4px; + background: #41444e; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #fff +} + +.swagger-ui .response-col_description__inner span p { + margin: 0 +} + +.swagger-ui .opblock-body pre { + font-size: 12px; + margin: 0; + padding: 10px; + white-space: pre-wrap; + border-radius: 4px; + background: #41444e; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #fff +} + +.swagger-ui .opblock-body pre span { + color: #fff !important +} + +.swagger-ui .scheme-container { + margin: 0 0 20px; + padding: 30px 0; + background: #fff; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15) +} + +.swagger-ui .scheme-container .schemes { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .scheme-container .schemes > label { + font-size: 12px; + font-weight: 700; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + margin: -20px 15px 0 0; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .scheme-container .schemes > label select { + min-width: 130px; + text-transform: uppercase +} + +.swagger-ui .loading-container { + padding: 40px 0 60px +} + +.swagger-ui .loading-container .loading { + position: relative +} + +.swagger-ui .loading-container .loading:after { + font-size: 10px; + font-weight: 700; + position: absolute; + top: 50%; + left: 50%; + content: "loading"; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-transform: uppercase; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .loading-container .loading:before { + position: absolute; + top: 50%; + left: 50%; + display: block; + width: 60px; + height: 60px; + margin: -30px; + content: ""; + -webkit-animation: rotation 1s infinite linear, opacity .5s; + animation: rotation 1s infinite linear, opacity .5s; + opacity: 1; + border: 2px solid rgba(85, 85, 85, .1); + border-top-color: rgba(0, 0, 0, .6); + border-radius: 100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden +} + +@-webkit-keyframes rotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn) + } +} + +@keyframes rotation { + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn) + } +} + +@-webkit-keyframes blinker { + 50% { + opacity: 0 + } +} + +@keyframes blinker { + 50% { + opacity: 0 + } +} + +.swagger-ui .btn { + font-size: 14px; + font-weight: 700; + padding: 5px 23px; + -webkit-transition: all .3s; + transition: all .3s; + border: 2px solid #888; + border-radius: 4px; + background: transparent; + box-shadow: 0 1px 2px rgba(0, 0, 0, .1); + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .btn[disabled] { + cursor: not-allowed; + opacity: .3 +} + +.swagger-ui .btn:hover { + box-shadow: 0 0 5px rgba(0, 0, 0, .3) +} + +.swagger-ui .btn.cancel { + border-color: #ff6060; + font-family: Titillium Web, sans-serif; + color: #ff6060 +} + +.swagger-ui .btn.authorize { + line-height: 1; + display: inline; + color: #49cc90; + border-color: #49cc90 +} + +.swagger-ui .btn.authorize span { + float: left; + padding: 4px 20px 0 0 +} + +.swagger-ui .btn.authorize svg { + fill: #49cc90 +} + +.swagger-ui .btn.execute { + -webkit-animation: pulse 2s infinite; + animation: pulse 2s infinite; + color: #fff; + border-color: #4990e2 +} + +@-webkit-keyframes pulse { + 0% { + color: #fff; + background: #4990e2; + box-shadow: 0 0 0 0 rgba(73, 144, 226, .8) + } + 70% { + box-shadow: 0 0 0 5px rgba(73, 144, 226, 0) + } + to { + color: #fff; + background: #4990e2; + box-shadow: 0 0 0 0 rgba(73, 144, 226, 0) + } +} + +@keyframes pulse { + 0% { + color: #fff; + background: #4990e2; + box-shadow: 0 0 0 0 rgba(73, 144, 226, .8) + } + 70% { + box-shadow: 0 0 0 5px rgba(73, 144, 226, 0) + } + to { + color: #fff; + background: #4990e2; + box-shadow: 0 0 0 0 rgba(73, 144, 226, 0) + } +} + +.swagger-ui .btn-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 30px +} + +.swagger-ui .btn-group .btn { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.swagger-ui .btn-group .btn:first-child { + border-radius: 4px 0 0 4px +} + +.swagger-ui .btn-group .btn:last-child { + border-radius: 0 4px 4px 0 +} + +.swagger-ui .authorization__btn { + padding: 0 10px; + border: none; + background: none +} + +.swagger-ui .authorization__btn.locked { + opacity: 1 +} + +.swagger-ui .authorization__btn.unlocked { + opacity: .4 +} + +.swagger-ui .expand-methods, .swagger-ui .expand-operation { + border: none; + background: none +} + +.swagger-ui .expand-methods svg, .swagger-ui .expand-operation svg { + width: 20px; + height: 20px +} + +.swagger-ui .expand-methods { + padding: 0 10px +} + +.swagger-ui .expand-methods:hover svg { + fill: #444 +} + +.swagger-ui .expand-methods svg { + -webkit-transition: all .3s; + transition: all .3s; + fill: #777 +} + +.swagger-ui button { + cursor: pointer; + outline: none +} + +.swagger-ui select { + font-size: 14px; + font-weight: 700; + padding: 5px 40px 5px 10px; + border: 2px solid #41444e; + border-radius: 4px; + background: #f7f7f7 url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICAgIDxwYXRoIGQ9Ik0xMy40MTggNy44NTljLjI3MS0uMjY4LjcwOS0uMjY4Ljk3OCAwIC4yNy4yNjguMjcyLjcwMSAwIC45NjlsLTMuOTA4IDMuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC0zLjkwOC0zLjgzYy0uMjctLjI2Ny0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc4IDBMMTAgMTFsMy40MTgtMy4xNDF6Ii8+PC9zdmc+) right 10px center no-repeat; + background-size: 20px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .25); + font-family: Titillium Web, sans-serif; + color: #3b4151; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.swagger-ui select[multiple] { + margin: 5px 0; + padding: 5px; + background: #f7f7f7 +} + +.swagger-ui .opblock-body select { + min-width: 230px +} + +.swagger-ui label { + font-size: 12px; + font-weight: 700; + margin: 0 0 5px; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui input[type=email], .swagger-ui input[type=password], .swagger-ui input[type=search], .swagger-ui input[type=text] { + min-width: 100px; + margin: 5px 0; + padding: 8px 10px; + border: 1px solid #d9d9d9; + border-radius: 4px; + background: #fff +} + +.swagger-ui input[type=email].invalid, .swagger-ui input[type=password].invalid, .swagger-ui input[type=search].invalid, .swagger-ui input[type=text].invalid { + -webkit-animation: shake .4s 1; + animation: shake .4s 1; + border-color: #f93e3e; + background: #feebeb +} + +@-webkit-keyframes shake { + 10%, 90% { + -webkit-transform: translate3d(-1px, 0, 0); + transform: translate3d(-1px, 0, 0) + } + 20%, 80% { + -webkit-transform: translate3d(2px, 0, 0); + transform: translate3d(2px, 0, 0) + } + 30%, 50%, 70% { + -webkit-transform: translate3d(-4px, 0, 0); + transform: translate3d(-4px, 0, 0) + } + 40%, 60% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0) + } +} + +@keyframes shake { + 10%, 90% { + -webkit-transform: translate3d(-1px, 0, 0); + transform: translate3d(-1px, 0, 0) + } + 20%, 80% { + -webkit-transform: translate3d(2px, 0, 0); + transform: translate3d(2px, 0, 0) + } + 30%, 50%, 70% { + -webkit-transform: translate3d(-4px, 0, 0); + transform: translate3d(-4px, 0, 0) + } + 40%, 60% { + -webkit-transform: translate3d(4px, 0, 0); + transform: translate3d(4px, 0, 0) + } +} + +.swagger-ui textarea { + font-size: 12px; + width: 100%; + min-height: 280px; + padding: 10px; + border: none; + border-radius: 4px; + outline: none; + background: hsla(0, 0%, 100%, .8); + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui textarea:focus { + border: 2px solid #61affe +} + +.swagger-ui textarea.curl { + font-size: 12px; + min-height: 100px; + margin: 0; + padding: 10px; + resize: none; + border-radius: 4px; + background: #41444e; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #fff +} + +.swagger-ui .checkbox { + padding: 5px 0 10px; + -webkit-transition: opacity .5s; + transition: opacity .5s; + color: #333 +} + +.swagger-ui .checkbox label { + display: -webkit-box; + display: -ms-flexbox; + display: flex +} + +.swagger-ui .checkbox p { + font-weight: 400 !important; + font-style: italic; + margin: 0 !important; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .checkbox input[type=checkbox] { + display: none +} + +.swagger-ui .checkbox input[type=checkbox] + label > .item { + position: relative; + top: 3px; + display: inline-block; + width: 16px; + height: 16px; + margin: 0 8px 0 0; + padding: 5px; + cursor: pointer; + border-radius: 1px; + background: #e8e8e8; + box-shadow: 0 0 0 2px #e8e8e8; + -webkit-box-flex: 0; + -ms-flex: none; + flex: none +} + +.swagger-ui .checkbox input[type=checkbox] + label > .item:active { + -webkit-transform: scale(.9); + transform: scale(.9) +} + +.swagger-ui .checkbox input[type=checkbox]:checked + label > .item { + background: #e8e8e8 url("data:image/svg+xml;charset=utf-8,%3Csvg width='10' height='8' viewBox='3 7 10 8' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%2341474E' fill-rule='evenodd' d='M6.333 15L3 11.667l1.333-1.334 2 2L11.667 7 13 8.333z'/%3E%3C/svg%3E") 50% no-repeat +} + +.swagger-ui .dialog-ux { + position: fixed; + z-index: 9999; + top: 0; + right: 0; + bottom: 0; + left: 0 +} + +.swagger-ui .dialog-ux .backdrop-ux { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0, 0, 0, .8) +} + +.swagger-ui .dialog-ux .modal-ux { + position: absolute; + z-index: 9999; + top: 50%; + left: 50%; + width: 100%; + min-width: 300px; + max-width: 650px; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + border: 1px solid #ebebeb; + border-radius: 4px; + background: #fff; + box-shadow: 0 10px 30px 0 rgba(0, 0, 0, .2) +} + +.swagger-ui .dialog-ux .modal-ux-content { + overflow-y: auto; + max-height: 540px; + padding: 20px +} + +.swagger-ui .dialog-ux .modal-ux-content p { + font-size: 12px; + margin: 0 0 5px; + color: #41444e; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .dialog-ux .modal-ux-content h4 { + font-size: 18px; + font-weight: 600; + margin: 15px 0 0; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .dialog-ux .modal-ux-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 12px 0; + border-bottom: 1px solid #ebebeb; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .dialog-ux .modal-ux-header .close-modal { + padding: 0 10px; + border: none; + background: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none +} + +.swagger-ui .dialog-ux .modal-ux-header h3 { + font-size: 20px; + font-weight: 600; + margin: 0; + padding: 0 20px; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .model { + font-size: 12px; + font-weight: 300; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .model-toggle { + font-size: 10px; + position: relative; + top: 6px; + display: inline-block; + margin: auto .3em; + cursor: pointer; + -webkit-transition: -webkit-transform .15s ease-in; + transition: -webkit-transform .15s ease-in; + transition: transform .15s ease-in; + transition: transform .15s ease-in, -webkit-transform .15s ease-in; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50% +} + +.swagger-ui .model-toggle.collapsed { + -webkit-transform: rotate(0deg); + transform: rotate(0deg) +} + +.swagger-ui .model-toggle:after { + display: block; + width: 20px; + height: 20px; + content: ""; + background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'/%3E%3C/svg%3E") 50% no-repeat; + background-size: 100% +} + +.swagger-ui .model-jump-to-path { + position: relative; + cursor: pointer +} + +.swagger-ui .model-jump-to-path .view-line-link { + position: absolute; + top: -.4em; + cursor: pointer +} + +.swagger-ui .model-title { + position: relative +} + +.swagger-ui .model-title:hover .model-hint { + visibility: visible +} + +.swagger-ui .model-hint { + position: absolute; + top: -1.8em; + visibility: hidden; + padding: .1em .5em; + white-space: nowrap; + color: #ebebeb; + border-radius: 4px; + background: rgba(0, 0, 0, .7) +} + +.swagger-ui section.models { + margin: 30px 0; + border: 1px solid rgba(59, 65, 81, .3); + border-radius: 4px +} + +.swagger-ui section.models.is-open { + padding: 0 0 20px +} + +.swagger-ui section.models.is-open h4 { + margin: 0 0 5px; + border-bottom: 1px solid rgba(59, 65, 81, .3) +} + +.swagger-ui section.models.is-open h4 svg { + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +.swagger-ui section.models h4 { + font-size: 16px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin: 0; + padding: 10px 20px 10px 10px; + cursor: pointer; + -webkit-transition: all .2s; + transition: all .2s; + font-family: Titillium Web, sans-serif; + color: #777; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui section.models h4 svg { + -webkit-transition: all .4s; + transition: all .4s +} + +.swagger-ui section.models h4 span { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1 +} + +.swagger-ui section.models h4:hover { + background: rgba(0, 0, 0, .02) +} + +.swagger-ui section.models h5 { + font-size: 16px; + margin: 0 0 10px; + font-family: Titillium Web, sans-serif; + color: #777 +} + +.swagger-ui section.models .model-jump-to-path { + position: relative; + top: 5px +} + +.swagger-ui section.models .model-container { + margin: 0 20px 15px; + -webkit-transition: all .5s; + transition: all .5s; + border-radius: 4px; + background: rgba(0, 0, 0, .05) +} + +.swagger-ui section.models .model-container:hover { + background: rgba(0, 0, 0, .07) +} + +.swagger-ui section.models .model-container:first-of-type { + margin: 20px +} + +.swagger-ui section.models .model-container:last-of-type { + margin: 0 20px +} + +.swagger-ui section.models .model-box { + background: none +} + +.swagger-ui .model-box { + padding: 10px; + border-radius: 4px; + background: rgba(0, 0, 0, .1) +} + +.swagger-ui .model-box .model-jump-to-path { + position: relative; + top: 4px +} + +.swagger-ui .model-title { + font-size: 16px; + font-family: Titillium Web, sans-serif; + color: #555 +} + +.swagger-ui span > span.model, .swagger-ui span > span.model .brace-close { + padding: 0 0 0 10px +} + +.swagger-ui .prop-type { + color: #55a +} + +.swagger-ui .prop-enum { + display: block +} + +.swagger-ui .prop-format { + color: #999 +} + +.swagger-ui table { + width: 100%; + padding: 0 10px; + border-collapse: collapse +} + +.swagger-ui table.model tbody tr td { + padding: 0; + vertical-align: top +} + +.swagger-ui table.model tbody tr td:first-of-type { + width: 100px; + padding: 0 +} + +.swagger-ui table.headers td { + font-size: 12px; + font-weight: 300; + vertical-align: middle; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui table tbody tr td { + padding: 10px 0 0; + vertical-align: top +} + +.swagger-ui table tbody tr td:first-of-type { + width: 20%; + padding: 10px 0 +} + +.swagger-ui table thead tr td, .swagger-ui table thead tr th { + font-size: 12px; + font-weight: 700; + padding: 12px 0; + text-align: left; + border-bottom: 1px solid rgba(59, 65, 81, .2); + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .parameters-col_description p { + font-size: 14px; + margin: 0; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .parameters-col_description input[type=text] { + width: 100%; + max-width: 340px +} + +.swagger-ui .parameter__name { + font-size: 16px; + font-weight: 400; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .parameter__name.required { + font-weight: 700 +} + +.swagger-ui .parameter__name.required:after { + font-size: 10px; + position: relative; + top: -6px; + padding: 5px; + content: "required"; + color: rgba(255, 0, 0, .6) +} + +.swagger-ui .parameter__in { + font-size: 12px; + font-style: italic; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #888 +} + +.swagger-ui .table-container { + padding: 20px +} + +.swagger-ui .topbar { + padding: 8px 30px; + background-color: #89bf04 +} + +.swagger-ui .topbar .topbar-wrapper { + -ms-flex-align: center +} + +.swagger-ui .topbar .topbar-wrapper, .swagger-ui .topbar a { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + align-items: center +} + +.swagger-ui .topbar a { + font-size: 1.5em; + font-weight: 700; + text-decoration: none; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + -ms-flex-align: center; + font-family: Titillium Web, sans-serif; + color: #fff +} + +.swagger-ui .topbar a span { + margin: 0; + padding: 0 10px +} + +.swagger-ui .topbar .download-url-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex +} + +.swagger-ui .topbar .download-url-wrapper input[type=text] { + min-width: 350px; + margin: 0; + border: 2px solid #547f00; + border-radius: 4px 0 0 4px; + outline: none +} + +.swagger-ui .topbar .download-url-wrapper .download-url-button { + font-size: 16px; + font-weight: 700; + padding: 4px 40px; + border: none; + border-radius: 0 4px 4px 0; + background: #547f00; + font-family: Titillium Web, sans-serif; + color: #fff +} + +.swagger-ui .info { + margin: 50px 0 +} + +.swagger-ui .info hgroup.main { + margin: 0 0 20px +} + +.swagger-ui .info hgroup.main a { + font-size: 12px +} + +.swagger-ui .info p { + font-size: 14px; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .info code { + padding: 3px 5px; + border-radius: 4px; + background: rgba(0, 0, 0, .05); + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #9012fe +} + +.swagger-ui .info a { + font-size: 14px; + -webkit-transition: all .4s; + transition: all .4s; + font-family: Open Sans, sans-serif; + color: #4990e2 +} + +.swagger-ui .info a:hover { + color: #1f69c0 +} + +.swagger-ui .info > div { + margin: 0 0 5px +} + +.swagger-ui .info .base-url { + font-size: 12px; + font-weight: 300 !important; + margin: 0; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .info .title { + font-size: 36px; + margin: 0; + font-family: Open Sans, sans-serif; + color: #3b4151 +} + +.swagger-ui .info .title small { + font-size: 10px; + position: relative; + top: -5px; + display: inline-block; + margin: 0 0 0 5px; + padding: 2px 4px; + vertical-align: super; + border-radius: 57px; + background: #7d8492 +} + +.swagger-ui .info .title small pre { + margin: 0; + font-family: Titillium Web, sans-serif; + color: #fff +} + +.swagger-ui .auth-btn-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + padding: 10px 0; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center +} + +.swagger-ui .auth-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end +} + +.swagger-ui .auth-wrapper .authorize { + padding-right: 20px +} + +.swagger-ui .auth-container { + margin: 0 0 10px; + padding: 10px 20px; + border-bottom: 1px solid #ebebeb +} + +.swagger-ui .auth-container:last-of-type { + margin: 0; + padding: 10px 20px; + border: 0 +} + +.swagger-ui .auth-container h4 { + margin: 5px 0 15px !important +} + +.swagger-ui .auth-container .wrapper { + margin: 0; + padding: 0 +} + +.swagger-ui .auth-container input[type=password], .swagger-ui .auth-container input[type=text] { + min-width: 230px +} + +.swagger-ui .auth-container .errors { + font-size: 12px; + padding: 10px; + border-radius: 4px; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .scopes h2 { + font-size: 14px; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +.swagger-ui .scope-def { + padding: 0 0 20px +} + +.swagger-ui .errors-wrapper { + margin: 20px; + padding: 10px 20px; + -webkit-animation: scaleUp .5s; + animation: scaleUp .5s; + border: 2px solid #f93e3e; + border-radius: 4px; + background: rgba(249, 62, 62, .1) +} + +.swagger-ui .errors-wrapper .error-wrapper { + margin: 0 0 10px +} + +.swagger-ui .errors-wrapper .errors h4 { + font-size: 14px; + margin: 0; + font-family: Source Code Pro, monospace; + font-weight: 600; + color: #3b4151 +} + +.swagger-ui .errors-wrapper hgroup { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center +} + +.swagger-ui .errors-wrapper hgroup h4 { + font-size: 20px; + margin: 0; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + font-family: Titillium Web, sans-serif; + color: #3b4151 +} + +@-webkit-keyframes scaleUp { + 0% { + -webkit-transform: scale(.8); + transform: scale(.8); + opacity: 0 + } + to { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1 + } +} + +@keyframes scaleUp { + 0% { + -webkit-transform: scale(.8); + transform: scale(.8); + opacity: 0 + } + to { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1 + } +} + +.swagger-ui .Resizer.vertical.disabled { + display: none +} + +/*# sourceMappingURL=swagger-ui.css.map*/ + +/** + * Swagger UI Theme Overrides + * + * Theme: Flattop + * Author: Mark Ostrander + * Github: https://github.com/ostranme/swagger-ui-themes + */ + +.swagger-ui .opblock.opblock-post { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-post .opblock-summary-method { + background: #049372; +} + +.swagger-ui .opblock.opblock-post .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-put { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-put .opblock-summary-method { + background: #EB9532; +} + +.swagger-ui .opblock.opblock-put .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-delete { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-delete .opblock-summary-method { + background: #C0392B; +} + +.swagger-ui .opblock.opblock-delete .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-get { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-get .opblock-summary-method { + background: #34495E; +} + +.swagger-ui .opblock.opblock-get .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-patch { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-patch .opblock-summary-method { + background: #F57C00; +} + +.swagger-ui .opblock.opblock-patch .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-head { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-head .opblock-summary-method { + background: #5C6BC0; +} + +.swagger-ui .opblock.opblock-head .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .opblock.opblock-options { + border-color: #DADFE1; + background: rgba(236, 240, 241, .1); +} + +.swagger-ui .opblock.opblock-options .opblock-summary-method { + background: #3F51B5; +} + +.swagger-ui .opblock.opblock-options .opblock-summary { + border-color: #DADFE1; +} + +.swagger-ui .topbar { + padding: 8px 30px; + background-color: #2C3E50; +} + +.swagger-ui .topbar .download-url-wrapper input[type=text] { + min-width: 350px; + margin: 0; + border: 2px solid #DADFE1; + border-radius: 4px 0 0 4px; + outline: none; +} + +.swagger-ui .topbar .download-url-wrapper .download-url-button { + font-size: 16px; + font-weight: 700; + padding: 4px 40px; + border: none; + border-radius: 0 4px 4px 0; + background: #DADFE1; + font-family: Titillium Web, sans-serif; + color: #2C3E50; +} + +.swagger-ui .info a { + font-size: 14px; + -webkit-transition: all .4s; + transition: all .4s; + font-family: Open Sans, sans-serif; + color: #336E7B; +} + +.swagger-ui .info a:hover { + color: #336E7B; +} + +.swagger-ui .btn.authorize { + line-height: 1; + display: inline; + color: #336E7B; + border-color: #336E7B; +} + +.swagger-ui .btn.authorize svg { + fill: #336E7B; +} diff --git a/SWAD.code-workspace b/SWAD.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/SWAD.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/SwapDude.Front/.editorconfig b/SwapDude.Front/.editorconfig new file mode 100644 index 0000000..59d9a3a --- /dev/null +++ b/SwapDude.Front/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/SwapDude.Front/.gitignore b/SwapDude.Front/.gitignore new file mode 100644 index 0000000..0711527 --- /dev/null +++ b/SwapDude.Front/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/SwapDude.Front/.hintrc b/SwapDude.Front/.hintrc new file mode 100644 index 0000000..e45f2df --- /dev/null +++ b/SwapDude.Front/.hintrc @@ -0,0 +1,13 @@ +{ + "extends": [ + "development" + ], + "hints": { + "axe/name-role-value": [ + "default", + { + "link-name": "off" + } + ] + } +} \ No newline at end of file diff --git a/SwapDude.Front/.vscode/extensions.json b/SwapDude.Front/.vscode/extensions.json new file mode 100644 index 0000000..77b3745 --- /dev/null +++ b/SwapDude.Front/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 + "recommendations": ["angular.ng-template"] +} diff --git a/SwapDude.Front/.vscode/launch.json b/SwapDude.Front/.vscode/launch.json new file mode 100644 index 0000000..925af83 --- /dev/null +++ b/SwapDude.Front/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "ng serve", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: start", + "url": "http://localhost:4200/" + }, + { + "name": "ng test", + "type": "chrome", + "request": "launch", + "preLaunchTask": "npm: test", + "url": "http://localhost:9876/debug.html" + } + ] +} diff --git a/SwapDude.Front/.vscode/tasks.json b/SwapDude.Front/.vscode/tasks.json new file mode 100644 index 0000000..a298b5b --- /dev/null +++ b/SwapDude.Front/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558 + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "start", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + }, + { + "type": "npm", + "script": "test", + "isBackground": true, + "problemMatcher": { + "owner": "typescript", + "pattern": "$tsc", + "background": { + "activeOnStart": true, + "beginsPattern": { + "regexp": "(.*?)" + }, + "endsPattern": { + "regexp": "bundle generation complete" + } + } + } + } + ] +} diff --git a/SwapDude.Front/README.md b/SwapDude.Front/README.md new file mode 100644 index 0000000..468fe72 --- /dev/null +++ b/SwapDude.Front/README.md @@ -0,0 +1,27 @@ +# SwapDudeFront + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.1.3. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/SwapDude.Front/angular.json b/SwapDude.Front/angular.json new file mode 100644 index 0000000..dba4414 --- /dev/null +++ b/SwapDude.Front/angular.json @@ -0,0 +1,99 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "SwapDude.Front": { + "i18n": { + "sourceLocale": "en-UK", + "locales": { "ru-RU": "src/locale/messages.ru.xlf" } + }, + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + //"localize": ["ru-RU"], + "outputPath": "dist/swap-dude.front", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], + "scripts": [], + "server": "src/main.server.ts", + "prerender": true, + "ssr": { + "entry": "server.ts" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "SwapDude.Front:build:production" + }, + "development": { + "buildTarget": "SwapDude.Front:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "SwapDude.Front:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": ["zone.js", "zone.js/testing"], + "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.scss"], + "scripts": [] + } + } + } + } + }, + "cli": { + "analytics": "be9d04c5-9ecd-4e58-a026-e4c863827ae9" + } +} diff --git a/SwapDude.Front/package-lock.json b/SwapDude.Front/package-lock.json new file mode 100644 index 0000000..1c42783 --- /dev/null +++ b/SwapDude.Front/package-lock.json @@ -0,0 +1,12343 @@ +{ + "name": "swap-dude.front", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "swap-dude.front", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "^17.1.0", + "@angular/common": "^17.1.0", + "@angular/compiler": "^17.1.0", + "@angular/core": "^17.1.0", + "@angular/forms": "^17.1.0", + "@angular/platform-browser": "^17.1.0", + "@angular/platform-browser-dynamic": "^17.1.0", + "@angular/platform-server": "^17.1.0", + "@angular/router": "^17.1.0", + "@angular/ssr": "^17.1.3", + "@ng-bootstrap/ng-bootstrap": "^16.0.0", + "@popperjs/core": "^2.11.8", + "bootstrap": "^5.3.2", + "express": "^4.18.2", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.3" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.1.3", + "@angular/cli": "^17.1.3", + "@angular/compiler-cli": "^17.1.0", + "@angular/localize": "^17.1.0", + "@types/express": "^4.17.17", + "@types/jasmine": "~5.1.0", + "@types/node": "^18.18.0", + "jasmine-core": "~5.1.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.3.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1703.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.0.tgz", + "integrity": "sha512-2X2cswI4TIwtQxCe5U9f4jeiDjAb8r89XLpU0QwEHyZyWx02uhYHO3FDMJq/NxCS95IUAQOBGBhbD4ey4Hl9cQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.0", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.0.tgz", + "integrity": "sha512-mC70mZK/liITM4VlGL6hmYPkVsZwAb+X3TxwodBl/g8p/sYijDhK/4QJHzmcHTxLYQQS6nS5CUcr9ARQFkGN2w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1703.0", + "@angular-devkit/build-webpack": "0.1703.0", + "@angular-devkit/core": "17.3.0", + "@babel/core": "7.24.0", + "@babel/generator": "7.23.6", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-transform-async-generator-functions": "7.23.9", + "@babel/plugin-transform-async-to-generator": "7.23.3", + "@babel/plugin-transform-runtime": "7.24.0", + "@babel/preset-env": "7.24.0", + "@babel/runtime": "7.24.0", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "17.3.0", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.18", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.22", + "css-loader": "6.10.0", + "esbuild-wasm": "0.20.1", + "fast-glob": "3.3.2", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.4", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.8", + "mini-css-extract-plugin": "2.8.1", + "mrmime": "2.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.1", + "piscina": "4.4.0", + "postcss": "8.4.35", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.71.1", + "sass-loader": "14.1.1", + "semver": "7.6.0", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.29.1", + "tree-kill": "1.2.2", + "tslib": "2.6.2", + "undici": "6.7.1", + "vite": "5.1.5", + "watchpack": "2.4.0", + "webpack": "5.90.3", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.10.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.20.1" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "@angular/localize": "^17.0.0", + "@angular/platform-server": "^17.0.0", + "@angular/service-worker": "^17.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^17.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.2 <5.5" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1703.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.0.tgz", + "integrity": "sha512-IEaLzV5lolURJhMKM4naW6pYTDjI5E8I+97o/kbSa0yakvGOBwg7yRmfc54T1M0Z4nmifPsj4OVRGhBaa6dgXA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.0", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.0.tgz", + "integrity": "sha512-ldErhMYq8rcFOhWQ0syQdLy6IYb/LL0erigj7gCMOf59oJgM7B13o/ZTOCvyJttUZ9IP0HB98Gi3epEuJ30VLg==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.0.tgz", + "integrity": "sha512-EW4Y8W/KTlvvT2fw3bh9hY7quDF2b9EaF+KftEqoDRWYbw0tlF8hWIdlfA6JxQC12d6uefh3kDNj5am0Il2oNQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.0", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/animations": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.0.tgz", + "integrity": "sha512-H7R3c2E479CPpaX6bU84F8u4JV+IFEfM8BUOgrbcI9tF16m6C2eJbl8IqNuW0yADuTarRSlOT7TW0qyrmcxhRw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.0" + } + }, + "node_modules/@angular/cli": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.0.tgz", + "integrity": "sha512-xwxlimNP4MECkdzjc0+m7lGxighcH0ncAfEo9yUo+r+4EFalB/Q7DAQPIU1xkbBk8iJwcFhGFAnS1IeLur15kQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1703.0", + "@angular-devkit/core": "17.3.0", + "@angular-devkit/schematics": "17.3.0", + "@schematics/angular": "17.3.0", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.2", + "inquirer": "9.2.15", + "jsonc-parser": "3.2.1", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "17.0.6", + "resolve": "1.22.8", + "semver": "7.6.0", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.0.tgz", + "integrity": "sha512-JnS6jbLl2RxsvGFUOBGeoyviNLEjZKRhn3uK4Ein3DENPv0BeSFMjif9Dp4ReUCnqoD4QQVG0X/r1GFaqHn2pw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.0.tgz", + "integrity": "sha512-lZBD5mFq7SzFJydZwW2jvnQGmtcU1s3e548hl4MSZpRgt13m5UmBQKbyMOvVN2WxKvWKlmDlywsAJlMSXepYig==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/core": "17.3.0" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.0.tgz", + "integrity": "sha512-ewo+pb0QUC69Ey15z4vPteoBeO81HitqplysOoeXbyVBjMnKmZl3343wx7ukgcI97lmj4d38d1r4AnIoO5n/Vw==", + "dependencies": { + "@babel/core": "7.23.9", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/compiler": "17.3.0", + "typescript": ">=5.2 <5.5" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/core": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.0.tgz", + "integrity": "sha512-umwsNFl/wEMTCUVvNl5iieEgHA+ESxSMcjedZGFWNGnpUxKTgYFYNG41/1wNZfPrS0+uRPHuYU9IHD+NR2s/Rw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/forms": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.0.tgz", + "integrity": "sha512-TnLOake1fQCmmGEOZbTjP2gbKerZ/bfEMuiFfoe7R2rUvKl4xHGAHp99bqf7bUyAbB8ZgmPZc9/VHrrts8UNyA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/localize": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.0.tgz", + "integrity": "sha512-f1Ilf7TtG1WoxDxazC8Wn9BP8Nx9z/sD9JWyO1ov8f7zyvtfuqVa8MVuQcggpRcgEi/4wRMGzOOANgs+CovYxw==", + "dependencies": { + "@babel/core": "7.23.9", + "@types/babel__core": "7.20.5", + "fast-glob": "3.3.2", + "yargs": "^17.2.1" + }, + "bin": { + "localize-extract": "tools/bundles/src/extract/cli.js", + "localize-migrate": "tools/bundles/src/migrate/cli.js", + "localize-translate": "tools/bundles/src/translate/cli.js" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/compiler": "17.3.0", + "@angular/compiler-cli": "17.3.0" + } + }, + "node_modules/@angular/localize/node_modules/@babel/core": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/localize/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@angular/localize/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/platform-browser": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.0.tgz", + "integrity": "sha512-sIquvbq04KMOdpk1VdVFt7kVhOk/Rk+hI3M4raarMK5EbZ16nLYzpqjc2OZetUpKy6LB/FemClgNUShj9NlrqA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/animations": "17.3.0", + "@angular/common": "17.3.0", + "@angular/core": "17.3.0" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.0.tgz", + "integrity": "sha512-oX5AG0aSjmB89SyJZGyabr6uwfWd7yJM+krcrzHxFbVhvDCwdi9G+B0ADmaUn1shaXDseOFiLpo3R/oagd2fTA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.0", + "@angular/compiler": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0" + } + }, + "node_modules/@angular/platform-server": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-17.3.0.tgz", + "integrity": "sha512-kCtAZskxn5iKSF9yw+IALA6Otv8eqGp19R0RX/Btj7hLPEUPz1/n9pUIBLOtyE5P4xWT6JCty+vaPOdloSO9RA==", + "dependencies": { + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/animations": "17.3.0", + "@angular/common": "17.3.0", + "@angular/compiler": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0" + } + }, + "node_modules/@angular/router": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.0.tgz", + "integrity": "sha512-OBMAfjaSfEdEYqfYsAemDvknYZV69ABFf06hhduNLhB5QgbPrZCbNptnlrCPx4YDrzcANj2hrcyAmAVNTk8Giw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0" + }, + "peerDependencies": { + "@angular/common": "17.3.0", + "@angular/core": "17.3.0", + "@angular/platform-browser": "17.3.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/ssr": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-17.3.0.tgz", + "integrity": "sha512-ITJwpk1drcAn08FKQGuZXYmlhILiYOJYKnh/0eFSwSGhsvl61w/BOhsFTkRGZPZ72zAbTyqakB8BVc0ZLv1hpg==", + "dependencies": { + "critters": "0.0.22", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^17.0.0", + "@angular/core": "^17.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", + "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", + "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-16.0.0.tgz", + "integrity": "sha512-+FJ3e6cX9DW2t7021Ji3oz433rk3+4jLfqzU+Jyx6/vJz1dIOaML3EAY6lYuW4TLiXgMPOMvs6KzPFALGh4Lag==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^17.0.0", + "@angular/core": "^17.0.0", + "@angular/forms": "^17.0.0", + "@angular/localize": "^17.0.0", + "@popperjs/core": "^2.11.8", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.0.tgz", + "integrity": "sha512-wNTCDPPEtjP4mxYerLVLCMwOCTEOD2HqZMVXD8pJbarrGPMuoyglUZuqNSIS5KVqR+fFez6JEUnMvC3QSqf58w==", + "dev": true, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0", + "typescript": ">=5.2 <5.5", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.1.tgz", + "integrity": "sha512-H4FrOVtNyWC8MUwL3UfjOsAihHvT1Pe8POj3JvjXhSTJipsZMtgUALCT4mGyYZNxymkUfOw3PUj6dE4QPp6osQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.4.tgz", + "integrity": "sha512-nr6/WezNzuYUppzXRaYu/W4aT5rLxdXqEFupbh6e/ovlYFQ8hpu1UUPV3Ir/YTl+74iXl2ZOMlGzudh9ZPUchQ==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.0.0.tgz", + "integrity": "sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.1.tgz", + "integrity": "sha512-P4KkF9jX3y+7yFUxgcUdDtLy+t4OlDGuEBLNs57AZsfSfg+uV6MLndqGpnl4831ggaEdXwR50XFoZP4VFtHolg==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz", + "integrity": "sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.0.tgz", + "integrity": "sha512-QqugP4Uyxk966VaUb/Jk5LQ5rE1BV4v2TmniPZtN3GZ6MDkpvPnFvlysvoq6y+7uiRhCLiT1DsBIwc9vXz3vWA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.0", + "@angular-devkit/schematics": "17.3.0", + "jsonc-parser": "3.2.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.2.0.tgz", + "integrity": "sha512-5VI58qgNs76RDrwXNhpmyN/jKpq9evV/7f1XrcqcAfvxDl5SeVY/I5Rmfe96ULAV7/FK5dge9RBKGBJPhL1WsQ==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.0.0.tgz", + "integrity": "sha512-dW2qjbWLRKGu6MIDUTBuJwXCnR8zivcSpf5inUzk7y84zqy/dji0/uahppoIgMoKeR+6pUZucrwHfkQQtiG9Rw==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.0.tgz", + "integrity": "sha512-zxiQ66JFOjVvP9hbhGj/F/qNdsZfkGb/dVXSanNRNuAzMlr4MC95voPUBX8//ZNnmv3uSYzdfR/JSkrgvZTGxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.2.3.tgz", + "integrity": "sha512-LqlA+ffyN02yC7RKszCdMTS6bldZnIodiox+IkT8B2f8oRYXCB3LQ9roXeiEL21m64CVH1wyveYAORfD65WoSw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.1.tgz", + "integrity": "sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.0", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.1.0.tgz", + "integrity": "sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.4.tgz", + "integrity": "sha512-px7OMFO/ncXxixDe1zR13V1iycqWae0MxTaw62RpFlksUi5QuNWgQJFkTQjIOvrmutJbI7Fp2Y2N1F6D2R4G6w==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.24.tgz", + "integrity": "sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/bootstrap": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", + "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.2.tgz", + "integrity": "sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001598", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001598.tgz", + "integrity": "sha512-j8mQRDziG94uoBfeFuqsJUNECW37DXpnvhcMJMdlH2u3MRkq1sAI0LJcXP1i/Py0KbSIC4UDj8YHPrTn5YsL+Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/critters": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", + "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "postcss-media-query-parser": "^0.2.3" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.708.tgz", + "integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", + "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.20.1.tgz", + "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", + "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", + "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jasmine-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", + "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", + "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", + "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/karma/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz", + "integrity": "sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", + "dev": true, + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.6.tgz", + "integrity": "sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.4.0.tgz", + "integrity": "sha512-+AQduEJefrOApE4bV7KRmp3N2JnnyErlVqq4P/jmko4FPz9Z877BCccl/iB3FdrWSUkvbGV9Kan/KllJgat3Vg==", + "dev": true, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==" + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==" + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.71.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz", + "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", + "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@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": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.2.2.tgz", + "integrity": "sha512-2A3WvXkQurhuMgORgT60r6pOWiCOO5LlEqY2ADxGBDGVYLSo5HN0uLtb68YpVpuL/Vi8mLTe7+0Dx2Fq8lLqEg==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.2.0", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.0", + "@sigstore/sign": "^2.2.3", + "@sigstore/tuf": "^2.3.1", + "@sigstore/verify": "^1.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "dev": true, + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tuf-js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.0.tgz", + "integrity": "sha512-ZSDngmP1z6zw+FIkIBjvOp/II/mIub/O7Pp12j1WNsiCpg5R5wAc//i555bBQsE44O94btLt0xM/Zr2LQjwdCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.37", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", + "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.7.1.tgz", + "integrity": "sha512-+Wtb9bAQw6HYWzCnxrPTMVEV3Q1QjYanI0E4q02ehReMuquQdLTEFEYbfs7hcImVYKcQkWSwT6buEmSVIiDDtQ==", + "dev": true, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", + "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.4.tgz", + "integrity": "sha512-NtTUvIlNELez7Q1DzKVIFZBzNb646boQMgpATo9z3Ftuu/gWvzxCW7jdjcUDoRGxRikrhVHB/zLXh1hxeJawvw==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/SwapDude.Front/package.json b/SwapDude.Front/package.json new file mode 100644 index 0000000..e51e2f6 --- /dev/null +++ b/SwapDude.Front/package.json @@ -0,0 +1,48 @@ +{ + "name": "swap-dude.front", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "serve:ssr:SwapDude.Front": "node dist/swap-dude.front/server/server.mjs" + }, + "private": true, + "dependencies": { + "@angular/animations": "^17.1.0", + "@angular/common": "^17.1.0", + "@angular/compiler": "^17.1.0", + "@angular/core": "^17.1.0", + "@angular/forms": "^17.1.0", + "@angular/platform-browser": "^17.1.0", + "@angular/platform-browser-dynamic": "^17.1.0", + "@angular/platform-server": "^17.1.0", + "@angular/router": "^17.1.0", + "@angular/ssr": "^17.1.3", + "@ng-bootstrap/ng-bootstrap": "^16.0.0", + "@popperjs/core": "^2.11.8", + "bootstrap": "^5.3.2", + "express": "^4.18.2", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.3" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.1.3", + "@angular/cli": "^17.1.3", + "@angular/compiler-cli": "^17.1.0", + "@angular/localize": "^17.1.0", + "@types/express": "^4.17.17", + "@types/jasmine": "~5.1.0", + "@types/node": "^18.18.0", + "jasmine-core": "~5.1.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.3.2" + } +} \ No newline at end of file diff --git a/SwapDude.Front/server.ts b/SwapDude.Front/server.ts new file mode 100644 index 0000000..7083b14 --- /dev/null +++ b/SwapDude.Front/server.ts @@ -0,0 +1,56 @@ +import { APP_BASE_HREF } from '@angular/common'; +import { CommonEngine } from '@angular/ssr'; +import express from 'express'; +import { fileURLToPath } from 'node:url'; +import { dirname, join, resolve } from 'node:path'; +import bootstrap from './src/main.server'; + +// The Express app is exported so that it can be used by serverless Functions. +export function app(): express.Express { + const server = express(); + const serverDistFolder = dirname(fileURLToPath(import.meta.url)); + const browserDistFolder = resolve(serverDistFolder, '../browser'); + const indexHtml = join(serverDistFolder, 'index.server.html'); + + const commonEngine = new CommonEngine(); + + server.set('view engine', 'html'); + server.set('views', browserDistFolder); + + // Example Express Rest API endpoints + // server.get('/api/**', (req, res) => { }); + // Serve static files from /browser + server.get('*.*', express.static(browserDistFolder, { + maxAge: '1y' + })); + + // All regular routes use the Angular engine + server.get('*', (req, res, next) => { + const { protocol, originalUrl, baseUrl, headers } = req; + + commonEngine + .render({ + bootstrap, + documentFilePath: indexHtml, + url: `${protocol}://${headers.host}${originalUrl}`, + publicPath: browserDistFolder, + providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }], + }) + .then((html) => res.send(html)) + .catch((err) => next(err)); + }); + + return server; +} + +function run(): void { + const port = process.env['PORT'] || 4000; + + // Start up the Node server + const server = app(); + server.listen(port, () => { + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +run(); diff --git a/SwapDude.Front/src/app/app.component.html b/SwapDude.Front/src/app/app.component.html new file mode 100644 index 0000000..2619460 --- /dev/null +++ b/SwapDude.Front/src/app/app.component.html @@ -0,0 +1,2 @@ + + diff --git a/SwapDude.Front/src/app/app.component.scss b/SwapDude.Front/src/app/app.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/SwapDude.Front/src/app/app.component.spec.ts b/SwapDude.Front/src/app/app.component.spec.ts new file mode 100644 index 0000000..cfaf5c8 --- /dev/null +++ b/SwapDude.Front/src/app/app.component.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have the 'SwapDude.Front' title`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('SwapDude.Front'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, SwapDude.Front'); + }); +}); diff --git a/SwapDude.Front/src/app/app.component.ts b/SwapDude.Front/src/app/app.component.ts new file mode 100644 index 0000000..c30fa76 --- /dev/null +++ b/SwapDude.Front/src/app/app.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { HomeComponent } from "./pages/home/home.component"; + +@Component({ + selector: 'app-root', + standalone: true, + templateUrl: './app.component.html', + styleUrl: './app.component.scss', + imports: [RouterOutlet, HomeComponent] +}) +export class AppComponent { + title = 'SwapDude.Front'; +} diff --git a/SwapDude.Front/src/app/app.config.server.ts b/SwapDude.Front/src/app/app.config.server.ts new file mode 100644 index 0000000..b4d57c9 --- /dev/null +++ b/SwapDude.Front/src/app/app.config.server.ts @@ -0,0 +1,11 @@ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering } from '@angular/platform-server'; +import { appConfig } from './app.config'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering() + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/SwapDude.Front/src/app/app.config.ts b/SwapDude.Front/src/app/app.config.ts new file mode 100644 index 0000000..e5a3cf1 --- /dev/null +++ b/SwapDude.Front/src/app/app.config.ts @@ -0,0 +1,9 @@ +import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { routes } from './app.routes'; +import { provideClientHydration } from '@angular/platform-browser'; + +export const appConfig: ApplicationConfig = { + providers: [provideRouter(routes), provideClientHydration()] +}; diff --git a/SwapDude.Front/src/app/app.routes.ts b/SwapDude.Front/src/app/app.routes.ts new file mode 100644 index 0000000..dc39edb --- /dev/null +++ b/SwapDude.Front/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Routes } from '@angular/router'; + +export const routes: Routes = []; diff --git a/SwapDude.Front/src/app/pages/home/home.component.html b/SwapDude.Front/src/app/pages/home/home.component.html new file mode 100644 index 0000000..534005e --- /dev/null +++ b/SwapDude.Front/src/app/pages/home/home.component.html @@ -0,0 +1,4 @@ +
+

SwapDude.pro

+

Get links for your friends now so easy!

+
diff --git a/SwapDude.Front/src/app/pages/home/home.component.scss b/SwapDude.Front/src/app/pages/home/home.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/SwapDude.Front/src/app/pages/home/home.component.spec.ts b/SwapDude.Front/src/app/pages/home/home.component.spec.ts new file mode 100644 index 0000000..60c47c4 --- /dev/null +++ b/SwapDude.Front/src/app/pages/home/home.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HomeComponent } from './home.component'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/SwapDude.Front/src/app/pages/home/home.component.ts b/SwapDude.Front/src/app/pages/home/home.component.ts new file mode 100644 index 0000000..c759399 --- /dev/null +++ b/SwapDude.Front/src/app/pages/home/home.component.ts @@ -0,0 +1,18 @@ +import { DOCUMENT } from '@angular/common'; +import { Component, Inject } from '@angular/core'; + +@Component({ + selector: 'app-home', + standalone: true, + imports: [], + templateUrl: './home.component.html', + styleUrl: './home.component.scss' +}) +export class HomeComponent { + domain: string + title = "SwapDude.pro - Home" + constructor(@Inject(DOCUMENT) private document: Document) { } + ngOnInit(){ + this.domain = this.document.location.hostname; + } +} diff --git a/SwapDude.Front/src/assets/.gitkeep b/SwapDude.Front/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/SwapDude.Front/src/favicon.ico b/SwapDude.Front/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 GIT binary patch literal 15086 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 Nr__JTFzvMr^FKp4S3v*( literal 0 HcmV?d00001 diff --git a/SwapDude.Front/src/index.html b/SwapDude.Front/src/index.html new file mode 100644 index 0000000..6c3e782 --- /dev/null +++ b/SwapDude.Front/src/index.html @@ -0,0 +1,13 @@ + + + + + SwapDudeFront + + + + + + + + diff --git a/SwapDude.Front/src/locale/messages.ru.xlf b/SwapDude.Front/src/locale/messages.ru.xlf new file mode 100644 index 0000000..3634bac --- /dev/null +++ b/SwapDude.Front/src/locale/messages.ru.xlf @@ -0,0 +1,14 @@ + + + + + + Делится ссылками на музыку с друзьями теперь ТАК просто! + + src/app/pages/home/home.component.html + 3,4 + + + + + diff --git a/SwapDude.Front/src/locale/messages.xlf b/SwapDude.Front/src/locale/messages.xlf new file mode 100644 index 0000000..6823211 --- /dev/null +++ b/SwapDude.Front/src/locale/messages.xlf @@ -0,0 +1,14 @@ + + + + + + Get links for your friends now easy! + + src/app/pages/home/home.component.html + 3,4 + + + + + diff --git a/SwapDude.Front/src/main.server.ts b/SwapDude.Front/src/main.server.ts new file mode 100644 index 0000000..4b9d4d1 --- /dev/null +++ b/SwapDude.Front/src/main.server.ts @@ -0,0 +1,7 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; +import { config } from './app/app.config.server'; + +const bootstrap = () => bootstrapApplication(AppComponent, config); + +export default bootstrap; diff --git a/SwapDude.Front/src/main.ts b/SwapDude.Front/src/main.ts new file mode 100644 index 0000000..ee35435 --- /dev/null +++ b/SwapDude.Front/src/main.ts @@ -0,0 +1,8 @@ +/// + +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); diff --git a/SwapDude.Front/src/styles.scss b/SwapDude.Front/src/styles.scss new file mode 100644 index 0000000..13ea46a --- /dev/null +++ b/SwapDude.Front/src/styles.scss @@ -0,0 +1,4 @@ +/* You can add global styles to this file, and also import other style files */ + +/* Importing Bootstrap SCSS file. */ +@import 'bootstrap/scss/bootstrap'; diff --git a/SwapDude.Front/tsconfig.app.json b/SwapDude.Front/tsconfig.app.json new file mode 100644 index 0000000..3544763 --- /dev/null +++ b/SwapDude.Front/tsconfig.app.json @@ -0,0 +1,19 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "node", + "@angular/localize" + ] + }, + "files": [ + "src/main.ts", + "src/main.server.ts", + "server.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/SwapDude.Front/tsconfig.json b/SwapDude.Front/tsconfig.json new file mode 100644 index 0000000..21236a4 --- /dev/null +++ b/SwapDude.Front/tsconfig.json @@ -0,0 +1,34 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "esModuleInterop": true, + "sourceMap": true, + "declaration": false, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "strictPropertyInitialization": false, + "lib": [ + "ES2022", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/SwapDude.Front/tsconfig.spec.json b/SwapDude.Front/tsconfig.spec.json new file mode 100644 index 0000000..c63b698 --- /dev/null +++ b/SwapDude.Front/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "@angular/localize" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/TelegramBot/.gitignore b/TelegramBot/.gitignore new file mode 100644 index 0000000..f58253e --- /dev/null +++ b/TelegramBot/.gitignore @@ -0,0 +1,366 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# DocFx +/.vscode/ +log/ +obj/ +_site/ +.optemp/ +_themes/ +_themes.MSDN.Modern/ +_themes.VS.Modern/ + +.openpublishing.buildcore.ps1 +.openpublishing.redirection.sorted.json + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Folder configuration on Mac +.DS_Store + +# Custom added by ghogen +settings.json +telegramconfig.local.json \ No newline at end of file diff --git a/TelegramBot/BotHandler.cs b/TelegramBot/BotHandler.cs new file mode 100644 index 0000000..bbf4695 --- /dev/null +++ b/TelegramBot/BotHandler.cs @@ -0,0 +1,61 @@ +using Telegram.Bot; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; +using TelegramBot.Commands; +using TelegramBot.Commands.CommandMessages; + +namespace TelegramBot; + +public static class BotHandler +{ + private static readonly LinkMessage LinkMessageProvider = new(); + private static readonly StartCommandMessage StartCommandMessageProvider = new(); + private static readonly ChangelogCommandMessage ChangelogCommandMessageProvider = new(); + private static readonly ErrorMessage ErrorMessageProvider = new(); + public static async Task HandleUpdateAsync( + ITelegramBotClient botClient, + Update update, + CancellationToken cancellationToken + ) + { + switch (update.Type) + { + case UpdateType.Message: + switch (update.Message?.Text) + { + case StartCommandMessage.CommandName: + await StartCommandMessageProvider.InvokeFromMessage(botClient, update, cancellationToken); + break; + case ChangelogCommandMessage.CommandName: + await ChangelogCommandMessageProvider.InvokeFromMessage(botClient, update, cancellationToken); + break; + default: + Console.WriteLine(update.Message?.Text); + if (string.IsNullOrEmpty(update.Message?.Text)) + { + await ErrorMessageProvider.InvokeFromMessage(botClient, update, cancellationToken); + break; + } + await LinkMessageProvider.InvokeFromMessage(botClient, update, cancellationToken); + break; + } + break; + case UpdateType.InlineQuery: + await LinkMessageProvider.InvokeFromInlineQuery(botClient, update, cancellationToken); + break; + } + } + + public static Task HandleErrorAsync( + ITelegramBotClient botClient, + Exception exception, + CancellationToken cancellationToken + ) + { + + Console.WriteLine("Ошибка ядра:\n--------------------------"); + Console.WriteLine(exception); + return Task.CompletedTask; + // throw exception; + } +} \ No newline at end of file diff --git a/TelegramBot/Commands/CommandMessages/ChangelogCommandMessage.cs b/TelegramBot/Commands/CommandMessages/ChangelogCommandMessage.cs new file mode 100644 index 0000000..dd535d7 --- /dev/null +++ b/TelegramBot/Commands/CommandMessages/ChangelogCommandMessage.cs @@ -0,0 +1,20 @@ +using System.Text; +using Telegram.Bot; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; + +namespace TelegramBot.Commands.CommandMessages; + +public class ChangelogCommandMessage : CommandMessage +{ + public const string CommandName = "/changelog"; + public override async Task InvokeFromMessage(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) + { + var text = new StringBuilder(); + foreach (var log in Program.Config.Changelog) + { + text.Append($"Нововведения от {log.Date}:\n\n{log.Caption}\n\n"); + } + await botClient.SendTextMessageAsync(update.Message?.Chat!, text.ToString(), cancellationToken: cancellationToken, parseMode: ParseMode.Html); + } +} \ No newline at end of file diff --git a/TelegramBot/Commands/CommandMessages/CommandMessage.cs b/TelegramBot/Commands/CommandMessages/CommandMessage.cs new file mode 100644 index 0000000..8520441 --- /dev/null +++ b/TelegramBot/Commands/CommandMessages/CommandMessage.cs @@ -0,0 +1,12 @@ +using System.Diagnostics; +using System.Reflection; +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace TelegramBot.Commands.CommandMessages; + +public abstract class CommandMessage : IMessage +{ + public abstract Task InvokeFromMessage(ITelegramBotClient botClient, Update update, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/TelegramBot/Commands/CommandMessages/StartCommandMessage.cs b/TelegramBot/Commands/CommandMessages/StartCommandMessage.cs new file mode 100644 index 0000000..cb7bbd4 --- /dev/null +++ b/TelegramBot/Commands/CommandMessages/StartCommandMessage.cs @@ -0,0 +1,20 @@ +using System.Diagnostics; +using System.Reflection; +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace TelegramBot.Commands.CommandMessages; + +public class StartCommandMessage : CommandMessage +{ + public const string CommandName = "/start"; + public override async Task InvokeFromMessage(ITelegramBotClient botClient, + Update update, + CancellationToken cancellationToken) + { + var text = Program.Config.StartMessage; + text += $"\nBuild assembly version: {FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion}"; + text += $"\n\nНововведения по комманде /changelog"; + await botClient.SendTextMessageAsync(update.Message?.Chat!, text, cancellationToken: cancellationToken); + } +} \ No newline at end of file diff --git a/TelegramBot/Commands/ErrorMessage.cs b/TelegramBot/Commands/ErrorMessage.cs new file mode 100644 index 0000000..82d9569 --- /dev/null +++ b/TelegramBot/Commands/ErrorMessage.cs @@ -0,0 +1,12 @@ +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace TelegramBot.Commands; + +public class ErrorMessage : IMessage +{ + public async Task InvokeFromMessage(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) + { + await botClient.SendTextMessageAsync(update.Message?.Chat!, "Ошибка! Команда не найдена", cancellationToken: cancellationToken); + } +} \ No newline at end of file diff --git a/TelegramBot/Commands/IMessage.cs b/TelegramBot/Commands/IMessage.cs new file mode 100644 index 0000000..6348468 --- /dev/null +++ b/TelegramBot/Commands/IMessage.cs @@ -0,0 +1,11 @@ +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace TelegramBot.Commands; + +public interface IMessage +{ + public Task InvokeFromMessage(ITelegramBotClient botClient, + Update update, + CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/TelegramBot/Commands/LinkMessage.cs b/TelegramBot/Commands/LinkMessage.cs new file mode 100644 index 0000000..c607820 --- /dev/null +++ b/TelegramBot/Commands/LinkMessage.cs @@ -0,0 +1,98 @@ +using System.Net.Http.Json; +using System.Text; +using Telegram.Bot; +using Telegram.Bot.Types; +using Telegram.Bot.Types.InlineQueryResults; +using TelegramBot.DTOs; + +namespace TelegramBot.Commands; + +public class LinkMessage : IMessage +{ + /// + /// Create message from API + /// + /// + /// + /// + /// + async Task<(string? message, string? preview)> GetMessage(ITelegramBotClient botClient, string inputUrl, + CancellationToken cancellationToken) + { + try + { + using var client = new HttpClient(); + var res = await client.GetAsync($"{Program.Config.ApiPath}/link/getService?link=" + inputUrl, + cancellationToken); + var typeRes = await res.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); + if (!res.IsSuccessStatusCode) + { + return (string.Empty, $"Произошла ошибка при обработке запроса\n{res.StatusCode.ToString()}"); + } + + var message = new StringBuilder(); + var preview = new StringBuilder(); + foreach (var service in typeRes?.service.Another()!) + { + res = await client.PostAsJsonAsync($"{Program.Config.ApiPath}/link/fromLink", new + { + link = inputUrl, + service, + }, cancellationToken: cancellationToken); + if (!res.IsSuccessStatusCode) + { + preview.AppendLine($"❌ {service}\n"); + message.AppendLine( + $"❌ {service}: 🤨👨🏿‍🦰😡😮‍💨😰 {(await res.Content.ReadFromJsonAsync(cancellationToken: cancellationToken))?.title}"); + message.AppendLine(); + continue; + } + + var apiRes = await res.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); + preview.AppendLine($"✅ {service}\n"); + message.AppendLine($"✅ {service} - {apiRes?.link}"); + message.AppendLine(); + } + + return (message.ToString(), preview.ToString()); + } + catch (Exception e) + { + Console.WriteLine("Ошибка:\n--------------------------"); + Console.WriteLine(e); + return (e.ToString(), "Произошла ошибка при обработке запроса\nдетали в сообщении"); + } + } + + public async Task InvokeFromMessage(ITelegramBotClient botClient, Update update, + CancellationToken cancellationToken) + { + var result = (await GetMessage(botClient, update.Message?.Text!, cancellationToken)).message; + await botClient.SendTextMessageAsync(update.Message?.Chat!, string.IsNullOrEmpty(result) ? "Ошибка🤔:\nНе удалось определить сервис исходной ссылки.\nДоступные сервисы для конвертации:\nTidal\nYandex\nSpotify" : result, cancellationToken: cancellationToken); + } + + + public async Task InvokeFromInlineQuery(ITelegramBotClient botClient, Update update, + CancellationToken cancellationToken) + { + if(string.IsNullOrEmpty(update.InlineQuery!.Query)) + return; + + var message = await new LinkMessage().GetMessage(botClient, update.InlineQuery!.Query, cancellationToken); + if(message.message != null) + try + { + await botClient.AnswerInlineQueryAsync(update.InlineQuery.Id, + new[] + { + new InlineQueryResultArticle("0", message.preview!, + new InputTextMessageContent(message.message)) + }, cancellationToken: cancellationToken); + } + catch (Exception e) + { + Console.WriteLine($"Failed to send answer to {update.Message?.Chat.Username}"); + } + + } +} \ No newline at end of file diff --git a/TelegramBot/Config/AppSettings.cs b/TelegramBot/Config/AppSettings.cs new file mode 100644 index 0000000..2e90205 --- /dev/null +++ b/TelegramBot/Config/AppSettings.cs @@ -0,0 +1,15 @@ +namespace TelegramBot.Config; + +public class AppSettings +{ + public string? Token { get; init; } + public string? ApiPath { get; init; } + public string? StartMessage { get; init; } + public List Changelog { get; init; } = null!; +} + +public class Changelog +{ + public string? Date { get; init; } + public string? Caption { get; init; } +} \ No newline at end of file diff --git a/TelegramBot/DTOs/GetLink.cs b/TelegramBot/DTOs/GetLink.cs new file mode 100644 index 0000000..7ceba5e --- /dev/null +++ b/TelegramBot/DTOs/GetLink.cs @@ -0,0 +1,15 @@ +using SWAD.API.Consts.Enums; + +namespace TelegramBot.DTOs; + +public record GetLink( + MusicService service +); + +public record LinkDto( + string? link +); + +public record ErrorDto( + string title +); \ No newline at end of file diff --git a/TelegramBot/Dockerfile b/TelegramBot/Dockerfile new file mode 100644 index 0000000..29e8cf2 --- /dev/null +++ b/TelegramBot/Dockerfile @@ -0,0 +1,15 @@ +# https://hub.docker.com/_/microsoft-dotnet +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY ./ ./ +RUN dotnet restore +WORKDIR /source/TelegramBot +RUN dotnet publish -c release -o /app --no-restore + +# final stage/image +FROM mcr.microsoft.com/dotnet/aspnet:8.0 +WORKDIR /app +COPY --from=build /app ./ +ENTRYPOINT ["dotnet", "/app/TelegramBot.dll"] \ No newline at end of file diff --git a/TelegramBot/EnumExtensions.cs b/TelegramBot/EnumExtensions.cs new file mode 100644 index 0000000..7648d1d --- /dev/null +++ b/TelegramBot/EnumExtensions.cs @@ -0,0 +1,13 @@ +using SWAD.API.Consts.Enums; + +namespace TelegramBot; + +public static class EnumExtensions +{ + public static List Another(this MusicService service) + { + var list = Enum.GetValues().ToList(); + list.Remove(service); + return list; + } +} \ No newline at end of file diff --git a/TelegramBot/Program.cs b/TelegramBot/Program.cs new file mode 100644 index 0000000..6950bad --- /dev/null +++ b/TelegramBot/Program.cs @@ -0,0 +1,71 @@ +using System.Diagnostics; +using System.Reflection; +using Microsoft.Extensions.Logging; +using Telegram.Bot; +using Telegram.Bot.Polling; +using Microsoft.Extensions.Configuration; +using TelegramBot.Config; + +namespace TelegramBot; + +public static class Program +{ + private static ILogger Logger { get; } = LoggerFactory.Create(x => { x.AddConsole(); }) + .CreateLogger("MainThread"); + + private static ITelegramBotClient bot { get; set; } + + public static AppSettings Config { get; private set; } + + public static void Main() + { + Splash(Logger); + LoadConfig(); + var cts = LoadBot(); + while(!cts.IsCancellationRequested) + Thread.Sleep(1000); + } + + private static void Splash(ILogger logger) + { + var splash = """ + ____ ____ _ ____ _ + / ___|_ ____ _ _ __ | _ \ _ _ __| | ___ | __ ) ___ | |_ + \___ \ \ /\ / / _` | '_ \| | | | | | |/ _` |/ _ \ | _ \ / _ \| __| + ___) \ V V / (_| | |_) | |_| | |_| | (_| | __/_| |_) | (_) | |_ + |____/ \_/\_/ \__,_| .__/|____/ \__,_|\__,_|\___(_)____/ \___/ \__| + |_| + """; + logger.LogWarning(splash); + logger.LogInformation( + $"Build assembly version: {FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion}"); + } + + private static void LoadConfig() + { + Logger.LogInformation("Loading config..."); + IConfigurationRoot configuration = new ConfigurationBuilder() + .AddJsonFile("telegramconfig.json", optional: false) + #if DEBUG + .AddJsonFile("telegramconfig.local.json", true, true) + #endif + .Build(); + Config = configuration.GetSection("AppSettings").Get() ?? throw new NullReferenceException(); + } + + private static CancellationTokenSource LoadBot() + { + Logger.LogInformation("Creating bot..."); + + bot = new TelegramBotClient(Config.Token ?? throw new NullReferenceException()); + var cts = new CancellationTokenSource(); + var receiverOptions = new ReceiverOptions + { + AllowedUpdates = { } + }; + bot.StartReceiving(BotHandler.HandleUpdateAsync, + BotHandler.HandleErrorAsync, receiverOptions, cts.Token); + + return cts; + } +} \ No newline at end of file diff --git a/TelegramBot/TelegramBot.csproj b/TelegramBot/TelegramBot.csproj new file mode 100644 index 0000000..f9641f5 --- /dev/null +++ b/TelegramBot/TelegramBot.csproj @@ -0,0 +1,47 @@ + + + + Exe + net8.0 + enable + enable + 0.1.$([System.DateTime]::UtcNow.ToString(MMdd)).$([System.DateTime]::Now.ToString(HHmm)) + 0.0.0.1 + $(VersionSuffix) + 0.0.1.0 + $(VersionSuffix) + SpectruMTeamCode + Lisoveliy, Sluppy(Gl3b4ty) + Copyright © $(Company) $([System.DateTime]::UtcNow.ToString(yyyy)) + SWAD Platform + Platform for sharing music links from one music service to another for free! (REST API Back-end) + + + + + + + + + + + + + + + + + + Always + + + Always + + + + Always + + + + + diff --git a/TelegramBot/telegramconfig.json b/TelegramBot/telegramconfig.json new file mode 100644 index 0000000..ef467be --- /dev/null +++ b/TelegramBot/telegramconfig.json @@ -0,0 +1,16 @@ +{ + "AppSettings": { + "Token": "INSERT TOKEN HERE", + "ApiPath": "http://api:8080", + "StartMessage": "Привет. Я бот https://swapdude.pro! Я помогу отправить твоим друзьям ссылку на песню с других сервисов! Просто пришли ссылку (Spotify, Yandex, Tidal) и я сконвертирую её в 2 других сервиса.\n(BETA)", + "Changelog": [ + { + "Date": "08.05.2024", + "Caption": "Напиши в любом чате @swapdudebot и вставь ссылку прямо в сообщение а после нажми на кнопку над сообщением. Это избавит тебя от необходимости заходить в бот каждый раз когда тебе нужно будет скинуть трек своим друзьям!" + }, + { + "Date": "22.08.2024", + "Caption": "-Улучшена стабильность бота\n-Добавлено отображение статуса поиска трека в разных сервисах при однострочном(inline запросе)" + }] + } +} diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..3604c8f --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,31 @@ +services: +# nginx: +# image: nginx +# volumes: +# - ./docker/images/nginx/conf.d/:/etc/nginx/conf.d +# - ./docker/images/nginx/static/:/var/www/ +# - ./docker/images/nginx/devareapass:/var/passwords +# ports: +# - "80:80" +# depends_on: +# - portainer +# - api +# just fucking give me to run this + portainer: + image: portainer/portainer-ce:latest + volumes: + - data:/data + - /var/run/docker.sock:/var/run/docker.sock + api: + build: + context: ./ + dockerfile: ./SWAD.API/Dockerfile + bot: + build: + context: ./ + dockerfile: ./TelegramBot/Dockerfile + redis: + image: redis + +volumes: + data: diff --git a/docker/images/nginx/conf.d/default.conf b/docker/images/nginx/conf.d/default.conf new file mode 100644 index 0000000..c2ce05b --- /dev/null +++ b/docker/images/nginx/conf.d/default.conf @@ -0,0 +1,19 @@ +server { + listen 80; + root /var/www; + + location / { + try_files $uri /index.html; + } +} + +server { + server_name api.*; + location / { + + proxy_pass http://api:8080/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + } +} diff --git a/docker/images/nginx/devareapass b/docker/images/nginx/devareapass new file mode 100644 index 0000000..3af955a --- /dev/null +++ b/docker/images/nginx/devareapass @@ -0,0 +1 @@ +swapdude:$apr1$TSYWWoky$5y0/gCzhlQxKo.0JhKUrn1 \ No newline at end of file diff --git a/docker/images/nginx/static/index.html b/docker/images/nginx/static/index.html new file mode 100644 index 0000000..0ffa94e --- /dev/null +++ b/docker/images/nginx/static/index.html @@ -0,0 +1,110 @@ + + + + + SwapDude - Обмен музыкой с другими сервисами + + + + + + + + + + + + + + +
+
+
+

SWAPDUDE.PRO

+

Обмен музыкой с другими сервисами

+
+
+
+
+
+

Что это?

+
+
+
+

Сервис SwapDude это программа по конвертации ссылок из одного музыкального сервиса в другой.

+

Доступные сервисы (на данный момент):

+
    +
  • Spotify
  • +
  • Yandex.Music
  • +
  • Tidal
  • +
+
+
+
+
+
+

Контакты

+
+
+
+

Есть вопросы? Нашли баг? Напишите: spectruminesup@gmail.com

+

GitHub: https://github.com/SpectruMProjects

+
+
+
+ + + \ No newline at end of file diff --git a/docker/images/nginx/static/logo.png b/docker/images/nginx/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7275337e649dbc586cfd0772337883da2bd756df GIT binary patch literal 99458 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]}`gtvh1pGukprW4C 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 literal 0 HcmV?d00001 diff --git a/docker/images/nginx/static/style.css b/docker/images/nginx/static/style.css new file mode 100644 index 0000000..35f160e --- /dev/null +++ b/docker/images/nginx/static/style.css @@ -0,0 +1,10 @@ +.outer-fullflex { + width: 100%; + height: 80dvh; + display: flex; + justify-content: center; +} + +.inner-fullflex { + margin: auto; +} \ No newline at end of file