From 83bb7f678b18827a0ddc82d10c82f17d47ebc670 Mon Sep 17 00:00:00 2001
From: Merlin <4706504+MerlinScheurer@users.noreply.github.com>
Date: Sat, 10 Aug 2024 19:53:50 +0200
Subject: [PATCH] DRAFT: Add Tubearchivist Frontend React dev docker setup
(#768)
* Add development docker-compose file
* Add /new/ path in nginx conf
* Add frontend production setup
* Fix lint
* Refac move prod docker compose into non suffixed file
* Fix run.sh fileendings on windows
* Fix docker file naming consistancies
* Add frontend dev setup
* Add docker compose dev command
* Refac remove docker network
* Fix potential error causes
* Chore update react-router-dom
* Add redirect to login after logout
* Refac allow basic auth for session login in api
* Fix loginresponsetype optional property
* Refac move isAdmin check into page Base
* Refac use node lts for dev container
* Refac remove old setup in readme
* Refac move getisAdmin into loader and rename
* Refac remove manual csrf cookie handing from actions and loader
* Fix post requiring csrf header & cookie
* Fix remove empty files
* Refac revert dockerfile changes
* Refac revert gitatrributes changes
* Refac revert docker changes
* Refac revert nginx changes
* Refac revert docker change
* Refac move frontend into frontend folder
* Add production steps to dockerfile
* Refac implement endpoint renaming
* Refac remove frontend dockerfile
* Add credentials include for dev env
* Fix allow cors with credentials for dev environment
* Fix images in dev mode
* Add credentials for dev mode to all loader and actions, except signin
* Revert cors config
* Revert cors config
* Fix nginx not serving /youtube/
* Fix video url missing api
* Fix media url missing api
* Add application settings page
* Add continue vids
* Add csrf to delete requests
* Refac use api/video endpoint with filter to home, channel, playlist pages
* Add channel nav request
* Add channel playlists
* Fix filterbar for playlist in channel
* Add playlist_nav to video page
* Add downloads aggs
* Refac remove basic auth
* Fix credentials include in signin
* Refac user config to user me config
* Add ApiToken get
---
Dockerfile | 13 +
docker_assets/nginx.conf | 18 +-
frontend/.eslintrc.cjs | 16 +
frontend/.gitignore | 24 +
frontend/.prettierignore | 5 +
frontend/.prettierrc | 5 +
frontend/README.md | 17 +
frontend/index.html | 26 +
frontend/package-lock.json | 2961 +++++++++++++++++
frontend/package.json | 35 +
.../public/favicon/android-chrome-192x192.png | Bin 0 -> 2351 bytes
.../public/favicon/android-chrome-512x512.png | Bin 0 -> 8602 bytes
.../apple-touch-icon-114x114-precomposed.png | Bin 0 -> 1720 bytes
.../favicon/apple-touch-icon-114x114.png | Bin 0 -> 1376 bytes
.../apple-touch-icon-120x120-precomposed.png | Bin 0 -> 1753 bytes
.../favicon/apple-touch-icon-120x120.png | Bin 0 -> 1425 bytes
.../apple-touch-icon-144x144-precomposed.png | Bin 0 -> 2149 bytes
.../favicon/apple-touch-icon-144x144.png | Bin 0 -> 1677 bytes
.../apple-touch-icon-152x152-precomposed.png | Bin 0 -> 2183 bytes
.../favicon/apple-touch-icon-152x152.png | Bin 0 -> 1685 bytes
.../apple-touch-icon-180x180-precomposed.png | Bin 0 -> 2822 bytes
.../favicon/apple-touch-icon-180x180.png | Bin 0 -> 2212 bytes
.../apple-touch-icon-57x57-precomposed.png | Bin 0 -> 920 bytes
.../public/favicon/apple-touch-icon-57x57.png | Bin 0 -> 747 bytes
.../apple-touch-icon-60x60-precomposed.png | Bin 0 -> 1012 bytes
.../public/favicon/apple-touch-icon-60x60.png | Bin 0 -> 830 bytes
.../apple-touch-icon-72x72-precomposed.png | Bin 0 -> 1095 bytes
.../public/favicon/apple-touch-icon-72x72.png | Bin 0 -> 891 bytes
.../apple-touch-icon-76x76-precomposed.png | Bin 0 -> 1180 bytes
.../public/favicon/apple-touch-icon-76x76.png | Bin 0 -> 959 bytes
.../favicon/apple-touch-icon-precomposed.png | Bin 0 -> 2822 bytes
frontend/public/favicon/apple-touch-icon.png | Bin 0 -> 2212 bytes
frontend/public/favicon/browserconfig.xml | 9 +
frontend/public/favicon/favicon-16x16.png | Bin 0 -> 1373 bytes
frontend/public/favicon/favicon-32x32.png | Bin 0 -> 2783 bytes
frontend/public/favicon/favicon.ico | Bin 0 -> 15086 bytes
frontend/public/favicon/mstile-150x150.png | Bin 0 -> 2094 bytes
frontend/public/favicon/safari-pinned-tab.svg | 100 +
frontend/public/favicon/site.webmanifest | 19 +
frontend/public/font/OFL_License.txt | 94 +
frontend/public/font/Sen-Bold.woff | Bin 0 -> 29084 bytes
frontend/public/font/Sen-Regular.woff | Bin 0 -> 28936 bytes
.../public/img/banner-tube-archivist-dark.png | Bin 0 -> 52255 bytes
.../img/banner-tube-archivist-light.png | Bin 0 -> 55468 bytes
frontend/public/img/default-channel-art.jpg | Bin 0 -> 111234 bytes
.../public/img/default-channel-banner.jpg | Bin 0 -> 62519 bytes
frontend/public/img/default-channel-icon.jpg | Bin 0 -> 86218 bytes
.../public/img/default-playlist-thumb.jpg | Bin 0 -> 24479 bytes
frontend/public/img/default-video-thumb.jpg | Bin 0 -> 56886 bytes
frontend/public/img/icon-add.svg | 13 +
frontend/public/img/icon-arrow-bottom.svg | 14 +
frontend/public/img/icon-arrow-down.svg | 6 +
frontend/public/img/icon-arrow-top.svg | 7 +
frontend/public/img/icon-arrow-up.svg | 6 +
frontend/public/img/icon-close.svg | 10 +
frontend/public/img/icon-dot-menu.svg | 4 +
frontend/public/img/icon-download.svg | 14 +
frontend/public/img/icon-exit.svg | 19 +
frontend/public/img/icon-eye.svg | 15 +
frontend/public/img/icon-gear.svg | 63 +
frontend/public/img/icon-gridview.svg | 122 +
frontend/public/img/icon-heart.svg | 8 +
frontend/public/img/icon-listview.svg | 122 +
frontend/public/img/icon-play.svg | 13 +
frontend/public/img/icon-remove.svg | 4 +
frontend/public/img/icon-rescan.svg | 23 +
frontend/public/img/icon-search.svg | 15 +
frontend/public/img/icon-seen.svg | 63 +
frontend/public/img/icon-sort.svg | 21 +
frontend/public/img/icon-star-empty.svg | 25 +
frontend/public/img/icon-star-full.svg | 19 +
frontend/public/img/icon-star-half.svg | 22 +
frontend/public/img/icon-stop.svg | 67 +
frontend/public/img/icon-substract.svg | 12 +
frontend/public/img/icon-thumb.svg | 21 +
frontend/public/img/icon-unseen.svg | 65 +
.../public/img/logo-tube-archivist-dark.png | Bin 0 -> 217590 bytes
.../public/img/logo-tube-archivist-light.png | Bin 0 -> 223471 bytes
.../src/api/actions/createCustomPlaylist.ts | 30 +
frontend/src/api/actions/deleteApiToken.ts | 28 +
frontend/src/api/actions/deleteChannel.ts | 29 +
.../src/api/actions/deleteDownloadById.ts | 29 +
.../actions/deleteDownloadQueueByFilter.ts | 37 +
frontend/src/api/actions/deletePlaylist.ts | 34 +
frontend/src/api/actions/deleteVideo.ts | 29 +
.../api/actions/deleteVideoProgressById.ts | 29 +
frontend/src/api/actions/queueBackup.ts | 29 +
frontend/src/api/actions/queueReindex.ts | 48 +
frontend/src/api/actions/queueSnapshot.ts | 29 +
frontend/src/api/actions/restoreBackup.ts | 29 +
frontend/src/api/actions/restoreSnapshot.ts | 29 +
frontend/src/api/actions/signIn.ts | 39 +
frontend/src/api/actions/stopTaskByName.ts | 27 +
.../api/actions/updateAppsettingsConfig.ts | 27 +
.../api/actions/updateChannelSubscription.ts | 29 +
frontend/src/api/actions/updateCookie.ts | 32 +
.../src/api/actions/updateCustomPlaylist.ts | 33 +
.../src/api/actions/updateDownloadQueue.ts | 34 +
.../actions/updateDownloadQueueStatusById.ts | 31 +
.../api/actions/updatePlaylistSubscription.ts | 29 +
frontend/src/api/actions/updateTaskByName.ts | 32 +
frontend/src/api/actions/updateUserConfig.ts | 56 +
.../api/actions/updateVideoProgressById.ts | 34 +
.../src/api/actions/updateWatchedState.ts | 37 +
frontend/src/api/loader/loadApiToken.ts | 32 +
.../src/api/loader/loadAppsettingsConfig.ts | 54 +
frontend/src/api/loader/loadAuth.ts | 21 +
frontend/src/api/loader/loadBackupList.ts | 23 +
frontend/src/api/loader/loadChannelById.ts | 23 +
frontend/src/api/loader/loadChannelList.ts | 33 +
frontend/src/api/loader/loadChannelNav.ts | 30 +
.../src/api/loader/loadCommentsbyVideoId.ts | 23 +
frontend/src/api/loader/loadDownloadAggs.ts | 37 +
frontend/src/api/loader/loadDownloadQueue.ts | 35 +
frontend/src/api/loader/loadNotifications.ts | 30 +
frontend/src/api/loader/loadPlaylistById.ts | 23 +
frontend/src/api/loader/loadPlaylistList.ts | 50 +
frontend/src/api/loader/loadSearch.ts | 23 +
.../src/api/loader/loadSimmilarVideosById.ts | 23 +
frontend/src/api/loader/loadSnapshots.ts | 23 +
.../api/loader/loadSponsorblockByVideoId.ts | 23 +
.../api/loader/loadStatsBiggestChannels.ts | 28 +
frontend/src/api/loader/loadStatsChannel.ts | 23 +
frontend/src/api/loader/loadStatsDownload.ts | 23 +
.../api/loader/loadStatsDownloadHistory.ts | 23 +
frontend/src/api/loader/loadStatsPlaylist.ts | 23 +
frontend/src/api/loader/loadStatsVideo.ts | 23 +
.../src/api/loader/loadStatsWatchProgress.ts | 23 +
frontend/src/api/loader/loadUserConfig.ts | 24 +
frontend/src/api/loader/loadVideoById.ts | 23 +
.../src/api/loader/loadVideoListByPage.ts | 65 +
frontend/src/api/loader/loadVideoNav.ts | 48 +
.../src/api/loader/loadVideoProgressById.ts | 23 +
frontend/src/components/ApplicationStats.tsx | 57 +
.../src/components/BiggestChannelsStats.tsx | 108 +
frontend/src/components/Button.tsx | 40 +
frontend/src/components/ChannelBanner.tsx | 21 +
frontend/src/components/ChannelIcon.tsx | 21 +
frontend/src/components/ChannelList.tsx | 83 +
frontend/src/components/ChannelOverview.tsx | 76 +
frontend/src/components/CommentBox.tsx | 106 +
.../src/components/DownloadHistoryStats.tsx | 41 +
frontend/src/components/DownloadListItem.tsx | 108 +
.../src/components/EmbeddableVideoPlayer.tsx | 178 +
frontend/src/components/Filterbar.tsx | 186 ++
frontend/src/components/Footer.tsx | 60 +
frontend/src/components/FormattedNumber.tsx | 27 +
frontend/src/components/GoogleCast.tsx | 230 ++
frontend/src/components/Linkify.tsx | 34 +
frontend/src/components/MoveVideoMenu.tsx | 94 +
frontend/src/components/Navigation.tsx | 42 +
frontend/src/components/NavigationItem.tsx | 16 +
frontend/src/components/Notifications.tsx | 101 +
frontend/src/components/OverviewStats.tsx | 53 +
frontend/src/components/Pagination.tsx | 213 ++
frontend/src/components/PaginationDummy.tsx | 9 +
frontend/src/components/PlaylistList.tsx | 85 +
frontend/src/components/ScrollToTop.tsx | 17 +
.../src/components/SearchExampleQueries.tsx | 116 +
.../src/components/SettingsNavigation.tsx | 36 +
frontend/src/components/StatsInfoBoxItem.tsx | 26 +
frontend/src/components/SubtitleList.tsx | 92 +
frontend/src/components/VideoList.tsx | 41 +
frontend/src/components/VideoListItem.tsx | 126 +
frontend/src/components/VideoPlayer.tsx | 254 ++
frontend/src/components/VideoTypeStats.tsx | 53 +
.../src/components/WatchProgressStats.tsx | 65 +
frontend/src/components/WatchedCheckBox.tsx | 38 +
.../configuration/colours/components/Dark.tsx | 7 +
.../colours/components/Light.tsx | 7 +
.../colours/components/Matrix.tsx | 7 +
.../colours/components/Midnight.tsx | 7 +
.../colours/components/css/dark.css | 16 +
.../colours/components/css/light.css | 16 +
.../colours/components/css/matrix.css | 69 +
.../colours/components/css/midnight.css | 16 +
.../src/configuration/colours/getColours.ts | 29 +
.../src/configuration/constants/ViewStyle.ts | 11 +
frontend/src/configuration/defaultHeaders.ts | 1 +
frontend/src/configuration/getApiUrl.ts | 14 +
.../src/configuration/getFetchCredentials.ts | 9 +
.../src/configuration/routes/RouteList.ts | 27 +
.../src/functions/capitalizeFirstLetter.ts | 6 +
frontend/src/functions/convertStarRating.ts | 24 +
frontend/src/functions/formatDates.ts | 6 +
frontend/src/functions/formatNumbers.ts | 6 +
frontend/src/functions/formatTime.ts | 32 +
frontend/src/functions/getCookie.ts | 21 +
frontend/src/functions/getIsAdmin.ts | 9 +
frontend/src/functions/humanFileSize.ts | 35 +
frontend/src/functions/isDevEnvironment.ts | 7 +
frontend/src/functions/watchedThreshold.ts | 21 +
frontend/src/main.tsx | 314 ++
frontend/src/pages/About.tsx | 64 +
frontend/src/pages/Base.tsx | 89 +
frontend/src/pages/ChannelAbout.tsx | 350 ++
frontend/src/pages/ChannelBase.tsx | 99 +
frontend/src/pages/ChannelPlaylist.tsx | 122 +
frontend/src/pages/ChannelShorts.tsx | 16 +
frontend/src/pages/ChannelStream.tsx | 16 +
frontend/src/pages/ChannelVideo.tsx | 209 ++
frontend/src/pages/Channels.tsx | 206 ++
frontend/src/pages/Download.tsx | 362 ++
frontend/src/pages/ErrorPage.tsx | 32 +
frontend/src/pages/Home.tsx | 257 ++
frontend/src/pages/Login.tsx | 106 +
frontend/src/pages/Logout.tsx | 17 +
frontend/src/pages/Playlist.tsx | 390 +++
frontend/src/pages/Playlists.tsx | 219 ++
frontend/src/pages/Search.tsx | 170 +
frontend/src/pages/SettingsActions.tsx | 245 ++
frontend/src/pages/SettingsApplication.tsx | 969 ++++++
frontend/src/pages/SettingsDashboard.tsx | 263 ++
frontend/src/pages/SettingsScheduling.tsx | 462 +++
frontend/src/pages/SettingsUser.tsx | 143 +
frontend/src/pages/Video.tsx | 535 +++
frontend/src/style.css | 1363 ++++++++
frontend/src/vite-env.d.ts | 1 +
frontend/tsconfig.json | 25 +
frontend/tsconfig.node.json | 11 +
frontend/vite.config.ts | 17 +
221 files changed, 16165 insertions(+), 2 deletions(-)
create mode 100644 frontend/.eslintrc.cjs
create mode 100644 frontend/.gitignore
create mode 100644 frontend/.prettierignore
create mode 100644 frontend/.prettierrc
create mode 100644 frontend/README.md
create mode 100644 frontend/index.html
create mode 100644 frontend/package-lock.json
create mode 100644 frontend/package.json
create mode 100644 frontend/public/favicon/android-chrome-192x192.png
create mode 100644 frontend/public/favicon/android-chrome-512x512.png
create mode 100644 frontend/public/favicon/apple-touch-icon-114x114-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-114x114.png
create mode 100644 frontend/public/favicon/apple-touch-icon-120x120-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-120x120.png
create mode 100644 frontend/public/favicon/apple-touch-icon-144x144-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-144x144.png
create mode 100644 frontend/public/favicon/apple-touch-icon-152x152-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-152x152.png
create mode 100644 frontend/public/favicon/apple-touch-icon-180x180-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-180x180.png
create mode 100644 frontend/public/favicon/apple-touch-icon-57x57-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-57x57.png
create mode 100644 frontend/public/favicon/apple-touch-icon-60x60-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-60x60.png
create mode 100644 frontend/public/favicon/apple-touch-icon-72x72-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-72x72.png
create mode 100644 frontend/public/favicon/apple-touch-icon-76x76-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon-76x76.png
create mode 100644 frontend/public/favicon/apple-touch-icon-precomposed.png
create mode 100644 frontend/public/favicon/apple-touch-icon.png
create mode 100644 frontend/public/favicon/browserconfig.xml
create mode 100644 frontend/public/favicon/favicon-16x16.png
create mode 100644 frontend/public/favicon/favicon-32x32.png
create mode 100644 frontend/public/favicon/favicon.ico
create mode 100644 frontend/public/favicon/mstile-150x150.png
create mode 100644 frontend/public/favicon/safari-pinned-tab.svg
create mode 100644 frontend/public/favicon/site.webmanifest
create mode 100644 frontend/public/font/OFL_License.txt
create mode 100644 frontend/public/font/Sen-Bold.woff
create mode 100644 frontend/public/font/Sen-Regular.woff
create mode 100644 frontend/public/img/banner-tube-archivist-dark.png
create mode 100644 frontend/public/img/banner-tube-archivist-light.png
create mode 100644 frontend/public/img/default-channel-art.jpg
create mode 100644 frontend/public/img/default-channel-banner.jpg
create mode 100644 frontend/public/img/default-channel-icon.jpg
create mode 100644 frontend/public/img/default-playlist-thumb.jpg
create mode 100644 frontend/public/img/default-video-thumb.jpg
create mode 100644 frontend/public/img/icon-add.svg
create mode 100644 frontend/public/img/icon-arrow-bottom.svg
create mode 100644 frontend/public/img/icon-arrow-down.svg
create mode 100644 frontend/public/img/icon-arrow-top.svg
create mode 100644 frontend/public/img/icon-arrow-up.svg
create mode 100644 frontend/public/img/icon-close.svg
create mode 100644 frontend/public/img/icon-dot-menu.svg
create mode 100644 frontend/public/img/icon-download.svg
create mode 100644 frontend/public/img/icon-exit.svg
create mode 100644 frontend/public/img/icon-eye.svg
create mode 100644 frontend/public/img/icon-gear.svg
create mode 100644 frontend/public/img/icon-gridview.svg
create mode 100644 frontend/public/img/icon-heart.svg
create mode 100644 frontend/public/img/icon-listview.svg
create mode 100644 frontend/public/img/icon-play.svg
create mode 100644 frontend/public/img/icon-remove.svg
create mode 100644 frontend/public/img/icon-rescan.svg
create mode 100644 frontend/public/img/icon-search.svg
create mode 100644 frontend/public/img/icon-seen.svg
create mode 100644 frontend/public/img/icon-sort.svg
create mode 100644 frontend/public/img/icon-star-empty.svg
create mode 100644 frontend/public/img/icon-star-full.svg
create mode 100644 frontend/public/img/icon-star-half.svg
create mode 100644 frontend/public/img/icon-stop.svg
create mode 100644 frontend/public/img/icon-substract.svg
create mode 100644 frontend/public/img/icon-thumb.svg
create mode 100644 frontend/public/img/icon-unseen.svg
create mode 100644 frontend/public/img/logo-tube-archivist-dark.png
create mode 100644 frontend/public/img/logo-tube-archivist-light.png
create mode 100644 frontend/src/api/actions/createCustomPlaylist.ts
create mode 100644 frontend/src/api/actions/deleteApiToken.ts
create mode 100644 frontend/src/api/actions/deleteChannel.ts
create mode 100644 frontend/src/api/actions/deleteDownloadById.ts
create mode 100644 frontend/src/api/actions/deleteDownloadQueueByFilter.ts
create mode 100644 frontend/src/api/actions/deletePlaylist.ts
create mode 100644 frontend/src/api/actions/deleteVideo.ts
create mode 100644 frontend/src/api/actions/deleteVideoProgressById.ts
create mode 100644 frontend/src/api/actions/queueBackup.ts
create mode 100644 frontend/src/api/actions/queueReindex.ts
create mode 100644 frontend/src/api/actions/queueSnapshot.ts
create mode 100644 frontend/src/api/actions/restoreBackup.ts
create mode 100644 frontend/src/api/actions/restoreSnapshot.ts
create mode 100644 frontend/src/api/actions/signIn.ts
create mode 100644 frontend/src/api/actions/stopTaskByName.ts
create mode 100644 frontend/src/api/actions/updateAppsettingsConfig.ts
create mode 100644 frontend/src/api/actions/updateChannelSubscription.ts
create mode 100644 frontend/src/api/actions/updateCookie.ts
create mode 100644 frontend/src/api/actions/updateCustomPlaylist.ts
create mode 100644 frontend/src/api/actions/updateDownloadQueue.ts
create mode 100644 frontend/src/api/actions/updateDownloadQueueStatusById.ts
create mode 100644 frontend/src/api/actions/updatePlaylistSubscription.ts
create mode 100644 frontend/src/api/actions/updateTaskByName.ts
create mode 100644 frontend/src/api/actions/updateUserConfig.ts
create mode 100644 frontend/src/api/actions/updateVideoProgressById.ts
create mode 100644 frontend/src/api/actions/updateWatchedState.ts
create mode 100644 frontend/src/api/loader/loadApiToken.ts
create mode 100644 frontend/src/api/loader/loadAppsettingsConfig.ts
create mode 100644 frontend/src/api/loader/loadAuth.ts
create mode 100644 frontend/src/api/loader/loadBackupList.ts
create mode 100644 frontend/src/api/loader/loadChannelById.ts
create mode 100644 frontend/src/api/loader/loadChannelList.ts
create mode 100644 frontend/src/api/loader/loadChannelNav.ts
create mode 100644 frontend/src/api/loader/loadCommentsbyVideoId.ts
create mode 100644 frontend/src/api/loader/loadDownloadAggs.ts
create mode 100644 frontend/src/api/loader/loadDownloadQueue.ts
create mode 100644 frontend/src/api/loader/loadNotifications.ts
create mode 100644 frontend/src/api/loader/loadPlaylistById.ts
create mode 100644 frontend/src/api/loader/loadPlaylistList.ts
create mode 100644 frontend/src/api/loader/loadSearch.ts
create mode 100644 frontend/src/api/loader/loadSimmilarVideosById.ts
create mode 100644 frontend/src/api/loader/loadSnapshots.ts
create mode 100644 frontend/src/api/loader/loadSponsorblockByVideoId.ts
create mode 100644 frontend/src/api/loader/loadStatsBiggestChannels.ts
create mode 100644 frontend/src/api/loader/loadStatsChannel.ts
create mode 100644 frontend/src/api/loader/loadStatsDownload.ts
create mode 100644 frontend/src/api/loader/loadStatsDownloadHistory.ts
create mode 100644 frontend/src/api/loader/loadStatsPlaylist.ts
create mode 100644 frontend/src/api/loader/loadStatsVideo.ts
create mode 100644 frontend/src/api/loader/loadStatsWatchProgress.ts
create mode 100644 frontend/src/api/loader/loadUserConfig.ts
create mode 100644 frontend/src/api/loader/loadVideoById.ts
create mode 100644 frontend/src/api/loader/loadVideoListByPage.ts
create mode 100644 frontend/src/api/loader/loadVideoNav.ts
create mode 100644 frontend/src/api/loader/loadVideoProgressById.ts
create mode 100644 frontend/src/components/ApplicationStats.tsx
create mode 100644 frontend/src/components/BiggestChannelsStats.tsx
create mode 100644 frontend/src/components/Button.tsx
create mode 100644 frontend/src/components/ChannelBanner.tsx
create mode 100644 frontend/src/components/ChannelIcon.tsx
create mode 100644 frontend/src/components/ChannelList.tsx
create mode 100644 frontend/src/components/ChannelOverview.tsx
create mode 100644 frontend/src/components/CommentBox.tsx
create mode 100644 frontend/src/components/DownloadHistoryStats.tsx
create mode 100644 frontend/src/components/DownloadListItem.tsx
create mode 100644 frontend/src/components/EmbeddableVideoPlayer.tsx
create mode 100644 frontend/src/components/Filterbar.tsx
create mode 100644 frontend/src/components/Footer.tsx
create mode 100644 frontend/src/components/FormattedNumber.tsx
create mode 100644 frontend/src/components/GoogleCast.tsx
create mode 100644 frontend/src/components/Linkify.tsx
create mode 100644 frontend/src/components/MoveVideoMenu.tsx
create mode 100644 frontend/src/components/Navigation.tsx
create mode 100644 frontend/src/components/NavigationItem.tsx
create mode 100644 frontend/src/components/Notifications.tsx
create mode 100644 frontend/src/components/OverviewStats.tsx
create mode 100644 frontend/src/components/Pagination.tsx
create mode 100644 frontend/src/components/PaginationDummy.tsx
create mode 100644 frontend/src/components/PlaylistList.tsx
create mode 100644 frontend/src/components/ScrollToTop.tsx
create mode 100644 frontend/src/components/SearchExampleQueries.tsx
create mode 100644 frontend/src/components/SettingsNavigation.tsx
create mode 100644 frontend/src/components/StatsInfoBoxItem.tsx
create mode 100644 frontend/src/components/SubtitleList.tsx
create mode 100644 frontend/src/components/VideoList.tsx
create mode 100644 frontend/src/components/VideoListItem.tsx
create mode 100644 frontend/src/components/VideoPlayer.tsx
create mode 100644 frontend/src/components/VideoTypeStats.tsx
create mode 100644 frontend/src/components/WatchProgressStats.tsx
create mode 100644 frontend/src/components/WatchedCheckBox.tsx
create mode 100644 frontend/src/configuration/colours/components/Dark.tsx
create mode 100644 frontend/src/configuration/colours/components/Light.tsx
create mode 100644 frontend/src/configuration/colours/components/Matrix.tsx
create mode 100644 frontend/src/configuration/colours/components/Midnight.tsx
create mode 100644 frontend/src/configuration/colours/components/css/dark.css
create mode 100644 frontend/src/configuration/colours/components/css/light.css
create mode 100644 frontend/src/configuration/colours/components/css/matrix.css
create mode 100644 frontend/src/configuration/colours/components/css/midnight.css
create mode 100644 frontend/src/configuration/colours/getColours.ts
create mode 100644 frontend/src/configuration/constants/ViewStyle.ts
create mode 100644 frontend/src/configuration/defaultHeaders.ts
create mode 100644 frontend/src/configuration/getApiUrl.ts
create mode 100644 frontend/src/configuration/getFetchCredentials.ts
create mode 100644 frontend/src/configuration/routes/RouteList.ts
create mode 100644 frontend/src/functions/capitalizeFirstLetter.ts
create mode 100644 frontend/src/functions/convertStarRating.ts
create mode 100644 frontend/src/functions/formatDates.ts
create mode 100644 frontend/src/functions/formatNumbers.ts
create mode 100644 frontend/src/functions/formatTime.ts
create mode 100644 frontend/src/functions/getCookie.ts
create mode 100644 frontend/src/functions/getIsAdmin.ts
create mode 100644 frontend/src/functions/humanFileSize.ts
create mode 100644 frontend/src/functions/isDevEnvironment.ts
create mode 100644 frontend/src/functions/watchedThreshold.ts
create mode 100644 frontend/src/main.tsx
create mode 100644 frontend/src/pages/About.tsx
create mode 100644 frontend/src/pages/Base.tsx
create mode 100644 frontend/src/pages/ChannelAbout.tsx
create mode 100644 frontend/src/pages/ChannelBase.tsx
create mode 100644 frontend/src/pages/ChannelPlaylist.tsx
create mode 100644 frontend/src/pages/ChannelShorts.tsx
create mode 100644 frontend/src/pages/ChannelStream.tsx
create mode 100644 frontend/src/pages/ChannelVideo.tsx
create mode 100644 frontend/src/pages/Channels.tsx
create mode 100644 frontend/src/pages/Download.tsx
create mode 100644 frontend/src/pages/ErrorPage.tsx
create mode 100644 frontend/src/pages/Home.tsx
create mode 100644 frontend/src/pages/Login.tsx
create mode 100644 frontend/src/pages/Logout.tsx
create mode 100644 frontend/src/pages/Playlist.tsx
create mode 100644 frontend/src/pages/Playlists.tsx
create mode 100644 frontend/src/pages/Search.tsx
create mode 100644 frontend/src/pages/SettingsActions.tsx
create mode 100644 frontend/src/pages/SettingsApplication.tsx
create mode 100644 frontend/src/pages/SettingsDashboard.tsx
create mode 100644 frontend/src/pages/SettingsScheduling.tsx
create mode 100644 frontend/src/pages/SettingsUser.tsx
create mode 100644 frontend/src/pages/Video.tsx
create mode 100644 frontend/src/style.css
create mode 100644 frontend/src/vite-env.d.ts
create mode 100644 frontend/tsconfig.json
create mode 100644 frontend/tsconfig.node.json
create mode 100644 frontend/vite.config.ts
diff --git a/Dockerfile b/Dockerfile
index 08a43441..c6c356b9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,17 @@
# multi stage to build tube archivist
# build python wheel, download and extract ffmpeg, copy into final image
+FROM node:lts-alpine as node-builder
+
+# RUN npm config set registry https://registry.npmjs.org/
+
+COPY ./frontend /frontend
+
+WORKDIR /frontend
+RUN npm i
+RUN npm run build:deploy
+
+WORKDIR /
# First stage to build python wheel
FROM python:3.11.8-slim-bookworm AS builder
@@ -60,6 +71,8 @@ COPY ./backend /app
COPY ./docker_assets/run.sh /app
COPY ./docker_assets/uwsgi.ini /app
+COPY --from=node-builder ./frontend/dist /app/static
+
# volumes
VOLUME /cache
VOLUME /youtube
diff --git a/docker_assets/nginx.conf b/docker_assets/nginx.conf
index a9702490..c6b23e9a 100644
--- a/docker_assets/nginx.conf
+++ b/docker_assets/nginx.conf
@@ -24,10 +24,24 @@ server {
text/vtt vtt;
}
}
+
+ location /youtube/ {
+ auth_request /api/ping/;
+ alias /youtube/;
+ types {
+ video/mp4 mp4;
+ }
+ }
- location / {
+ location /api {
include uwsgi_params;
uwsgi_pass localhost:8080;
}
-
+
+ root /app/static;
+ index index.html;
+
+ location / {
+ try_files $uri $uri/ /index.html =404;
+ }
}
\ No newline at end of file
diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs
new file mode 100644
index 00000000..9fa26acb
--- /dev/null
+++ b/frontend/.eslintrc.cjs
@@ -0,0 +1,16 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:react-hooks/recommended',
+ 'prettier',
+ ],
+ ignorePatterns: ['dist', '.eslintrc.cjs'],
+ parser: '@typescript-eslint/parser',
+ plugins: ['react-refresh'],
+ rules: {
+ 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
+ },
+};
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 00000000..a547bf36
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/frontend/.prettierignore b/frontend/.prettierignore
new file mode 100644
index 00000000..501942fd
--- /dev/null
+++ b/frontend/.prettierignore
@@ -0,0 +1,5 @@
+# Ignore artifacts:
+build
+dist
+coverage
+node_modules
\ No newline at end of file
diff --git a/frontend/.prettierrc b/frontend/.prettierrc
new file mode 100644
index 00000000..3e4b9fa0
--- /dev/null
+++ b/frontend/.prettierrc
@@ -0,0 +1,5 @@
+{
+ "singleQuote": true,
+ "arrowParens": "avoid",
+ "printWidth": 100
+}
diff --git a/frontend/README.md b/frontend/README.md
new file mode 100644
index 00000000..275fc390
--- /dev/null
+++ b/frontend/README.md
@@ -0,0 +1,17 @@
+# Tubearchivist Frontend React
+
+# Folder structure
+
+```
+src ┐
+ ├───api
+ │ ├───action // Functions that do write (POST,DELETE) calls to the backend
+ │ └───loader // Functions that do read-only (GET,HEAD) calls to the backend
+ ├───components // React components to be used in pages
+ ├───configuration // Application configuration.
+ │ ├───colours // Css loader for themes
+ │ ├───constants // global constants that have no good place
+ │ └───routes // Routes definitions used in Links and react-router-dom configuration
+ ├───functions // Useful functions
+ └───pages // React components that define a page/route
+```
diff --git a/frontend/index.html b/frontend/index.html
new file mode 100644
index 00000000..6396d71a
--- /dev/null
+++ b/frontend/index.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TubeArchivist
+
+
+
+
+
+
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 00000000..d8d9a818
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,2961 @@
+{
+ "name": "tubearchivist-frontend",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "tubearchivist-frontend",
+ "version": "0.1.0",
+ "dependencies": {
+ "dompurify": "^3.1.6",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-helmet": "^6.1.0",
+ "react-router-dom": "^6.25.1"
+ },
+ "devDependencies": {
+ "@types/dompurify": "^3.0.5",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "@types/react-helmet": "^6.1.11",
+ "@typescript-eslint/eslint-plugin": "^7.16.1",
+ "@typescript-eslint/parser": "^7.16.1",
+ "@vitejs/plugin-react-swc": "^3.7.0",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-react-hooks": "^4.6.2",
+ "eslint-plugin-react-refresh": "^0.4.8",
+ "prettier": "3.3.3",
+ "typescript": "^5.5.3",
+ "vite": "^5.3.4"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@remix-run/router": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.18.0.tgz",
+ "integrity": "sha512-L3jkqmqoSVBVKHfpGZmLrex0lxR5SucGA0sUfFzGctehw+S/ggL9L/0NnC5mw6P8HUWpFZ3nQw3cRApjjWx9Sw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
+ "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
+ "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
+ "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
+ "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
+ "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
+ "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
+ "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
+ "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
+ "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
+ "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
+ "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
+ "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
+ "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
+ "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
+ "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
+ "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@swc/core": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.6.13.tgz",
+ "integrity": "sha512-eailUYex6fkfaQTev4Oa3mwn0/e3mQU4H8y1WPuImYQESOQDtVrowwUGDSc19evpBbHpKtwM+hw8nLlhIsF+Tw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3",
+ "@swc/types": "^0.1.9"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-darwin-arm64": "1.6.13",
+ "@swc/core-darwin-x64": "1.6.13",
+ "@swc/core-linux-arm-gnueabihf": "1.6.13",
+ "@swc/core-linux-arm64-gnu": "1.6.13",
+ "@swc/core-linux-arm64-musl": "1.6.13",
+ "@swc/core-linux-x64-gnu": "1.6.13",
+ "@swc/core-linux-x64-musl": "1.6.13",
+ "@swc/core-win32-arm64-msvc": "1.6.13",
+ "@swc/core-win32-ia32-msvc": "1.6.13",
+ "@swc/core-win32-x64-msvc": "1.6.13"
+ },
+ "peerDependencies": {
+ "@swc/helpers": "*"
+ },
+ "peerDependenciesMeta": {
+ "@swc/helpers": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.13.tgz",
+ "integrity": "sha512-SOF4buAis72K22BGJ3N8y88mLNfxLNprTuJUpzikyMGrvkuBFNcxYtMhmomO0XHsgLDzOJ+hWzcgjRNzjMsUcQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.6.13.tgz",
+ "integrity": "sha512-AW8akFSC+tmPE6YQQvK9S2A1B8pjnXEINg+gGgw0KRUUXunvu1/OEOeC5L2Co1wAwhD7bhnaefi06Qi9AiwOag==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.13.tgz",
+ "integrity": "sha512-f4gxxvDXVUm2HLYXRd311mSrmbpQF2MZ4Ja6XCQz1hWAxXdhRl1gpnZ+LH/xIfGSwQChrtLLVrkxdYUCVuIjFg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.13.tgz",
+ "integrity": "sha512-Nf/eoW2CbG8s+9JoLtjl9FByBXyQ5cjdBsA4efO7Zw4p+YSuXDgc8HRPC+E2+ns0praDpKNZtLvDtmF2lL+2Gg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.13.tgz",
+ "integrity": "sha512-2OysYSYtdw79prJYuKIiux/Gj0iaGEbpS2QZWCIY4X9sGoETJ5iMg+lY+YCrIxdkkNYd7OhIbXdYFyGs/w5LDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.13.tgz",
+ "integrity": "sha512-PkR4CZYJNk5hcd2+tMWBpnisnmYsUzazI1O5X7VkIGFcGePTqJ/bWlfUIVVExWxvAI33PQFzLbzmN5scyIUyGQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.13.tgz",
+ "integrity": "sha512-OdsY7wryTxCKwGQcwW9jwWg3cxaHBkTTHi91+5nm7hFPpmZMz1HivJrWAMwVE7iXFw+M4l6ugB/wCvpYrUAAjA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.13.tgz",
+ "integrity": "sha512-ap6uNmYjwk9M/+bFEuWRNl3hq4VqgQ/Lk+ID/F5WGqczNr0L7vEf+pOsRAn0F6EV+o/nyb3ePt8rLhE/wjHpPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.13.tgz",
+ "integrity": "sha512-IJ8KH4yIUHTnS/U1jwQmtbfQals7zWPG0a9hbEfIr4zI0yKzjd83lmtS09lm2Q24QBWOCFGEEbuZxR4tIlvfzA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.6.13",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.13.tgz",
+ "integrity": "sha512-f6/sx6LMuEnbuxtiSL/EkR0Y6qUHFw1XVrh6rwzKXptTipUdOY+nXpKoh+1UsBm/r7H0/5DtOdrn3q5ZHbFZjQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.9.tgz",
+ "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
+ }
+ },
+ "node_modules/@types/dompurify": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+ "dev": true,
+ "dependencies": {
+ "@types/trusted-types": "*"
+ }
+ },
+ "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/prop-types": {
+ "version": "15.7.12",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz",
+ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.3",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
+ "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz",
+ "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-helmet": {
+ "version": "6.1.11",
+ "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-6.1.11.tgz",
+ "integrity": "sha512-0QcdGLddTERotCXo3VFlUSWO3ztraw8nZ6e3zJSgG7apwV5xt+pJUS8ewPBqT4NYB1optGLprNQzFleIY84u/g==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.1.tgz",
+ "integrity": "sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "7.16.1",
+ "@typescript-eslint/type-utils": "7.16.1",
+ "@typescript-eslint/utils": "7.16.1",
+ "@typescript-eslint/visitor-keys": "7.16.1",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^7.0.0",
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.16.1.tgz",
+ "integrity": "sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "7.16.1",
+ "@typescript-eslint/types": "7.16.1",
+ "@typescript-eslint/typescript-estree": "7.16.1",
+ "@typescript-eslint/visitor-keys": "7.16.1",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.16.1.tgz",
+ "integrity": "sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.1",
+ "@typescript-eslint/visitor-keys": "7.16.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.16.1.tgz",
+ "integrity": "sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "7.16.1",
+ "@typescript-eslint/utils": "7.16.1",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.16.1.tgz",
+ "integrity": "sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.1.tgz",
+ "integrity": "sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.1",
+ "@typescript-eslint/visitor-keys": "7.16.1",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.16.1.tgz",
+ "integrity": "sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "7.16.1",
+ "@typescript-eslint/types": "7.16.1",
+ "@typescript-eslint/typescript-estree": "7.16.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.16.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.1.tgz",
+ "integrity": "sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.16.1",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz",
+ "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@swc/core": "^1.5.7"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5"
+ }
+ },
+ "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-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "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/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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/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/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/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/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/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "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,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.6.tgz",
+ "integrity": "sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==",
+ "license": "(MPL-2.0 OR Apache-2.0)"
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.8.tgz",
+ "integrity": "sha512-MIKAclwaDFIiYtVBLzDdm16E+Ty4GwhB6wZlCAG1R3Ur+F9Qbo6PRxpA5DK7XtDgm+WlCoAY2WxAwqhmIDHg6Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/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/eslint/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/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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/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/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/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==",
+ "dev": true,
+ "license": "MIT",
+ "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-glob/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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "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": "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/glob/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/glob/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/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "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/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/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/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/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==",
+ "dev": true
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/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": "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/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "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/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+ "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "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==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/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-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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.39",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+ "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
+ "dev": true,
+ "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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.1",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "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/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ },
+ "node_modules/react-helmet": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz",
+ "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.7.2",
+ "react-fast-compare": "^3.1.1",
+ "react-side-effect": "^2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.3.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-router": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.25.1.tgz",
+ "integrity": "sha512-u8ELFr5Z6g02nUtpPAggP73Jigj1mRePSwhS/2nkTrlPU5yEkH1vYzWNyvSnSzeeE2DNqWdH+P8OhIh9wuXhTw==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.18.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.25.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.25.1.tgz",
+ "integrity": "sha512-0tUDpbFvk35iv+N89dWNrJp+afLgd+y4VtorJZuOCXK0kkCWjEvb3vTJM++SYvMEpbVwXKf3FjeVveVEb6JpDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@remix-run/router": "1.18.0",
+ "react-router": "6.25.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/react-side-effect": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz",
+ "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==",
+ "peerDependencies": {
+ "react": "^16.3.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "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/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "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.17.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
+ "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
+ "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.17.2",
+ "@rollup/rollup-android-arm64": "4.17.2",
+ "@rollup/rollup-darwin-arm64": "4.17.2",
+ "@rollup/rollup-darwin-x64": "4.17.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.17.2",
+ "@rollup/rollup-linux-arm64-musl": "4.17.2",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-gnu": "4.17.2",
+ "@rollup/rollup-linux-x64-musl": "4.17.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.17.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.17.2",
+ "@rollup/rollup-win32-x64-msvc": "4.17.2",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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==",
+ "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": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
+ "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "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/vite": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz",
+ "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.39",
+ "rollup": "^4.13.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/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/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 00000000..73167b9f
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,35 @@
+{
+ "name": "tubearchivist-frontend",
+ "version": "0.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "build:deploy": "vite build",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "dompurify": "^3.1.6",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "react-helmet": "^6.1.0",
+ "react-router-dom": "^6.25.1"
+ },
+ "devDependencies": {
+ "@types/dompurify": "^3.0.5",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "@types/react-helmet": "^6.1.11",
+ "@typescript-eslint/eslint-plugin": "^7.16.1",
+ "@typescript-eslint/parser": "^7.16.1",
+ "@vitejs/plugin-react-swc": "^3.7.0",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-react-hooks": "^4.6.2",
+ "eslint-plugin-react-refresh": "^0.4.8",
+ "prettier": "3.3.3",
+ "typescript": "^5.5.3",
+ "vite": "^5.3.4"
+ }
+}
diff --git a/frontend/public/favicon/android-chrome-192x192.png b/frontend/public/favicon/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef0ebfe3ee1e66dac00d25ff8e9ddece7dc835ba
GIT binary patch
literal 2351
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
literal 0
HcmV?d00001
diff --git a/frontend/public/favicon/apple-touch-icon-114x114-precomposed.png b/frontend/public/favicon/apple-touch-icon-114x114-precomposed.png
new file mode 100644
index 0000000000000000000000000000000000000000..04090832ff2678920b8c1876aabe3dbd6e248734
GIT binary patch
literal 1720
zcmbVMc{JOJ7XA@xiRD>3`Ur_^#MUgeMVcm`;a7mC8(YDV0i$*T`_c*tFGjTNG6*F0BKkN$jSwPZDlKK
z2>_Dt0I(7c0OTqFFcDts3ZMXhir#U*Ai8ou1>x|2hiz?er2G`y5gd`y|cL}23?qL91`4p$s|zeh_Q%$ED+FiNq?}q-k0I3
zWl>R>kJ{No6V5%g%=yc)2w!iSOo9Ma_nXoo*JJsPIDkuIZ{U2v-YQk0Yt1
zx@OYvvgN%;wc1vyew!R`rU4?vR{gfOD|Vd|6>QKzGrc}cY|h8pHhxsoA`KAR`3U4!
zVV3UyBc#5+IajvkGvV@VX8-xDEWJYApAn!5=J9PY{Da^a_
zLf698I;kvl|7YV=5*Q|)<=jDkeZRhZ;BxqMbVD+`>X!a1@o0VM?`f%3?{pec4w!YW
zbj=Ib?B{EC26Kp`^Eus`cS@PWazUFMO1}pZ0~fE+a=~^(a}U}V*)vm9e++RBJ9SQ#
zK9nDk2!>w#7BWIl4)mYUH6hwRD`QbQSHT<6=}v*Z>}_j!wO%3|WIIc31Jf10;mZCqn##v*BT%5Hw;!tRR$xK`Vz!?7Z8-XT8D^|C
zRFl6sSgr8O9n(uv{uW;i(7XwCRW3!V5xOz|qeshzs+?Rle0ve>ee*tR$Un~|iso(4`0
za0hF{j2X$)-uAs!c3-Pi-l_5yuh$XXQgcc*FYJdV<_7gAKi_qo5;eQ(im>J3TWd)k
zXx|mtg6K{oukM18O|RMMzQRVPVbn&!lWFOlbu$>YAoli5)(;8xNXi2PT&sxw<*@?_qXh2C*o{Z+-m
z>lD94h`ja2!7C+Zc0DYXukGq{d*`ySG8j5kSSzdV8~yoBoP}Zd<<+r?G8g|f@tDFa
z>FNuFk;K;?UA3hK$PxW4s*}Gd2_S
zA6FkKebNe@ji0P?tBZe8_aC1x)aM?J08T^_jO_WMy=Vz)HXHvzX5Ft4$avNKJO
zKHQl*Dp@%rgf`{IDqjdjL=P54aYfPO$b@Jm07N{IU{4^}6J3J{j$}synMAO~mZ
z6}R5>zX{I8MG1JR|14PK9T-vyPNW3|i`d*0gfJnFCy0qgh*E{o2!T)(2>|D>&28vt
z#&fK#fAAl91TL@v2ny;D2{l3)`IZ|)j1aV}BM+k>sE#1S$ke24;L!kVKw~6}+2G><
Xte6;xHas0Gl`8;{evH=U8J_benMBR`
literal 0
HcmV?d00001
diff --git a/frontend/public/favicon/apple-touch-icon-114x114.png b/frontend/public/favicon/apple-touch-icon-114x114.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4ff60af282830032be97ff7597ef713127dbd89
GIT binary patch
literal 1376
zcmeAS@N?(olHy`uVBq!ia0vp^MIg+<3?z3jm-+)KmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l(-b&6XMFKpr<{zi&0Tu
zp{7W4MjMZ#8=HY8r=^2%c$jK;Et9Gti?$iFx-q-4jryb}shl*)tQ5_e?M%uBKmYvs
z^Y`zsU%&qU|DRFSEEpIhk)HJB=MVX+g7@FPs`b@#X_#?YJB8Ch=kA?YQmfQlrchU`*jRe;+D&F9
z1M#G|cOO2=mE{Jc=5v_YDYaA_IDVQ%(^R>w(sjw?X-9TxOlfA-HJ2^PQR%D}iHe9~
zlLq>dficP3-9@bC;tEM1hrPtp*OmP#w=BQ0yzaq`RtyZx8lEnWAsP4H-pY2qY#_q+
zAZ50J+M#0!4HlxJb1PCcxU}L9{Qp0FOZ4nHD(Y`fdRpy!@|S6e=RCFSO@x3_9Rcze&iCr)HO6ggR%_AbbN=07=KfIDWmc`<
z=eZieTY0M&cNm18HqAR6V4PGp!}s{(yQ$yAZnDmt;+eau?=R!lw@Q7Q#}$`o-P-QE
ztKxu4=*`3pnokc~1o3|E&|#anAm_Z{%O}cmE4i1edj4Ku?d8}OyVdXR@e{ia#Ca}0
zmDcg{%99EHP2ct!T$=T6`Mo%)qMSF+&NF%JVD>#ZPgqQH`g7B}FP(FQXaDE;#QN~*
zk+`o?pO)Bs5>n2buJfz%<<$8t?sKBpx2!H}n{z8$%`-;h29w>_N%;@5)@1E{I??T>
zwSJ~t!K#m*^?PN_E$R<}b74O*h)4Ois56`sEp{BPSg3
zY=Zl_lTT(k&-?6gQ6uchPQ70uU!#68w{6KV7Jsza^30~q-Pca6+mJqOzuw2(y;^^Q
zwpy8~TTgj&$@A)~)v;bG%RNk|-0^qg(u$lK`zR&w`zqBS^H;Z?ZZUOIoA~<4?7|1u
ze_y%#t?d&rt6bDSK|DrfWq-i)(23StRqniDu>8Tuck!ECOS4;6W@4bH~{lJ;Dq`Of|bUyR1mu%kCoG)<1bbW5Se$;p0FY7s!UB2o@U*&h)
z9jNBd((5_*g=D9~QPvkr9{!U)^E{VF^9V;t_~nU}bIojJGx%b%JF@P5`PX~3>&ueK
zlB$w#oye&7sXpe%|%s6|;*rHQ?wwk9PsmPm=UNr{&C5EWWd6=b588K!EF_RSdY
zO*wPEhv-89
z0Dx0H$#gm1{=-#4@`&h=%*jFNx*N?602&LShiqkej*j%C(*Ph13jhKk0DO~|1it}5
zG64WqSODNy4gh*wafiPX04V7BU1m_^4GL)d|7E&Y!*JDk%9i#Dr_Y_q<)2E7F?*10
zloDrz?*eEB)
z)e}B`_I{xmg{4;Bfoxtn$e3X1K{vnXYb?Btb)zZa>@dz=>Xwcuk_W`h&dBkSzTL&S
zg{85n8O?J}J72$=SLF0dM~qSvHa52sGVc{u*C=8L=sP!|u9V!ehl(b|k?{|1%*e&H
zFE9)Hh$mId#}(x4bdaev*xCu^b_x5J483a+Ci&?QlDm1iNGCj0)y`SNpNY7zcGwM}HXm%E(y6C4rWV`0=K|a%>vR@%jz&t9A0$zd|s#~Kh
zyBi(ln{lO*-557MzMI~^`Y(buu-@?JgEZm0M8~4MJa85mK_*lB4gyDykJq@rj@!jW
z+%Nk_&KlUcj`p#QI$bxdDY=h)JZ4bi=T~66@?1mIw@3Dm)+}DoB-w^L8A!GnQ`P1<
z@W?>k@<5V;OzT$HWjz-D=Jmm3g=o>ll@It=a}eC;G~LLKjN{TZMd9vNl+HRiL0s3P
zjATELozs6B1eyr0(SOk`nX$lgrRj72GUkY$ir($Nsv93(-D_jMcw2me#h*dQ9v8K?
zfdmUcr_M9oU^>-w>Sex|bA{P+YsaHjG<^x_V(KrsU|7%@@Xw^bbI*OG~}<$`QWKex|g|GknccI9XhA%m>
z4o55f`VkigFBnN07maG?P3gr!xefnr=6tQQIG9o%PZtfik1A9tZZXUZ?!2GfZy}W9
z=KAKPH+mEQw$6U<{4g`SbAEIy72R8e65sb7d8nduCbU<<`M-|xMjIQ0mw
zHq?+mWZzZ(#5$RCE4cINunq@V+o4`(QIlCE-3)T4!C|wXR%XMi>hL}NI~kKL(=!1D
zVUH#ks4<0)68pZj1RPmgjBg5iKjVM7-)aDP2J;H{LyRi*uHD^n5&q71NvEbBF;F=h
z(lD9C7*80MPgM^qX^#~c&=$u&9R`0p@00#=c{qf2=Aa7m-TCCzv-ab6o95E+
zv8trA1uxbqe4>n~oKo}a=ayDOoc)uk?a&W4%LCYyX3f%9{lws<#iM~z9HY&(W~kOB
zyZq;<4d3L!4B2aCUlTk~x$jb1`lsC_wft+?#XjE1rrR5imJIpsEb0(U*;2rUr+l)I
zpBEDzg~^Lz^Ei%?H#u?utO!;_OCr(I>O6yJ>u5`Kv?k&R1V;j)l+?xlFG5^GR7`a0
z|0XO)tGtmDg3=gF9-Vy)&Apir9rHa0%}eES&@o(Ir2ONE7dBz4iGgNj1HOYp)FnCq
z!a(tnP%Vs>cd<4|3r!Z-^hSX&%?$M5k+}Sy}%9+?(W_
literal 0
HcmV?d00001
diff --git a/frontend/public/favicon/apple-touch-icon-120x120.png b/frontend/public/favicon/apple-touch-icon-120x120.png
new file mode 100644
index 0000000000000000000000000000000000000000..569d7c5ab29613674fbf869db3eef2a45b5f6c6a
GIT binary patch
literal 1425
zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P3?%t>9eV(zSkfJR9T^xl_H+M9WCijSl0AZa
z85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP~v%jPlzj{f}U7>jP~3v
zR$X&OMSYddYMH`JjVaA?Wx3M%84@W8B2f{%E*_kg4ob~sTC+PO(vuYGin;Av_`QAq
z|NpNxp@Glc`}&=Gl36J>A@Kr!0pmrUxirk=tlXr`oF6=XdiB;FA$^;#-@a+iY(H`CqFiPE$4{U08$0^vE@o0T
zP^c;5c5v;SK95P&@Zz`sfQ*K#)V|m?!
z8?6`^m|Z+w978hhy}gwgE^H{m_MqVQ#()E2lIAg5I}*A(R_xGz*Y)dveSgU{o$^U{
zbk;tf@tt}3T+esL<=duh>sh)43@XxC8UD%dU{8J4zq7sYa=V#~j5NFAsYyD0Rg4E1
z+%u~g5}4bUg)`$xQ}Y#Onq=5+*`2tzao!uXr8kZid}@fu
zRGsi9K&`{3Nb8Y)zpQq}>2sfLQ~Pg5+ikiY7GE^~P34?zbC*9CJ9zB+d420s54g;^
zrGIecx(g?!EDSy^w_!R@$PcY;TedSu#CzpQ?n!WY7kw$k!u-HA+xTGj>!#};8(W>X
zleHw`j%PrTK~4`PZ}6PXvDRiT&7Dw|dvZ
z#)${|J!1>Q*_GFe?3%?I2p21wQ`9O|Ds?YeH_EAJIG
zA=clwa`L!13U)sofZn)jPFUD@C7=ygzvH5qGSD*M3
zn)`W^h)-Ca`j#(q)9XJLN&dd&^Z(hcO_R0H{(n~>Ur=)N=d{vW7yrd8nD?J~Tz}=T
zk$=U%;_35q-?tq+Ty$mT-?pqzt7rVX{V3VSf{U;6LW@abIJbEoA`6;`9%GHG_
z3)G?xcPDa3{V2%$aF_I`O$>Bwut&v1ZoP&8Z7wjx}G@Q2xuHpb7#{@1KibqT916
zc>Z-z5u;k-8c~vxSdwa$T$Bo=7>o>z40R0+b&V`T3{9;}4Xum~wG9lc3=F1O@2f`9
zkei>9nO2Eg!}Bz@<3J7JRUr{2L5bxG1x5L3nK`KnC6xuK3Yi5Z$-t6w&f`x!9ED*T
z8mIhEpYePe#K5e~t(VL#tSsz3S%g_w!KK0Ea0;{X<`9L`H?EvGa^{H45%$v!9t*tm
Z7+#4BmV9zDoeH#q!PC{xWt~$(695AKR{sD1
literal 0
HcmV?d00001
diff --git a/frontend/public/favicon/apple-touch-icon-144x144-precomposed.png b/frontend/public/favicon/apple-touch-icon-144x144-precomposed.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d0571d37c8f546f7dbc0042a0e3925a6b7f7c2a
GIT binary patch
literal 2149
zcmbtUX*8RQ7X2h7#wH;`)$rXWrn*#&HMRL%L&8HuXs)M<7>kPtYA8a@V>Q(ps#={~
zt-iE1r8Qh~UyVg+FV#WS)B!bxrPRy)`F^}#Z>@9AUT3ef*IDbFwRRrW)lp7bMH&DA
zISSd1Cc@IcQxYz!BUj|}MIasmxj+EGE0Njtmk{+JlT32~fFvydNIwq%J0dE55dh*0
z0pPPA09alD0Hx?^zPmL5h#jT=gKjSx5CaYV&(OP?FRp6}*EW{6ven^cf~m1sZw5@0
zs1)FPq$*dtEJHaYKvGQW5V|L_lL$_=~m?Y_2%95$GQ4P
zt)IUxEq_~uA2wWFTbG3#q%2758=IR#Vej+N1CGuxyy4dN_MxayX&p25_(-%X)!|eK
z(%5=;Zx7|{BB5`Nai?Wps%q^Lm{b2LXGc!RE%|eB7@=vjv$F#+nAh*|@W-9Biqllg
ze$hyZ&bwTr#*QejyNfd>5%QALO3Gh_Q*LIHI%W2{vSL`0FY>;*g^EOuZP}*Cy$w70lyYXQj~5xnLSckR!kcsDziz5
zh%RMrQKT9(Q!ajgztca)XR0iPa24NoVfgZF3_I~$#AM!*4n=UKVu_s`8*zr%`LBsz
zD=BQ=QzM&v<%V!@!N>f7cENHRKg32|yP&w+q7(C1&%}J<=%XgJsUAj@bFbUcX03vy
zBaT%({lo}tjcWu2^Cje?O>$VWkq3SWxtiB^WW*L}CcHszH59M+RF!I=>
zBJbIUuFK~Un;c(+CjE%z2F4%SR2SyW^<=14?lbPQOu^pB$Q*;0RB(Y9%kfo!v(&pk
zDpU3FBw7K|1a&U%D_F8YqO2hjlXD{{NC6&ysoJpgp7?@1&1(+^wy_mZj;+-%C=|r?
zt6H5w+c{A4OTJ)7FW_?(NY@sfoj^gDs$duHxr7;!9KU
z5qO;f$_)t3k_AaS@MJRDpF8*cEmOOcK9kqDJNC5TK@8Z_OUN*p
zyH?@QanMdZ=)E7QP_p0c-f!TouGm(XBH`>#Du`1J{N%RMHY(X$34B>N+NGjxkL-$b
zQt8EQF8Aq5OFOyLUj6{RSOs3#egZtO;^Ob{7j4yNLo_SlF~2Ezo=Z#iN>O@Kh#}1_
zF@oEcM|8;j5=auNj?YrulvHyaq}UQnoKDkWY)j`H`?&
z^TI=76c^=|kc+ignIug!)Ly@NrtcVZbf}j5YjG^NIFZUPyS(r7om9Uf6+oxvBX5;E
z_u$ZLIX8ri>h_`3skd3AX|-d@8`%h20!C{5WQXEjz;VyljYOfT%@-)~WYD#}U3;Aw
zWVcV&o~KW>c8mCC8&058i;*Bi@tl2fQzsoxiJnF~FUD)}k!qrL(ANvkA7E3>TA1*c
z9VRPc>haDJVU}j^>!}w0(*GvL)eSW@TYaTuv;VDQ2X+e
z-`_;lfT8;Opx661to+AsRaTr12{RvZzr}vt@{X*x!LUEWl1_7uFGA57%F+J2s7QB0
z?^YkGXYLl$oZ1`WKH^rV3=P}n{g_Sr$!7amT#DUDy+962CL}lRq*tOV3d(9;Sg|Gc
zicah6Erv~FC!JnL#r&vyJa?Ab-Ka2A6TZ4R?>@O!-(Ch*JXK}J7Pd+4`i4fZ+7giN
z6msF(a}DnMc1%)hX1##xk=iBe;%$X_GQB@zaYKim&4{@z&~Tk~e4<_OE<1VVX)dZa
zwu`L$Y`B{JY5(m=QbgB7dRkp=!nj2BbcP}10@y%6bw)KZ2k68S@
z^O$2%s5NQc8gt;h=}2`>sA`Glz=hMv>lD4)yLSVwyLgZTc@rH{K(NSo7-!xSkJeaDubmzpbM*iW_
zb22`9A4F!Z$+l;(1O3@SmP}TV2mm8PBceW$sBdIJCz@KC5-p91dWMFUhKA)<9m)SC
zh>Qvh3r_ssf`wqjGm+qA5}m=O`6qzUtf=6yh#-)i7##$LMYEXzaJKs6nyh4umyS-q
z+rS`Yjt0Q-G6qZ;1-yduMJ!wav`aVX354Sx(ZPX<@m|58KvjSoNGI1i833P^Fzhv3
R(@UZi0L9+buF=*n<3FChkOKe!
literal 0
HcmV?d00001
diff --git a/frontend/public/favicon/apple-touch-icon-144x144.png b/frontend/public/favicon/apple-touch-icon-144x144.png
new file mode 100644
index 0000000000000000000000000000000000000000..50d0937fafc259d36af197ee5e62bc7167122a2f
GIT binary patch
literal 1677
zcmV;826Fj{P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0002(
zP)t-s0U$0bor(l0H3KIz3Ohn5l!G9Ca}-)w0wpmQVqPknh$oVQ7-wPuAuk$iW*B5(
z9(ivlmW3&ph8%He|NsBZ)7B}Ohu7TR;N#_~v$*Q)?e6gL10pc-^79NqMhQ7U^Yr!g
z_V&om(GEvT0wXZ@`1l)dXbLDc9(HXIPEbZ&X9qJp{Qdn8OHBnWHxW@%hLxMRz{EFD
zTMa}=cZiS0%+CfTGWz=ZL0Dser*I~i(ZBZhe(d~zm`fYs6JL==+W$u$4~
z00(qQO+^Rg3mp$LA1%SLIsgC!I!Q!9RCwC$+ihRdFc1Ln1O#evC{PhWoWKMW5fKy>
z5yS_4{{A0F)~;P1E=?}EY