diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3366092 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +db +appdata +audio +video +subscriptions +users \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 79e05a2..94f04ca 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,5 +27,12 @@ If applicable, add screenshots to help explain your problem. - YoutubeDL-Material version - Docker tag: (optional) +Ideally you'd copy the info as presented on the "About" dialogue +in YoutubeDL-Material. +(for that, click on the three dots on the top right and then +check "installation details". On later versions of YoutubeDL- +Material you will find pretty much all the crucial information +here that we need in most cases!) + **Additional context** Add any other context about the problem here. For example, a YouTube link. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 54b21d0..50f4eb5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,10 +25,6 @@ jobs: cd backend npm install sudo npm install -g @angular/cli - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" @@ -43,7 +39,7 @@ jobs: json: '{"type": "autobuild", "tag": "N/A", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: build - run: ng build --prod + run: npm run build - name: prepare artifact upload shell: pwsh run: | diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml new file mode 100644 index 0000000..2fcf807 --- /dev/null +++ b/.github/workflows/docker-pr.yml @@ -0,0 +1,27 @@ +name: docker-pr + +on: + pull_request: + branches: [master] + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: Set hash + id: vars + run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + - name: Get current date + id: date + run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + - name: create-json + id: create-json + uses: jsdaniell/create-json@1.1.2 + with: + name: "version.json" + json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + dir: 'backend/' + - name: Build docker images + run: docker build . -t tzahi12345/youtubedl-material:nightly-pr \ No newline at end of file diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index aae7fb3..3063a97 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -13,10 +13,6 @@ jobs: steps: - name: checkout code uses: actions/checkout@v2 - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 9e0049b..6cd9cc6 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,6 +3,16 @@ name: docker on: push: branches: [master] + paths-ignore: + - '.github/**' + - '.vscode/**' + - 'chrome-extension/**' + - 'releases/**' + - '**/**.md' + - '**.crx' + - '**.pem' + - '.dockerignore' + - '.gitignore' jobs: build-and-push: @@ -10,10 +20,6 @@ jobs: steps: - name: checkout code uses: actions/checkout@v2 - - name: prepare localization - run: | - sudo npm install -g xliff-to-json - xliff-to-json ./src/assets/i18n - name: Set hash id: vars run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" @@ -25,7 +31,7 @@ jobs: uses: jsdaniell/create-json@1.1.2 with: name: "version.json" - json: '{"type": "docker", "tag": "nightly", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' + json: '{"type": "docker", "tag": "${{secrets.DOCKERHUB_MASTER_TAG}}", "commit": "${{ steps.vars.outputs.sha_short }}", "date": "${{ steps.date.outputs.date }}"}' dir: 'backend/' - name: setup platform emulator uses: docker/setup-qemu-action@v1 @@ -43,4 +49,8 @@ jobs: file: ./Dockerfile platforms: linux/amd64,linux/arm,linux/arm64/v8 push: true - tags: tzahi12345/youtubedl-material:nightly + # Defaults: + # DOCKERHUB_USERNAME : tzahi12345 + # DOCKERHUB_REPO : youtubedl-material + # DOCKERHUB_MASTER_TAG: nightly + tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.DOCKERHUB_REPO }}:${{secrets.DOCKERHUB_MASTER_TAG}} diff --git a/.gitignore b/.gitignore index 9d2ac87..5adce06 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ !.vscode/extensions.json # misc +/.angular/cache /.sass-cache /connect.lock /coverage @@ -65,4 +66,13 @@ backend/appdata/logs/error.log backend/appdata/users.json backend/users/* backend/appdata/cookies.txt -backend/public \ No newline at end of file +backend/public +src/assets/i18n/*.json + +# User Files +db/ +appdata/ +audio/ +video/ +subscriptions/ +users/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d2b9d75..73112d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,26 @@ -FROM alpine:latest as frontend +FROM ubuntu:22.04 AS ffmpeg -RUN apk add --no-cache \ - npm +ENV DEBIAN_FRONTEND=noninteractive -RUN npm install -g @angular/cli +COPY docker-build.sh . +RUN sh ./docker-build.sh + +#--------------# Stage 2 + +FROM ubuntu:22.04 as frontend + +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get -y install \ + curl \ + gnupg \ + # Ubuntu 22.04 ships Node.JS 12 by default :) + nodejs \ + # needed on 21.10 and before, maybe not on 22.04 YARN: brings along npm, solves dependency conflicts, + # spares us this spaghetti approach: https://stackoverflow.com/a/60547197 + npm && \ + apt-get install -f && \ + npm config set strict-ssl false && \ + npm install -g @angular/cli WORKDIR /build COPY [ "package.json", "package-lock.json", "/build/" ] @@ -11,38 +28,45 @@ RUN npm install COPY [ "angular.json", "tsconfig.json", "/build/" ] COPY [ "src/", "/build/src/" ] -RUN ng build --prod +RUN npm run build -#--------------# +#--------------# Final Stage -FROM alpine:latest +FROM ubuntu:22.04 ENV UID=1000 \ GID=1000 \ - USER=youtube + USER=youtube \ + NO_UPDATE_NOTIFIER=true -ENV NO_UPDATE_NOTIFIER=true -ENV FOREVER_ROOT=/app/.forever +ENV DEBIAN_FRONTEND=noninteractive -RUN addgroup -S $USER -g $GID && adduser -D -S $USER -G $USER -u $UID +RUN groupadd -g $GID $USER && useradd --system -g $USER --uid $UID $USER -RUN apk add --no-cache \ - ffmpeg \ +RUN apt-get update && apt-get -y install \ npm \ python2 \ python3 \ - su-exec \ - && apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ \ - atomicparsley + gosu \ + atomicparsley && \ + apt-get install -f && \ + apt-get autoremove --purge && \ + apt-get autoremove && \ + apt-get clean && \ + rm -rf /var/lib/apt WORKDIR /app +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffmpeg", "/usr/local/bin/ffmpeg" ] +COPY --chown=$UID:$GID --from=ffmpeg [ "/usr/local/bin/ffprobe", "/usr/local/bin/ffprobe" ] COPY --chown=$UID:$GID [ "backend/package.json", "backend/package-lock.json", "/app/" ] -RUN npm install forever -g -RUN npm install && chown -R $UID:$GID ./ +ENV PM2_HOME=/app/pm2 +RUN npm config set strict-ssl false && \ + npm install pm2 -g && \ + npm install && chown -R $UID:$GID ./ COPY --chown=$UID:$GID --from=frontend [ "/build/backend/public/", "/app/public/" ] COPY --chown=$UID:$GID [ "/backend/", "/app/" ] EXPOSE 17442 ENTRYPOINT [ "/app/entrypoint.sh" ] -CMD [ "forever", "app.js" ] +CMD [ "pm2-runtime", "pm2.config.js" ] diff --git a/Public API v1.yaml b/Public API v1.yaml index b57c386..b1bccb7 100644 --- a/Public API v1.yaml +++ b/Public API v1.yaml @@ -3,41 +3,20 @@ info: title: YoutubeDL-Material API Docs - Official version: '1.0' description: "Welcome to the official docs for YoutubeDL-Material.\n\n\nYou can check out all the available endpoints. Remember to authenticate with your API key using the \"apiKey\" query parameter with your requests.\n\n\nTo do so, simply add this to the end of your API call:\n\n\n`?apiKey=API_KEY`\n\n\nReplce API_KEY with the API key in the settings menu. If one doesn't exist, click generate to create one.\n\n### Multi-user mode\n\nWhen using multi-user mode, you will need to supply a JWT token to authenticate requests through that user. This lets the server know which user to run the task for, like downloading a video for a specific user. \n\nTo do this, you must use the `/api/auth/login` endpoint to login using a user's username and password. This will result in an object containing a `token`. Supply this along with your API key like so:\n\n`?apiKey=API_KEY&jwt=JWT_TOKEN`\n\nNotice the `&` between the `API_KEY` and `jwt`." + contact: + name: Isaac Abadi + url: https://github.com/Tzahi12345/YoutubeDL-Material + email: IsaacMGrynsztein@gmail.com servers: - url: 'http://localhost:17442' paths: - /api/tomp3: - post: - tags: - - downloader - summary: Download audio file - description: |- - Downloads an audio file with the given URL. Will include global args if they exist. - - - HTTP requests will return once the audio file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status. - operationId: post-tomp3 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/body' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200' - security: - - Auth query parameter: [] - /api/tomp4: + /api/downloadFile: post: tags: - downloader summary: Download video file description: |- - Downloads a video file with the given URL. Will include global args if they exist. + Downloads a file with the given URL. Will include global args if they exist. HTTP requests will return once the video file download completes. In the future, it will (by default) return once the download starts, and a separate API call will be used for checking the download status. @@ -46,14 +25,37 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_1' + $ref: '#/components/schemas/DownloadRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_1' + $ref: '#/components/schemas/DownloadResponse' + '500': + description: Server download error + security: + - Auth query parameter: [] + /api/generateArgs: + post: + tags: + - downloader + summary: Generates arguments used to download file + description: Generates args, used for checking what args would run if you ran downloadFile + operationId: post-generateArgs + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GenerateArgsResponse' security: - Auth query parameter: [] /api/getMp3s: @@ -69,8 +71,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_2' - requestBody: {} + $ref: '#/components/schemas/GetMp3sResponse' security: - Auth query parameter: [] /api/getMp4s: @@ -86,7 +87,23 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_3' + $ref: '#/components/schemas/GetMp4sResponse' + security: + - Auth query parameter: [] + /api/getAllFiles: + post: + tags: + - files + summary: Get all files + description: Gets all files and playlists stored in the db + operationId: get-getAllFiles + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllFilesResponse' security: - Auth query parameter: [] /api/getFile: @@ -100,14 +117,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_2' + $ref: '#/components/schemas/GetFileRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_4' + $ref: '#/components/schemas/GetFileResponse' + '401': + description: User is not authorized to view the file. security: - Auth query parameter: [] /api/enableSharing: @@ -122,14 +141,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_3' + $ref: '#/components/schemas/SharingToggle' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/disableSharing: @@ -144,14 +163,35 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_4' + $ref: '#/components/schemas/SharingToggle' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/incrementViewCount: + post: + summary: Increments a file's view count + tags: + - files + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IncrementViewCountRequest' + operationId: post-api-incrementViewCount + description: Increments a file's view count security: - Auth query parameter: [] /api/subscribe: @@ -165,14 +205,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_5' + $ref: '#/components/schemas/SubscribeRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_6' + $ref: '#/components/schemas/SubscribeResponse' security: - Auth query parameter: [] /api/unsubscribe: @@ -186,14 +226,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_6' + $ref: '#/components/schemas/UnsubscribeRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_7' + $ref: '#/components/schemas/UnsubscribeResponse' security: - Auth query parameter: [] /api/deleteSubscriptionFile: @@ -207,14 +247,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_7' + $ref: '#/components/schemas/DeleteSubscriptionFileRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_8' + $ref: '#/components/schemas/SuccessObject' '500': description: Internal Server Error security: @@ -230,14 +270,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_8' + $ref: '#/components/schemas/GetSubscriptionRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_9' + $ref: '#/components/schemas/GetSubscriptionResponse' security: - Auth query parameter: [] /api/downloadVideosForSubscription: @@ -251,14 +291,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_9' + $ref: '#/components/schemas/DownloadVideosForSubscriptionRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_10' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/getSubscriptions: @@ -278,7 +318,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_11' + $ref: '#/components/schemas/GetAllSubscriptionsResponse' security: - Auth query parameter: [] /api/createPlaylist: @@ -292,14 +332,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_10' + $ref: '#/components/schemas/CreatePlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_12' + $ref: '#/components/schemas/CreatePlaylistResponse' security: - Auth query parameter: [] /api/getPlaylist: @@ -313,35 +353,35 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_11' + $ref: '#/components/schemas/GetPlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_13' + $ref: '#/components/schemas/GetPlaylistResponse' security: - Auth query parameter: [] /api/updatePlaylist: post: tags: - playlists - summary: Update playlist files - description: Updates the list of filenames in the playlist object + summary: Update playlist + description: Updates the playlist object operationId: post-api-updatePlaylist requestBody: content: application/json: schema: - $ref: '#/components/schemas/body_12' + $ref: '#/components/schemas/UpdatePlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/deletePlaylist: @@ -355,14 +395,35 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_13' + $ref: '#/components/schemas/DeletePlaylistRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/addFileToPlaylist: + post: + tags: + - playlists + summary: Adds a file to a playlist + description: Adds a file to a playlist + operationId: post-api-addFileToPlaylist + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AddFileToPlaylistRequest' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/deleteMp4: @@ -376,7 +437,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_14' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK @@ -387,7 +448,7 @@ paths: description: Whether the operation succeeded security: - Auth query parameter: [] - /api/downloadFile: + /api/downloadFileFromServer: post: tags: - files @@ -397,32 +458,50 @@ paths: content: application/json: schema: - type: object - properties: {} - application/xml: - schema: - $ref: '#/components/schemas/body_15' + $ref: '#/components/schemas/DownloadFileRequest' responses: '200': description: 'The file itself is in the response, as well as an options object.' + '401': + description: User is not authorized to view the file. security: - Auth query parameter: [] /api/deleteFile: post: tags: - files - summary: Delete downloaded file (unused) + summary: Delete downloaded file operationId: post-api-deleteFile requestBody: content: application/json: schema: - $ref: '#/components/schemas/body_16' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK security: - Auth query parameter: [] + /api/deleteAllFiles: + post: + tags: + - files + summary: Delete all downloaded files + operationId: post-api-deleteAllFiles + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteMp3Mp4Request' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteAllFilesResponse' + security: + - Auth query parameter: [] /api/downloadArchive: post: tags: @@ -434,10 +513,12 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_17' + $ref: '#/components/schemas/DownloadArchiveRequest' responses: '200': description: The archive text file is sent as a response + '404': + description: If the archive dir is not found, 404 is sent as a response security: - Auth query parameter: [] /api/updaterStatus: @@ -453,7 +534,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_14' + $ref: '#/components/schemas/UpdaterStatus' security: - Auth query parameter: [] /api/updateServer: @@ -467,14 +548,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_18' + $ref: '#/components/schemas/UpdateServerRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' security: - Auth query parameter: [] /api/isPinSet: @@ -493,48 +574,6 @@ paths: $ref: '#/components/schemas/inline_response_200_15' security: - Auth query parameter: [] - /api/checkPin: - post: - tags: - - security - summary: Check if pin is correct - description: Checks the pin against an inputted one. Will return true if they match - operationId: post-api-checkPin - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/body_19' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_5' - security: - - Auth query parameter: [] - /api/setPin: - post: - tags: - - security - summary: Set pin - operationId: post-api-setPin - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/body_20' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/inline_response_200_5' - security: - - Auth query parameter: [] - description: '' /api/generateNewAPIKey: post: tags: @@ -548,7 +587,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_16' + $ref: '#/components/schemas/GenerateNewApiKeyResponse' security: - Auth query parameter: [] /api/deleteMp3: @@ -562,7 +601,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_21' + $ref: '#/components/schemas/DeleteMp3Mp4Request' responses: '200': description: OK @@ -585,7 +624,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_17' + $ref: '#/components/schemas/ConfigResponse' security: - Auth query parameter: [] /api/setConfig: @@ -597,18 +636,20 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/body_22' + $ref: '#/components/schemas/SetConfigRequest' responses: '200': description: OK content: application/json: schema: - $ref: '#/components/schemas/inline_response_200_5' + $ref: '#/components/schemas/SuccessObject' + '404': + description: Tried to save invalid config file. security: - Auth query parameter: [] /api/downloads: - get: + post: summary: Get info for all downloads tags: - downloader @@ -618,34 +659,13 @@ paths: content: application/json: schema: - type: object - properties: - downloads: - type: object - properties: - uid: - type: string - downloading: - type: boolean - complete: - type: boolean - url: - type: string - type: - type: string - percent_complete: - type: string - is_playlist: - type: boolean - timestamp_start: - type: number - timestamp_end: - type: number - fileNames: - type: array - items: - type: string - operationId: get-api-downloads + $ref: '#/components/schemas/GetAllDownloadsResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllDownloadsRequest' + operationId: post-api-downloads description: Retrieves all downloads recorded by the server and their status. security: - Auth query parameter: [] @@ -659,52 +679,374 @@ paths: content: application/json: schema: - type: object - properties: - download: - type: object - properties: - uid: - type: string - downloading: - type: boolean - complete: - type: boolean - url: - type: string - type: - type: string - percent_complete: - type: string - is_playlist: - type: boolean - timestamp_start: - type: number - timestamp_end: - type: number - fileNames: - type: array - items: - type: string + $ref: '#/components/schemas/GetDownloadResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Gets a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/pauseDownload: + post: + summary: Pauses one download + operationId: post-api-pause-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Pause a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/pauseAllDownloads: + post: + tags: + - downloader + summary: Pauses all downloads + operationId: post-api-pause-all-downloads requestBody: content: application/json: schema: type: object - properties: - session_id: - type: string - download_id: - type: string - required: - - session_id - - download_id + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/resumeDownload: + post: + summary: Resume one download + operationId: post-api-resume-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' description: '' - description: "Gets a single download using its download_id and session_id. session_id is the device fingerprint. If none was provided at the time of download, then set session_id is 'undeclared'." + description: "Resume a single download using its download_id." security: - Auth query parameter: [] tags: - downloader + /api/resumeAllDownloads: + post: + tags: + - downloader + summary: Resumes all downloads + operationId: post-api-resume-all-downloads + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/restartDownload: + post: + summary: Restart one download + operationId: post-api-restart-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Restart a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/cancelDownload: + post: + summary: Cancel one download + operationId: post-api-cancel-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Cancel a single download using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/clearDownload: + post: + summary: Clear one download + operationId: post-api-clear-download + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetDownloadRequest' + description: '' + description: "Clears a single download from the downloaded list using its download_id." + security: + - Auth query parameter: [] + tags: + - downloader + /api/clearFinishedDownloads: + post: + tags: + - downloader + summary: Clear finished downloads + operationId: post-api-clear-finished-downloads + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/getTask: + post: + summary: Get info for one task + operationId: post-api-get-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + description: '' + description: "Gets a single task using its key." + security: + - Auth query parameter: [] + tags: + - tasks + /api/getTasks: + post: + tags: + - tasks + summary: Get tasks + operationId: post-api-get-tasks + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllTasksResponse' + /api/resetTasks: + post: + tags: + - tasks + summary: Resets all tasks + operationId: post-api-reset-tasks + requestBody: + content: + application/json: + schema: + type: object + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + security: + - Auth query parameter: [] + /api/runTask: + post: + tags: + - tasks + summary: Runs one task + operationId: post-api-run-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/confirmTask: + post: + tags: + - tasks + summary: Confirms a task + operationId: post-api-confirm-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/cancelTask: + post: + tags: + - tasks + summary: Cancels a task + operationId: post-api-cancel-task + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetTaskRequest' + /api/updateTaskSchedule: + post: + tags: + - tasks + summary: Updates task schedule + operationId: post-api-update-task-schedule + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTaskScheduleRequest' + /api/updateTaskData: + post: + tags: + - tasks + summary: Updates task data + operationId: post-api-update-task-data + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateTaskDataRequest' + /api/getDBBackups: + post: + tags: + - tasks + summary: Get database backups + operationId: post-api-get-database-backups + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetDBBackupsResponse' + requestBody: + content: + application/json: + schema: + type: object + /api/restoreDBBackup: + post: + tags: + - tasks + summary: Restore database backup + operationId: post-api-restore-database-backup + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RestoreDBBackupRequest' /api/auth/login: post: summary: Login @@ -715,35 +1057,13 @@ paths: content: application/json: schema: - type: object - properties: - user: - $ref: '#/components/schemas/user' - token: - type: string - permissions: - type: array - items: - type: string - available_permissions: - type: array - items: - type: string + $ref: '#/components/schemas/LoginResponse' description: Use this method to log into a user using their username and password and receive a jwt auth token so you can send per-user requests. requestBody: content: application/json: schema: - type: object - properties: - userid: - type: string - description: 'This is the username, not the user uid' - password: - type: string - required: - - userid - - password + $ref: '#/components/schemas/LoginRequest' security: - Auth query parameter: [] tags: @@ -758,27 +1078,13 @@ paths: content: application/json: schema: - type: object - properties: - user: - $ref: '#/components/schemas/user' + $ref: '#/components/schemas/RegisterResponse' description: Use this endpoint to register a user. It will only work if registration is enabled. requestBody: content: application/json: schema: - type: object - properties: - userid: - type: string - username: - type: string - password: - type: string - required: - - userid - - username - - password + $ref: '#/components/schemas/RegisterRequest' security: - Auth query parameter: [] tags: @@ -790,21 +1096,15 @@ paths: responses: '200': description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' requestBody: content: application/json: schema: - type: object - properties: - change_object: - type: object - properties: - name: - type: string - role: - type: string - required: - - change_object + $ref: '#/components/schemas/UpdateUserRequest' description: Updates certain properties for a user. Only two are possible right now. security: - Auth query parameter: [] @@ -820,21 +1120,13 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' description: Deletes a user by its uid. requestBody: content: application/json: schema: - type: object - properties: - uid: - type: string - required: - - uid + $ref: '#/components/schemas/DeleteUserRequest' security: - Auth query parameter: [] tags: @@ -849,25 +1141,7 @@ paths: content: application/json: schema: - type: object - properties: - roles: - type: object - properties: - admin: - type: object - properties: - permissions: - type: array - items: - type: string - user: - type: object - properties: - permissions: - type: array - items: - type: string + $ref: '#/components/schemas/GetRolesResponse' description: Gets the available roles and their permissions security: - Auth query parameter: [] @@ -883,10 +1157,7 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' description: "Changes the permissions for a user. Available values for each permission are: `default`, `yes`, and `no`. `default` will use the user's role's default permission." security: - Auth query parameter: [] @@ -894,18 +1165,7 @@ paths: content: application/json: schema: - type: object - properties: - user_uid: - type: string - permission: - type: string - new_value: - type: string - required: - - user_uid - - permission - - new_value + $ref: '#/components/schemas/ChangeUserPermissionsRequest' tags: - multi-user mode /api/changeRolePermissions: @@ -918,26 +1178,12 @@ paths: content: application/json: schema: - type: object - properties: - success: - type: boolean + $ref: '#/components/schemas/SuccessObject' requestBody: content: application/json: schema: - type: object - properties: - role: - type: string - permission: - type: string - new_value: - type: string - required: - - role - - permission - - new_value + $ref: '#/components/schemas/ChangeRolePermissionsRequest' description: 'Changes the permissions for a role. Available values for each permission are: `yes`, and `no`.' security: - Auth query parameter: [] @@ -953,20 +1199,337 @@ paths: content: application/json: schema: - type: object - properties: - users: - type: array - items: - $ref: '#/components/schemas/user' + $ref: '#/components/schemas/GetUsersResponse' description: 'Gets all users, returns a list of the user objects including their user permissions, videos, playlists, subscriptions, etc.' security: - Auth query parameter: [] tags: - multi-user mode + /api/versionInfo: + get: + tags: + - server + summary: Gets server version info + operationId: get-api-versionInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/VersionInfoResponse' + security: + - Auth query parameter: [] + /api/getLogs: + post: + summary: Gets logs from server + tags: + - server + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetLogsResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetLogsRequest' + operationId: post-api-getLogs + description: Gets logs from server + security: + - Auth query parameter: [] + /api/clearAllLogs: + post: + summary: Clears the log file + tags: + - server + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + operationId: post-api-clearAllLogs + description: Clears the log file + security: + - Auth query parameter: [] + /api/getDBInfo: + get: + tags: + - db + summary: Gets information on the DB + operationId: get-api-getDBInfo + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DBInfoResponse' + security: + - Auth query parameter: [] + /api/transferDB: + post: + summary: Transfers DB between Local and MongoDB + tags: + - db + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TransferDBResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TransferDBRequest' + operationId: post-api-transferDB + description: Initiates a transfer between Local and MongoDB. Connection string must be set. + security: + - Auth query parameter: [] + /api/testConnectionString: + post: + summary: Tests a MongoDB connection string + tags: + - db + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestConnectionStringResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TestConnectionStringRequest' + operationId: post-api-testConnectionString + description: Tests a MongoDB connection string and returns an error if one exists. + security: + - Auth query parameter: [] + /api/getFullTwitchChat: + post: + summary: Gets the downloaded Twitch Chat (VODs only) + tags: + - twitch + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetFullTwitchChatResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/GetFullTwitchChatRequest' + operationId: post-api-getFullTwitchChat + description: Gets the downloaded Twitch Chat (VODs only) + security: + - Auth query parameter: [] + /api/downloadTwitchChatByVODID: + post: + summary: Downloads Twitch Chat for a VOD + tags: + - twitch + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadTwitchChatByVODIDResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DownloadTwitchChatByVODIDRequest' + operationId: post-api-downloadTwitchChatByVODID + description: Downloads Twitch Chat for a VOD + security: + - Auth query parameter: [] + /api/checkConcurrentStream: + post: + summary: Checks status of a concurrent stream + tags: + - player + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CheckConcurrentStreamResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CheckConcurrentStreamRequest' + operationId: post-api-checkConcurrentStream + description: Checks status of a concurrent stream + security: + - Auth query parameter: [] + /api/updateConcurrentStream: + post: + summary: Updates a concurrent stream + tags: + - player + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateConcurrentStreamResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateConcurrentStreamRequest' + operationId: post-api-updateConcurrentStream + description: Updates a concurrent stream + security: + - Auth query parameter: [] + /api/getAllCategories: + post: + summary: Gets all categories + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/GetAllCategoriesResponse' + operationId: post-api-getAllCategories + description: Gets all categories + security: + - Auth query parameter: [] + /api/createCategory: + post: + summary: Creates a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCategoryResponse' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateCategoryRequest' + operationId: post-api-createCategory + description: Creates a category + security: + - Auth query parameter: [] + /api/deleteCategory: + post: + summary: Deletes a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DeleteCategoryRequest' + operationId: post-api-deleteCategory + description: Deletes a category + security: + - Auth query parameter: [] + /api/updateCategory: + post: + summary: Updates a category + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCategoryRequest' + operationId: post-api-updateCategory + description: Updates a category + security: + - Auth query parameter: [] + /api/updateCategories: + post: + summary: Updates all categories + tags: + - categories + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessObject' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateCategoriesRequest' + operationId: post-api-updateCategories + description: Updates all categories + security: + - Auth query parameter: [] components: schemas: - body: + SuccessObject: + required: + - success + type: object + properties: + success: + type: boolean + FileType: + type: string + enum: + - audio + - video + CropFileSettings: + type: object + required: + - cropFileStart + - cropFileEnd + properties: + cropFileStart: + type: number + cropFileEnd: + type: number + Config: + required: + - YoutubeDLMaterial + type: object + properties: + YoutubeDLMaterial: + type: object + DownloadRequest: required: - url type: object @@ -975,64 +1538,129 @@ components: type: string customQualityConfiguration: type: string + description: Video format code. Overrides other quality options. example: '251' - maxBitrate: - type: string - example: '160' customArgs: type: string + description: Custom command-line arguments for youtube-dl. Overrides all other options, except url. + additionalArgs: + type: string + description: Additional command-line arguments for youtube-dl. Added to whatever args would normally be used. customOutput: type: string + description: Custom output filename template. youtubeUsername: type: string + description: Login with this account ID youtubePassword: type: string - inline_response_200: - required: - - audiopathEncoded - - uid - type: object - properties: - uid: - type: string - file_names: - type: string - audiopathEncoded: - type: string - body_1: - required: - - url - type: object - properties: - url: - type: string - customQualityConfiguration: - type: string - example: 242+251 + description: Account password selectedHeight: type: string + description: Height of the video, if known example: '1080' - customArgs: + maxBitrate: type: string - customOutput: - type: string - youtubeUsername: - type: string - youtubePassword: - type: string - inline_response_200_1: - required: - - uid - - videopathEncoded + description: Specify ffmpeg/avconv audio quality + example: '160' + type: + $ref: '#/components/schemas/FileType' + cropFileSettings: + $ref: '#/components/schemas/CropFileSettings' + DownloadResponse: type: object properties: - uid: + download: + $ref: '#/components/schemas/Download' + GenerateArgsResponse: + type: object + properties: + args: + type: array + items: + type: string + GetDownloadRequest: + type: object + properties: + download_uid: type: string - file_names: + required: + - download_uid + GetDownloadResponse: + type: object + properties: + download: + $ref: '#/components/schemas/Download' + GetAllDownloadsRequest: + type: object + properties: + uids: + type: array + items: + type: string + description: Filters downloads with the array + nullable: true + GetAllDownloadsResponse: + type: object + properties: + downloads: + type: array + items: + $ref: '#/components/schemas/Download' + GetTaskRequest: + type: object + properties: + task_key: type: string - videopathEncoded: + required: + - task_key + UpdateTaskScheduleRequest: + type: object + properties: + task_key: type: string - inline_response_200_2: + new_schedule: + $ref: '#/components/schemas/Schedule' + required: + - task_key + - new_schedule + UpdateTaskDataRequest: + type: object + properties: + task_key: + type: string + new_data: + type: object + required: + - task_key + - new_data + GetTaskResponse: + type: object + properties: + task: + $ref: '#/components/schemas/Task' + GetAllTasksResponse: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/Task' + GetDBBackupsResponse: + type: object + properties: + tasks: + type: array + items: + $ref: '#/components/schemas/DBBackup' + RestoreDBBackupRequest: + type: object + required: + - file_name + properties: + file_name: + type: string + GetMp3sResponse: required: - mp3s - playlists @@ -1041,81 +1669,78 @@ components: mp3s: type: array items: - $ref: '#/components/schemas/inline_response_200_2_mp3s' + $ref: '#/components/schemas/DatabaseFile' playlists: type: array description: All audio playlists items: - $ref: '#/components/schemas/inline_response_200_2_playlists' - inline_response_200_3: + $ref: '#/components/schemas/Playlist' + GetMp4sResponse: required: - mp4s + - playlists type: object properties: mp4s: type: array items: - $ref: '#/components/schemas/inline_response_200_3_mp4s' + $ref: '#/components/schemas/DatabaseFile' playlists: type: array description: All video playlists items: - type: object - body_2: + $ref: '#/components/schemas/Playlist' + GetAllFilesResponse: + required: + - files + - playlists + type: object + properties: + files: + type: array + items: + $ref: '#/components/schemas/DatabaseFile' + playlists: + type: array + description: All video playlists + items: + $ref: '#/components/schemas/Playlist' + GetFileRequest: required: - uid type: object properties: uid: type: string + description: Video UID type: + $ref: '#/components/schemas/FileType' + uuid: type: string - inline_response_200_4: + description: User UID + GetFileResponse: required: - - file - success type: object properties: success: - type: string + type: boolean file: - $ref: '#/components/schemas/inline_response_200_2_mp3s' - body_3: + $ref: '#/components/schemas/DatabaseFile' + SharingToggle: required: - - is_playlist - - type - uid type: object properties: uid: type: string - type: - type: string is_playlist: type: boolean - inline_response_200_5: - required: - - success - type: object - properties: - success: - type: boolean - body_4: - required: - - type - - uid - type: object - properties: - type: - type: string - uid: - type: string - description: uid is either the video uid or the playlist ID - is_playlist: - type: boolean - body_5: + SubscribeRequest: required: + - name - url + - streamingOnly type: object properties: name: @@ -1124,48 +1749,34 @@ components: type: string timerange: type: string - streamingOnly: + audioOnly: type: boolean - inline_response_200_6: + customArgs: + type: string + customFileOutput: + type: string + maxQuality: + type: string + SubscribeResponse: required: - new_sub type: object properties: new_sub: - $ref: '#/components/schemas/inline_response_200_6_new_sub' + $ref: '#/components/schemas/Subscription' error: type: string - apiunsubscribe_sub: - required: - - id - - name - - url - - videos - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - videos: - type: array - items: - type: object - body_6: + UnsubscribeRequest: required: - sub type: object properties: sub: - $ref: '#/components/schemas/apiunsubscribe_sub' + $ref: '#/components/schemas/SubscriptionRequestData' deleteMode: type: boolean description: Defaults to false - inline_response_200_7: + UnsubscribeResponse: required: - success type: object @@ -1174,30 +1785,16 @@ components: type: boolean error: type: string - apideleteSubscriptionFile_sub: - required: - - id - - isPlaylist - - name - - url - - videos + DeleteAllFilesResponse: type: object properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - videos: - type: array - items: - type: object - body_7: + file_count: + type: number + description: Number of files found matching search parameters + delete_count: + type: number + description: Number of files removed + DeleteSubscriptionFileRequest: required: - file - sub @@ -1205,50 +1802,44 @@ components: properties: file: type: string + file_uid: + type: string sub: - $ref: '#/components/schemas/apideleteSubscriptionFile_sub' + $ref: '#/components/schemas/SubscriptionRequestData' deleteForever: type: boolean description: 'If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings.' - inline_response_200_8: - type: object - properties: - success: - type: boolean - body_8: + GetSubscriptionRequest: required: - - subID + - id type: object properties: - subID: + id: type: string - inline_response_200_9: + description: Subscription ID + name: + type: string + description: Subscription name + GetSubscriptionResponse: required: - files - subscription type: object properties: subscription: - $ref: '#/components/schemas/inline_response_200_9_subscription' + $ref: '#/components/schemas/Subscription' files: type: array items: type: object - body_9: + DownloadVideosForSubscriptionRequest: required: - subID type: object properties: subID: type: string - inline_response_200_10: - required: - - success - type: object - properties: - success: - type: number - inline_response_200_11: + GetAllSubscriptionsResponse: required: - subscriptions type: object @@ -1256,10 +1847,10 @@ components: subscriptions: type: array items: - $ref: '#/components/schemas/inline_response_200_11_subscriptions' - body_10: + $ref: '#/components/schemas/Subscription' + CreatePlaylistRequest: required: - - fileNames + - uids - playlistName - thumbnailURL - type @@ -1267,35 +1858,38 @@ components: properties: playlistName: type: string - fileNames: + uids: type: array items: type: string type: - type: string + $ref: '#/components/schemas/FileType' thumbnailURL: type: string - inline_response_200_12: + CreatePlaylistResponse: required: - new_playlist - success type: object properties: new_playlist: - $ref: '#/components/schemas/inline_response_200_12_new_playlist' + $ref: '#/components/schemas/Playlist' success: type: boolean - body_11: + GetPlaylistRequest: required: - - playlistID - - type + - playlist_id type: object properties: - playlistID: + playlist_id: type: string type: + $ref: '#/components/schemas/FileType' + uuid: type: string - inline_response_200_13: + include_file_metadata: + type: boolean + GetPlaylistResponse: required: - playlist - success @@ -1303,93 +1897,70 @@ components: type: object properties: playlist: - $ref: '#/components/schemas/inline_response_200_2_playlists' + $ref: '#/components/schemas/Playlist' type: - type: string + $ref: '#/components/schemas/FileType' success: type: boolean - body_12: - required: - - fileNames - - playlistID - - type + GetPlaylistsRequest: type: object properties: - playlistID: - type: string - fileNames: + include_categories: + type: boolean + GetPlaylistsResponse: + required: + - playlists + type: object + properties: + playlists: type: array items: - type: string - type: - type: string - body_13: + $ref: '#/components/schemas/Playlist' + UpdatePlaylistRequest: required: - - playlistID + - playlist + type: object + properties: + playlist: + $ref: '#/components/schemas/Playlist' + DeletePlaylistRequest: + required: + - playlist_id - type type: object properties: - playlistID: + playlist_id: type: string type: - type: string - body_14: - required: - - uid + $ref: '#/components/schemas/FileType' + DownloadFileRequest: type: object properties: uid: type: string - body_15: - required: - - fileNames - - type - type: object - properties: - fileNames: - type: array - description: Array of 1 or more files to download - items: - type: string - zip_mode: - type: boolean - type: + uuid: type: string - outputName: + sub_id: type: string - fullPathProvided: + playlist_id: type: string - subscriptionName: - type: boolean - description: Only used for subscriptions - subscriptionPlaylist: - type: boolean - description: Only used for subscriptions - body_16: - required: - - fileName - - type - type: object - properties: - fileName: + url: type: string type: - type: string - apidownloadArchive_sub: - required: - - archive_dir - type: object - properties: - archive_dir: - type: string - body_17: + $ref: '#/components/schemas/FileType' + DownloadArchiveRequest: required: - sub type: object properties: sub: - $ref: '#/components/schemas/apidownloadArchive_sub' - inline_response_200_14: + required: + - archive_dir + type: object + properties: + archive_dir: + type: string + UpdaterStatus: required: - details - updating @@ -1399,11 +1970,271 @@ components: type: boolean details: type: string - body_18: + error: + type: boolean + UpdateServerRequest: + required: + - tag type: object properties: tag: type: string + DBInfoResponse: + required: + - db_info + type: object + properties: + using_local_db: + type: boolean + stats_by_table: + type: object + properties: + files: + $ref: '#/components/schemas/TableInfo' + playlists: + $ref: '#/components/schemas/TableInfo' + categories: + $ref: '#/components/schemas/TableInfo' + subscriptions: + $ref: '#/components/schemas/TableInfo' + users: + $ref: '#/components/schemas/TableInfo' + roles: + $ref: '#/components/schemas/TableInfo' + download_queue: + $ref: '#/components/schemas/TableInfo' + TransferDBResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + TransferDBRequest: + required: + - local_to_remote + type: object + properties: + local_to_remote: + description: True if transfering DB from Local to MongoDB, false if transferring DB from MongoDB to Local + type: boolean + TestConnectionStringResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + TestConnectionStringRequest: + required: + - connection_string + type: object + properties: + connection_string: + description: MongoDB connection string + type: string + GetFullTwitchChatResponse: + required: + - success + type: object + properties: + success: + type: boolean + error: + type: string + GetFullTwitchChatRequest: + required: + - id + - type + type: object + properties: + id: + description: File ID + type: string + type: + $ref: '#/components/schemas/FileType' + uuid: + description: User UID + type: string + sub: + $ref: '#/components/schemas/Subscription' + DownloadTwitchChatByVODIDResponse: + required: + - chat + type: object + properties: + chat: + type: array + items: + $ref: '#/components/schemas/TwitchChatMessage' + DownloadTwitchChatByVODIDRequest: + required: + - id + - type + - vodId + type: object + properties: + id: + description: File ID + type: string + vodId: + description: ID of the VOD + type: string + type: + $ref: '#/components/schemas/FileType' + uuid: + description: User UID + type: string + sub: + $ref: '#/components/schemas/Subscription' + CheckConcurrentStreamResponse: + required: + - stream + type: object + properties: + stream: + $ref: '#/components/schemas/ConcurrentStream' + CheckConcurrentStreamRequest: + required: + - uid + type: object + properties: + uid: + description: UID of the concurrent stream + type: string + UpdateConcurrentStreamResponse: + required: + - stream + type: object + properties: + stream: + $ref: '#/components/schemas/ConcurrentStream' + UpdateConcurrentStreamRequest: + allOf: + - $ref: '#/components/schemas/ConcurrentStream' + - type: object + properties: + uid: + type: string + description: Concurrent stream UID + required: + - uid + GetLogsResponse: + type: object + properties: + logs: + type: string + description: Number of lines to retrieve from the bottom + success: + type: boolean + GetLogsRequest: + required: + - connection_string + type: object + properties: + lines: + type: number + GetFileFormatsRequest: + type: object + properties: + url: + type: string + GetFileFormatsResponse: + required: + - result + - success + type: object + properties: + success: + type: boolean + result: + allOf: + - $ref: '#/components/schemas/file' + - type: object + properties: + formats: + type: array + items: + type: object + IncrementViewCountRequest: + required: + - file_uid + type: object + properties: + file_uid: + type: string + sub_id: + type: string + uuid: + type: string + description: User UID + AddFileToPlaylistRequest: + required: + - playlist_id + - file_uid + type: object + properties: + file_uid: + type: string + playlist_id: + type: string + GetAllCategoriesResponse: + required: + - categories + type: object + properties: + categories: + type: array + items: + $ref: '#/components/schemas/Category' + CreateCategoryResponse: + type: object + properties: + new_category: + $ref: '#/components/schemas/Category' + success: + type: boolean + CreateCategoryRequest: + required: + - name + type: object + properties: + name: + type: string + DeleteCategoryRequest: + required: + - category_uid + type: object + properties: + category_uid: + type: string + UpdateCategoryRequest: + required: + - category + type: object + properties: + category: + $ref: '#/components/schemas/Category' + UpdateCategoriesRequest: + required: + - categories + type: object + properties: + categories: + type: array + items: + $ref: '#/components/schemas/Category' + VersionInfoResponse: + required: + - version_info + type: object + properties: + version_info: + $ref: '#/components/schemas/Version' inline_response_200_15: required: - is_set @@ -1425,7 +2256,7 @@ components: properties: unhashed_pin: type: string - inline_response_200_16: + GenerateNewApiKeyResponse: required: - new_api_key type: object @@ -1433,31 +2264,33 @@ components: new_api_key: type: string example: 4241b401-7236-493e-92b5-b72696b9d853 - body_21: + DeleteMp3Mp4Request: required: - uid type: object properties: uid: type: string - inline_response_200_17: + blacklistMode: + type: boolean + ConfigResponse: required: - config_file - success type: object properties: config_file: - type: object + $ref: '#/components/schemas/Config' success: type: boolean - body_22: + SetConfigRequest: required: - new_config_file type: object properties: new_config_file: - type: object - inline_response_200_2_mp3s: + $ref: '#/components/schemas/Config' + DatabaseFile: required: - duration - id @@ -1497,17 +2330,20 @@ components: type: string sharingEnabled: type: boolean - inline_response_200_2_playlists: + Playlist: required: - - fileNames + - uids - id - name - thumbnailURL + - type + - registered + - duration type: object properties: name: type: string - fileNames: + uids: type: array items: type: string @@ -1515,125 +2351,191 @@ components: type: string thumbnailURL: type: string - inline_response_200_3_mp4s: - required: - - duration - - id - - isAudio - - path - - size - - thumbnailURL - - title - - uid - - upload_date - - uploader - - url - type: object - properties: - id: - type: string - title: - type: string - thumbnailURL: - type: string - isAudio: - type: boolean + type: + $ref: '#/components/schemas/FileType' + registered: + type: number duration: type: number - url: - type: string - uploader: - type: string - size: - type: number - path: - type: string - upload_date: + user_uid: type: string + Download: + required: + - url + - type + - title + - options + - uid + - step_index + - paused + - running + - finished_step + - percent_complete + - finished + - timestamp_start + type: object + properties: uid: type: string - sharingEnabled: - type: boolean - inline_response_200_6_new_sub: - required: - - id - - name - - url - type: object - properties: - name: + ui_uid: type: string + running: + type: boolean + finished: + type: boolean + paused: + type: boolean + finished_step: + type: boolean url: type: string - id: - type: string - streamingOnly: - type: boolean - timerange: - type: string - inline_response_200_9_subscription: - required: - - archive - - id - - isPlaylist - - name - - url - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - archive: - type: string - inline_response_200_11_subscriptions: - required: - - archive - - id - - isPlaylist - - name - - streamingOnly - - url - type: object - properties: - name: - type: string - url: - type: string - id: - type: string - streamingOnly: - type: boolean - isPlaylist: - type: boolean - archive: - type: string - inline_response_200_12_new_playlist: - required: - - fileNames - - id - - name - - thumbnailURL - - type - type: object - properties: - name: - type: string - fileNames: - type: string - id: - type: string - thumbnailURL: - type: string type: type: string - user: + title: + type: string + step_index: + type: number + percent_complete: + type: number + timestamp_start: + type: number + error: + type: string + description: Error text, set if download fails. + nullable: true + user_uid: + type: string + sub_id: + type: string + sub_name: + type: string + Task: + required: + - key + - last_ran + - last_confirmed + - running + - confirming + - data + - error + - schedule + type: object + properties: + key: + type: string + last_ran: + type: number + last_confirmed: + type: number + running: + type: boolean + confirming: + type: boolean + data: + type: object + error: + type: string + schedule: + type: object + Schedule: + required: + - type + - data + type: object + properties: + type: + type: string + enum: + - timestamp + - recurring + data: + type: object + properties: + dayOfWeek: + type: array + items: + type: number + hour: + type: number + minute: + type: number + timestamp: + type: number + DBBackup: + required: + - name + - timestamp + - size + - source + type: object + properties: + name: + type: string + timestamp: + type: number + size: + type: number + source: + type: string + enum: + - local + - remote + SubscriptionRequestData: + required: + - id + - name + type: object + properties: + name: + type: string + id: + type: string + type: + $ref: '#/components/schemas/FileType' + isPlaylist: + type: boolean + archive: + type: string + Subscription: + required: + - id + - name + - url + - type + - user_uid + - streamingOnly + - isPlaylist + - videos + type: object + properties: + name: + type: string + url: + type: string + id: + type: string + type: + $ref: '#/components/schemas/FileType' + user_uid: + type: string + nullable: true + streamingOnly: + type: boolean + isPlaylist: + type: boolean + archive: + type: string + timerange: + type: string + custom_args: + type: string + custom_output: + type: string + videos: + type: array + items: + type: object + User: title: user type: object properties: @@ -1668,7 +2570,7 @@ components: subscriptions: type: array items: - $ref: '#/components/schemas/inline_response_200_9_subscription' + $ref: '#/components/schemas/Subscription' created: type: number role: @@ -1676,17 +2578,233 @@ components: permissions: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' permission_overrides: type: array items: - type: string + $ref: '#/components/schemas/UserPermission' + UserPermission: + type: string + enum: + - filemanager + - settings + - subscriptions + - sharing + - advanced_download + - downloads_manager + YesNo: + type: string + enum: + - 'yes' + - 'no' + TableInfo: + type: object + properties: + records_count: + type: number + TwitchChatMessage: + type: object + properties: + created_at: + type: string + content_offset_seconds: + type: number + commenter: + type: object + properties: + name: + type: string + _id: + type: string + created_at: + type: string + message: + type: object + properties: + body: + type: string + user_color: + type: string + ConcurrentStream: + type: object + properties: + playback_timestamp: + type: number + unix_timestamp: + type: number + playing: + type: boolean + Category: + type: object + properties: + name: + type: string + uid: + type: string + rules: + type: array + items: + $ref: '#/components/schemas/CategoryRule' + custom_output: + type: string + description: Overrides file output for downloaded files in category + CategoryRule: + type: object + properties: + preceding_operator: + type: string + enum: + - 'or' + - 'and' + comparator: + type: string + enum: + - 'includes' + - 'not_includes' + - 'equals' + - 'not_equals' + Version: + type: object + properties: + type: + type: string + tag: + type: string + commit: + type: string + date: + type: string + BaseChangePermissionsRequest: + required: + - permission + - new_value + type: object + properties: + permission: + $ref: '#/components/schemas/UserPermission' + new_value: + $ref: '#/components/schemas/YesNo' + ChangeUserPermissionsRequest: + allOf: + - $ref: '#/components/schemas/BaseChangePermissionsRequest' + - type: object + properties: + user_uid: + type: string + required: + - user_uid + ChangeRolePermissionsRequest: + allOf: + - $ref: '#/components/schemas/BaseChangePermissionsRequest' + - type: object + properties: + role: + type: string + required: + - role file: title: file type: object properties: id: type: string + RegisterRequest: + required: + - userid + - username + - password + type: object + properties: + userid: + type: string + username: + type: string + password: + type: string + RegisterResponse: + type: object + properties: + user: + $ref: '#/components/schemas/User' + LoginRequest: + required: + - username + - password + type: object + properties: + username: + type: string + password: + type: string + LoginResponse: + type: object + properties: + user: + $ref: '#/components/schemas/User' + token: + type: string + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + available_permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + UpdateUserRequest: + required: + - change_object + type: object + properties: + change_object: + required: + - uid + type: object + properties: + uid: + type: string + name: + type: string + role: + type: string + DeleteUserRequest: + required: + - uid + type: object + properties: + uid: + type: string + GetUsersResponse: + required: + - users + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + GetRolesResponse: + required: + - roles + type: object + properties: + roles: + type: object + properties: + admin: + type: object + properties: + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' + user: + type: object + properties: + permissions: + type: array + items: + $ref: '#/components/schemas/UserPermission' securitySchemes: Auth query parameter: name: apiKey diff --git a/README.md b/README.md index b452bec..bf4c4f2 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,22 @@ [![GitHub issues badge](https://img.shields.io/github/issues/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/issues) [![License badge](https://img.shields.io/github/license/Tzahi12345/YoutubeDL-Material)](https://github.com/Tzahi12345/YoutubeDL-Material/blob/master/LICENSE.md) -YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 11](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. +YoutubeDL-Material is a Material Design frontend for [youtube-dl](https://rg3.github.io/youtube-dl/). It's coded using [Angular 13](https://angular.io/) for the frontend, and [Node.js](https://nodejs.org/) on the backend. Now with [Docker](#Docker) support! +
+ +### USAGE OF THE NIGHTLY BUILDS IS HIGHLY RECOMMENDED. + +For much better scaling with large datasets please run your YTDL-M instance with a MongoDB backend rather than the json file-based default. +It will fix a lot of performance problems (especially with datasets in the tens of thousands videos/audios)! +The (closed) issues as well as the project's Wiki will give you good starting points for your journey! + +For MongoDB specifically there is [this little guide](https://github.com/Tzahi12345/YoutubeDL-Material/wiki/Setting-a-MongoDB-backend-to-use-as-database-provider-for-YTDL-M). + +
+ ## Getting Started Check out the prerequisites, and go to the installation section. Easy as pie! @@ -67,7 +79,7 @@ If you'd like to install YoutubeDL-Material, go to the Installation section. If To deploy, simply clone the repository, and go into the `youtubedl-material` directory. Type `npm install` and all the dependencies will install. Then type `cd backend` and again type `npm install` to install the dependencies for the backend. -Once you do that, you're almost up and running. All you need to do is edit the configuration in `youtubedl-material/appdata`, go back into the `youtubedl-material` directory, and type `ng build --prod`. This will build the app, and put the output files in the `youtubedl-material/backend/public` folder. +Once you do that, you're almost up and running. All you need to do is edit the configuration in `youtubedl-material/appdata`, go back into the `youtubedl-material` directory, and type `npm build`. This will build the app, and put the output files in the `youtubedl-material/backend/public` folder. The frontend is now complete. The backend is much easier. Just go into the `backend` folder, and type `npm start`. @@ -110,6 +122,12 @@ To get started, go to the settings menu and enable the public API from the *Extr Once you have enabled the API and have the key, you can start sending requests by adding the query param `apiKey=API_KEY`. Replace `API_KEY` with your actual API key, and you should be good to go! Nearly all of the backend should be at your disposal. View available endpoints in the link above. +## iOS Shortcut + +If you are using iOS, try YoutubeDL-Material more conveniently with a Shortcut. With this Shorcut, you can easily start downloading YouTube video with just two taps! (Or maybe three?) + +You can download Shortcut [here.](https://routinehub.co/shortcut/10283/) + ## Contributing If you're interested in contributing, first: awesome! Second, please refer to the guidelines/setup information located in the [Contributing](https://github.com/Tzahi12345/YoutubeDL-Material/wiki/Contributing) wiki page, it's a helpful way to get you on your feet and coding away. @@ -134,6 +152,10 @@ See also the list of [contributors](https://github.com/Tzahi12345/YoutubeDL-Mate This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details +## Legal Disclaimer + +This project is in no way affiliated with Google LLC, Alphabet Inc. or YouTube (or their subsidiaries) nor endorsed by them. + ## Acknowledgments * youtube-dl diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..18daadb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Currently all work on this project goes into the nightly builds. +4.2's RELEASE build is now quite old and should be considered legacy. +We urge users to use the nightly releases, because the project +constantly sees fixes. + +| Version | Supported | +| ------------- | ------------------ | +| 4.2 Nightlies | :white_check_mark: | +| 4.2 Release | :x: | +| < 4.2 | :x: | + +## Reporting a Vulnerability + +Please file an issue in our GitHub's repo, because this app +isn't meant to be safe to run as public instance yet, but rather as a LAN facing app. + +We welcome PRs and help in general in making YTDL-M more secure, but it's not a priority as of now. diff --git a/angular.json b/angular.json index 46e84ea..613cfa8 100644 --- a/angular.json +++ b/angular.json @@ -17,7 +17,6 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "aot": true, "outputPath": "backend/public", "index": "src/index.html", "main": "src/main.ts", @@ -33,7 +32,17 @@ "styles": [ "src/styles.scss" ], - "scripts": [] + "scripts": [], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true, + "allowedCommonJsDependencies": [ + "rxjs", + "crypto-js" + ] }, "configurations": { "production": { @@ -46,7 +55,6 @@ "optimization": true, "outputHashing": "all", "namedChunks": false, - "aot": true, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, @@ -60,7 +68,8 @@ "es": { "localize": ["es"] } - } + }, + "defaultConfiguration": "" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", @@ -152,16 +161,6 @@ "src/backend" ] } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "src/tsconfig.app.json", - "src/tsconfig.spec.json" - ], - "exclude": [] - } } } }, @@ -176,15 +175,6 @@ "protractorConfig": "./protractor.conf.js", "devServerTarget": "youtube-dl-material:serve" } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "e2e/tsconfig.e2e.json" - ], - "exclude": [] - } } } } diff --git a/backend/app.js b/backend/app.js index 33363d9..2ec7f98 100644 --- a/backend/app.js +++ b/backend/app.js @@ -13,7 +13,6 @@ const unzipper = require('unzipper'); const db_api = require('./db'); const utils = require('./utils') const low = require('lowdb') -const ProgressBar = require('progress'); const fetch = require('node-fetch'); const URL = require('url').URL; const CONSTS = require('./consts') @@ -28,11 +27,11 @@ const youtubedl = require('youtube-dl'); const logger = require('./logger'); const config_api = require('./config.js'); const downloader_api = require('./downloader'); +const tasks_api = require('./tasks'); const subscriptions_api = require('./subscriptions'); const categories_api = require('./categories'); const twitch_api = require('./twitch'); - -const is_windows = process.platform === 'win32'; +const youtubedl_api = require('./youtube-dl'); var app = express(); @@ -60,9 +59,6 @@ const admin_token = '4241b401-7236-493e-92b5-b72696b9d853'; config_api.initialize(); db_api.initialize(db, users_db); auth_api.initialize(db_api); -downloader_api.initialize(db_api); -subscriptions_api.initialize(db_api, downloader_api); -categories_api.initialize(db_api); // Set some defaults db.defaults( @@ -359,34 +355,6 @@ async function downloadReleaseFiles(tag) { }); } -// helper function to download file using fetch -async function fetchFile(url, path, file_label) { - var len = null; - const res = await fetch(url); - - len = parseInt(res.headers.get("Content-Length"), 10); - - var bar = new ProgressBar(` Downloading ${file_label} [:bar] :percent :etas`, { - complete: '=', - incomplete: ' ', - width: 20, - total: len - }); - const fileStream = fs.createWriteStream(path); - await new Promise((resolve, reject) => { - res.body.pipe(fileStream); - res.body.on("error", (err) => { - reject(err); - }); - res.body.on('data', function (chunk) { - bar.tick(chunk.length); - }); - fileStream.on("finish", function() { - resolve(); - }); - }); - } - async function downloadReleaseZip(tag) { return new Promise(async resolve => { // get name of zip file, which depends on the version @@ -397,7 +365,7 @@ async function downloadReleaseZip(tag) { let output_path = path.join(__dirname, `youtubedl-material-release-${tag}.zip`); // download zip from release - await fetchFile(latest_zip_link, output_path, 'update ' + tag); + await utils.fetchFile(latest_zip_link, output_path, 'update ' + tag); resolve(true); }); @@ -568,8 +536,6 @@ async function loadConfig() { watchSubscriptionsInterval(); } - db_api.importUnregisteredFiles(); - // start the server here startServer(); @@ -710,156 +676,8 @@ async function getUrlInfos(url) { async function startYoutubeDL() { // auto update youtube-dl - await autoUpdateYoutubeDL(); -} - -// auto updates the underlying youtube-dl binary, not YoutubeDL-Material -async function autoUpdateYoutubeDL() { - const download_sources = { - 'youtube-dl': { - 'tags_url': 'https://api.github.com/repos/ytdl-org/youtube-dl/tags', - 'func': downloadLatestYoutubeDLBinary - }, - 'youtube-dlc': { - 'tags_url': 'https://api.github.com/repos/blackjack4494/yt-dlc/tags', - 'func': downloadLatestYoutubeDLCBinary - }, - 'yt-dlp': { - 'tags_url': 'https://api.github.com/repos/yt-dlp/yt-dlp/tags', - 'func': downloadLatestYoutubeDLPBinary - } - } - return new Promise(async resolve => { - const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); - const tags_url = download_sources[default_downloader]['tags_url']; - // get current version - let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); - if (!current_app_details_exists) { - logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); - } - let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); - let current_version = current_app_details['version']; - let current_downloader = current_app_details['downloader']; - let stored_binary_path = current_app_details['path']; - if (!stored_binary_path || typeof stored_binary_path !== 'string') { - // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${CONSTS.DETAILS_BIN_PATH}, attempting to guess actual path...`); - const guessed_base_path = 'node_modules/youtube-dl/bin/'; - const guessed_file_path = guessed_base_path + 'youtube-dl' + (is_windows ? '.exe' : ''); - if (fs.existsSync(guessed_file_path)) { - stored_binary_path = guessed_file_path; - // logger.info('INFO: Guess successful! Update process continuing...') - } else { - logger.error(`Guess '${guessed_file_path}' is not correct. Cancelling update check. Verify that your youtube-dl binaries exist by running npm install.`); - resolve(false); - return; - } - } - - // got version, now let's check the latest version from the youtube-dl API - - - fetch(tags_url, {method: 'Get'}) - .then(async res => res.json()) - .then(async (json) => { - // check if the versions are different - if (!json || !json[0]) { - logger.error(`Failed to check ${default_downloader} version for an update.`) - resolve(false); - return false; - } - const latest_update_version = json[0]['name']; - if (current_version !== latest_update_version || default_downloader !== current_downloader) { - // versions different or different downloader is being used, download new update - logger.info(`Found new update for ${default_downloader}. Updating binary...`); - try { - await checkExistsWithTimeout(stored_binary_path, 10000); - } catch(e) { - logger.error(`Failed to update ${default_downloader} - ${e}`); - } - - await download_sources[default_downloader]['func'](latest_update_version); - - resolve(true); - } else { - resolve(false); - } - }) - .catch(err => { - logger.error(`Failed to check ${default_downloader} version for an update.`) - logger.error(err); - resolve(false); - return false; - }); - }); -} - -async function downloadLatestYoutubeDLBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/ytdl-org/youtube-dl/releases/latest/download/youtube-dl${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `youtube-dl ${new_version}`); - - updateDetailsJSON(new_version, 'youtube-dl'); -} - -async function downloadLatestYoutubeDLCBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `youtube-dlc ${new_version}`); - - updateDetailsJSON(new_version, 'youtube-dlc'); -} - -async function downloadLatestYoutubeDLPBinary(new_version) { - const file_ext = is_windows ? '.exe' : ''; - - const download_url = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp${file_ext}`; - const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; - - await fetchFile(download_url, output_path, `yt-dlp ${new_version}`); - - updateDetailsJSON(new_version, 'yt-dlp'); -} - -function updateDetailsJSON(new_version, downloader) { - const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); - if (new_version) details_json['version'] = new_version; - details_json['downloader'] = downloader; - fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); -} - -async function checkExistsWithTimeout(filePath, timeout) { - return new Promise(function (resolve, reject) { - - var timer = setTimeout(function () { - if (watcher) watcher.close(); - reject(new Error('File did not exists and was not created during the timeout.')); - }, timeout); - - fs.access(filePath, fs.constants.R_OK, function (err) { - if (!err) { - clearTimeout(timer); - if (watcher) watcher.close(); - resolve(); - } - }); - - var dir = path.dirname(filePath); - var basename = path.basename(filePath); - var watcher = fs.watch(dir, function (eventType, filename) { - if (eventType === 'rename' && filename === basename) { - clearTimeout(timer); - if (watcher) watcher.close(); - resolve(); - } - }); - }); + const update_available = await youtubedl_api.checkForYoutubeDLUpdate(); + if (update_available) await youtubedl_api.updateYoutubeDL(update_available); } app.use(function(req, res, next) { @@ -950,7 +768,7 @@ app.post('/api/restartServer', optionalJwt, (req, res) => { res.send({success: true}); }); -app.post('/api/getDBInfo', optionalJwt, async (req, res) => { +app.get('/api/getDBInfo', optionalJwt, async (req, res) => { const db_info = await db_api.getDBStats(); res.send({db_info: db_info}); }); @@ -985,10 +803,11 @@ app.post('/api/testConnectionString', optionalJwt, async (req, res) => { app.post('/api/downloadFile', optionalJwt, async function(req, res) { req.setTimeout(0); // remove timeout in case of long videos const url = req.body.url; - const type = req.body.type; + const type = req.body.type ? req.body.type : 'video'; const user_uid = req.isAuthenticated() ? req.user.uid : null; - var options = { + const options = { customArgs: req.body.customArgs, + additionalArgs: req.body.additionalArgs, customOutput: req.body.customOutput, selectedHeight: req.body.selectedHeight, customQualityConfiguration: req.body.customQualityConfiguration, @@ -996,7 +815,7 @@ app.post('/api/downloadFile', optionalJwt, async function(req, res) { youtubePassword: req.body.youtubePassword, ui_uid: req.body.ui_uid, cropFileSettings: req.body.cropFileSettings - } + }; const download = await downloader_api.createDownload(url, type, options, user_uid); @@ -1012,6 +831,26 @@ app.post('/api/killAllDownloads', optionalJwt, async function(req, res) { res.send(result_obj); }); +app.post('/api/generateArgs', optionalJwt, async function(req, res) { + const url = req.body.url; + const type = req.body.type; + const user_uid = req.isAuthenticated() ? req.user.uid : null; + const options = { + customArgs: req.body.customArgs, + additionalArgs: req.body.additionalArgs, + customOutput: req.body.customOutput, + selectedHeight: req.body.selectedHeight, + customQualityConfiguration: req.body.customQualityConfiguration, + youtubeUsername: req.body.youtubeUsername, + youtubePassword: req.body.youtubePassword, + ui_uid: req.body.ui_uid, + cropFileSettings: req.body.cropFileSettings + }; + + const args = await downloader_api.generateArgs(url, type, options, user_uid, true); + res.send({args: args}); +}); + // gets all download mp3s app.get('/api/getMp3s', optionalJwt, async function(req, res) { // TODO: simplify @@ -1327,7 +1166,6 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => { let url = req.body.url; let maxQuality = req.body.maxQuality; let timerange = req.body.timerange; - let streamingOnly = req.body.streamingOnly; let audioOnly = req.body.audioOnly; let customArgs = req.body.customArgs; let customOutput = req.body.customFileOutput; @@ -1337,7 +1175,6 @@ app.post('/api/subscribe', optionalJwt, async (req, res) => { url: url, maxQuality: maxQuality, id: uuid(), - streamingOnly: streamingOnly, user_uid: user_uid, type: audioOnly ? 'audio' : 'video' }; @@ -1533,7 +1370,7 @@ app.post('/api/getPlaylists', optionalJwt, async (req, res) => { const uuid = req.isAuthenticated() ? req.user.uid : null; const include_categories = req.body.include_categories; - const playlists = await db_api.getRecords('playlists', {user_uid: uuid}); + let playlists = await db_api.getRecords('playlists', {user_uid: uuid}); if (include_categories) { const categories = await categories_api.getCategoriesAsPlaylists(files); if (categories) { @@ -1597,6 +1434,46 @@ app.post('/api/deleteFile', optionalJwt, async (req, res) => { res.send(wasDeleted); }); +app.post('/api/deleteAllFiles', optionalJwt, async (req, res) => { + const blacklistMode = false; + const uuid = req.isAuthenticated() ? req.user.uid : null; + + let files = null; + let text_search = req.body.text_search; + let file_type_filter = req.body.file_type_filter; + + const filter_obj = {user_uid: uuid}; + const regex = true; + if (text_search) { + if (regex) { + filter_obj['title'] = {$regex: `.*${text_search}.*`, $options: 'i'}; + } else { + filter_obj['$text'] = { $search: utils.createEdgeNGrams(text_search) }; + } + } + + if (file_type_filter === 'audio_only') filter_obj['isAudio'] = true; + else if (file_type_filter === 'video_only') filter_obj['isAudio'] = false; + + files = await db_api.getRecords('files', filter_obj); + + let file_count = await db_api.getRecords('files', filter_obj, true); + let delete_count = 0; + + for (let i = 0; i < files.length; i++) { + let wasDeleted = false; + wasDeleted = await db_api.deleteFile(files[i].uid, uuid, blacklistMode); + if (wasDeleted) { + delete_count++; + } + } + + res.send({ + file_count: file_count, + delete_count: delete_count + }); +}); + app.post('/api/downloadFileFromServer', optionalJwt, async (req, res) => { let uid = req.body.uid; let uuid = req.body.uuid; @@ -1619,18 +1496,14 @@ app.post('/api/downloadFileFromServer', optionalJwt, async (req, res) => { } // generate zip - file_path_to_download = await utils.createContainerZipFile(playlist, playlist_files_to_download); + file_path_to_download = await utils.createContainerZipFile(playlist['name'], playlist_files_to_download); } else if (sub_id && !uid) { zip_file_generated = true; - const sub_files_to_download = []; - const sub = subscriptions_api.getSubscription(sub_id, uuid); - for (let i = 0; i < sub['videos'].length; i++) { - const sub_file = sub['videos'][i]; - sub_files_to_download.push(sub_file); - } + const sub = await db_api.getRecord('subscriptions', {id: sub_id}); + const sub_files_to_download = await db_api.getRecords('files', {sub_id: sub_id}); // generate zip - file_path_to_download = await utils.createContainerZipFile(sub, sub_files_to_download); + file_path_to_download = await utils.createContainerZipFile(sub['name'], sub_files_to_download); } else { const file_obj = await db_api.getVideo(uid, uuid, sub_id) file_path_to_download = file_obj.path; @@ -1859,6 +1732,104 @@ app.post('/api/cancelDownload', optionalJwt, async (req, res) => { res.send({success: success}); }); +// tasks + +app.post('/api/getTasks', optionalJwt, async (req, res) => { + const tasks = await db_api.getRecords('tasks'); + for (let task of tasks) { + if (task['schedule']) task['next_invocation'] = tasks_api.TASKS[task['key']]['job'].nextInvocation().getTime(); + } + res.send({tasks: tasks}); +}); + +app.post('/api/resetTasks', optionalJwt, async (req, res) => { + const tasks_keys = Object.keys(tasks_api.TASKS); + for (let i = 0; i < tasks_keys.length; i++) { + const task_key = tasks_keys[i]; + tasks_api.TASKS[task_key]['job'] = null; + } + await db_api.removeAllRecords('tasks'); + await tasks_api.setupTasks(); + res.send({success: true}); +}); + +app.post('/api/getTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + if (task['schedule']) task['next_invocation'] = tasks_api.TASKS[task_key]['job'].nextInvocation().getTime(); + res.send({task: task}); +}); + +app.post('/api/runTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + + let success = true; + if (task['running'] || task['confirming']) success = false; + else await tasks_api.executeRun(task_key); + + res.send({success: success}); +}); + +app.post('/api/confirmTask', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const task = await db_api.getRecord('tasks', {key: task_key}); + + let success = true; + if (task['running'] || task['confirming'] || !task['data']) success = false; + else await tasks_api.executeConfirm(task_key); + + res.send({success: success}); +}); + +app.post('/api/updateTaskSchedule', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const new_schedule = req.body.new_schedule; + + await tasks_api.updateTaskSchedule(task_key, new_schedule); + + res.send({success: true}); +}); + +app.post('/api/updateTaskData', optionalJwt, async (req, res) => { + const task_key = req.body.task_key; + const new_data = req.body.new_data; + + const success = await db_api.updateRecord('tasks', {key: task_key}, {data: new_data}); + + res.send({success: success}); +}); + +app.post('/api/getDBBackups', optionalJwt, async (req, res) => { + const backup_dir = path.join('appdata', 'db_backup'); + const db_backups = []; + + const candidate_backups = await utils.recFindByExt(backup_dir, 'bak', null, [], false); + for (let i = 0; i < candidate_backups.length; i++) { + const candidate_backup = candidate_backups[i]; + + // must have specific format + if (candidate_backup.split('.').length - 1 !== 4) continue; + + const candidate_backup_path = candidate_backup; + const stats = fs.statSync(candidate_backup_path); + + db_backups.push({ name: path.basename(candidate_backup), timestamp: parseInt(candidate_backup.split('.')[2]), size: stats.size, source: candidate_backup.includes('local') ? 'local' : 'remote' }); + } + + db_backups.sort((a,b) => b.timestamp - a.timestamp); + + res.send({db_backups: db_backups}); +}); + +app.post('/api/restoreDBBackup', optionalJwt, async (req, res) => { + const file_name = req.body.file_name; + + const success = await db_api.restoreDB(file_name); + + res.send({success: success}); +}); + // logs management app.post('/api/logs', optionalJwt, async function(req, res) { diff --git a/backend/appdata/default.json b/backend/appdata/default.json index 04f76de..44f2f02 100644 --- a/backend/appdata/default.json +++ b/backend/appdata/default.json @@ -33,7 +33,8 @@ "use_twitch_API": false, "twitch_API_key": "", "twitch_auto_download_chat": false, - "use_sponsorblock_API": false + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", diff --git a/backend/authentication/auth.js b/backend/authentication/auth.js index 7aad070..7607c9b 100644 --- a/backend/authentication/auth.js +++ b/backend/authentication/auth.js @@ -1,6 +1,7 @@ const config_api = require('../config'); const consts = require('../consts'); const logger = require('../logger'); +const db_api = require('../db'); const jwt = require('jsonwebtoken'); const { uuid } = require('uuidv4'); @@ -12,18 +13,24 @@ var JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; // other required vars -let db_api = null; let SERVER_SECRET = null; let JWT_EXPIRATION = null; let opts = null; let saltRounds = null; -exports.initialize = function(db_api) { - setDB(db_api); - +exports.initialize = function () { /************************* * Authentication module ************************/ + + if (db_api.database_initialized) { + setupRoles(); + } else { + db_api.database_initialized_bs.subscribe(init => { + if (init) setupRoles(); + }); + } + saltRounds = 10; JWT_EXPIRATION = config_api.getConfigItem('ytdl_jwt_expiration'); @@ -51,8 +58,39 @@ exports.initialize = function(db_api) { })); } -function setDB(input_db_api) { - db_api = input_db_api; +const setupRoles = async () => { + const required_roles = { + admin: { + permissions: [ + 'filemanager', + 'settings', + 'subscriptions', + 'sharing', + 'advanced_download', + 'downloads_manager' + ] + }, + user: { + permissions: [ + 'filemanager', + 'subscriptions', + 'sharing' + ] + } + } + + const role_keys = Object.keys(required_roles); + for (let i = 0; i < role_keys.length; i++) { + const role_key = role_keys[i]; + const role_in_db = await db_api.getRecord('roles', {key: role_key}); + if (!role_in_db) { + // insert task metadata into table if missing + await db_api.insertRecordIntoTable('roles', { + key: role_key, + permissions: required_roles[role_key]['permissions'] + }); + } + } } exports.passport = require('passport'); diff --git a/backend/categories.js b/backend/categories.js index 269ae9c..2236d9f 100644 --- a/backend/categories.js +++ b/backend/categories.js @@ -1,14 +1,6 @@ const utils = require('./utils'); const logger = require('./logger'); - -var db_api = null; - -function setDB(input_db_api) { db_api = input_db_api } - -function initialize(input_db_api) { - setDB(input_db_api); -} - +const db_api = require('./db'); /* Categories: @@ -137,7 +129,6 @@ function applyCategoryRules(file_json, rules, category_name) { // } module.exports = { - initialize: initialize, categorize: categorize, getCategories: getCategories, getCategoriesAsPlaylists: getCategoriesAsPlaylists diff --git a/backend/config.js b/backend/config.js index e50c472..95e364c 100644 --- a/backend/config.js +++ b/backend/config.js @@ -208,7 +208,8 @@ const DEFAULT_CONFIG = { "use_twitch_API": false, "twitch_API_key": "", "twitch_auto_download_chat": false, - "use_sponsorblock_API": false + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", diff --git a/backend/consts.js b/backend/consts.js index 1f25021..849fa4c 100644 --- a/backend/consts.js +++ b/backend/consts.js @@ -114,6 +114,11 @@ exports.CONFIG_ITEMS = { 'key': 'ytdl_use_sponsorblock_api', 'path': 'YoutubeDLMaterial.API.use_sponsorblock_API' }, + 'ytdl_generate_nfo_files': { + 'key': 'ytdl_generate_nfo_files', + 'path': 'YoutubeDLMaterial.API.generate_NFO_files' + }, + // Themes 'ytdl_default_theme': { diff --git a/backend/db.js b/backend/db.js index a4c8080..64d2a64 100644 --- a/backend/db.js +++ b/backend/db.js @@ -54,6 +54,10 @@ const tables = { name: 'download_queue', primary_key: 'uid' }, + tasks: { + name: 'tasks', + primary_key: 'key' + }, test: { name: 'test' } @@ -81,6 +85,7 @@ exports.initialize = (input_db, input_users_db) => { } exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => { + using_local_db = config_api.getConfigItem('ytdl_use_local_db'); // verify if (using_local_db && !custom_connection_string) return; const success = await exports._connectToDB(custom_connection_string); if (success) return true; @@ -217,8 +222,7 @@ function generateFileObject(file_path, type) { var title = jsonobj.title; var url = jsonobj.webpage_url; var uploader = jsonobj.uploader; - var upload_date = jsonobj.upload_date; - upload_date = upload_date ? `${upload_date.substring(0, 4)}-${upload_date.substring(4, 6)}-${upload_date.substring(6, 8)}` : 'N/A'; + var upload_date = utils.formatDateString(jsonobj.upload_date); var size = stats.size; @@ -301,6 +305,7 @@ exports.getFileDirectoriesAndDBs = async () => { } exports.importUnregisteredFiles = async () => { + const imported_files = []; const dirs_to_check = await exports.getFileDirectoriesAndDBs(); // run through check list and check each file to see if it's missing from the db @@ -317,12 +322,17 @@ exports.importUnregisteredFiles = async () => { const file_is_registered = !!(files_with_same_url.find(file_with_same_url => path.resolve(file_with_same_url.path) === path.resolve(file.path))); if (!file_is_registered) { // add additional info - await exports.registerFileDB(file['path'], dir_to_check.type, dir_to_check.user_uid, null, dir_to_check.sub_id, null); - logger.verbose(`Added discovered file to the database: ${file.id}`); + const file_obj = await exports.registerFileDB(file['path'], dir_to_check.type, dir_to_check.user_uid, null, dir_to_check.sub_id, null); + if (file_obj) { + imported_files.push(file_obj['uid']); + logger.verbose(`Added discovered file to the database: ${file.id}`); + } else { + logger.error(`Failed to import ${file['path']} automatically.`); + } } } } - + return imported_files; } exports.addMetadataPropertyToDB = async (property_key) => { @@ -487,6 +497,7 @@ exports.deleteFile = async (uid, uuid = null, blacklistMode = false) => { let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { + const usersFileFolder = config_api.getConfigItem('ytdl_users_base_path'); const archive_path = uuid ? path.join(usersFileFolder, uuid, 'archives', `archive_${type}.txt`) : path.join('appdata', 'archives', `archive_${type}.txt`); // get ID from JSON @@ -745,6 +756,66 @@ exports.removeRecord = async (table, filter_obj) => { return !!(output['result']['ok']); } +// exports.removeRecordsByUIDBulk = async (table, uids) => { +// // local db override +// if (using_local_db) { +// applyFilterLocalDB(local_db.get(table), filter_obj, 'remove').write(); +// return true; +// } + +// const table_collection = database.collection(table); + +// let bulk = table_collection.initializeOrderedBulkOp(); // Initialize the Ordered Batch + +// const item_ids_to_remove = + +// for (let i = 0; i < item_ids_to_update.length; i++) { +// const item_id_to_update = item_ids_to_update[i]; +// bulk.find({[key_label]: item_id_to_update }).updateOne({ +// "$set": update_obj[item_id_to_update] +// }); +// } + +// const output = await bulk.execute(); +// return !!(output['result']['ok']); +// } + + +exports.findDuplicatesByKey = async (table, key) => { + let duplicates = []; + if (using_local_db) { + // this can probably be optimized + const all_records = await exports.getRecords(table); + const existing_records = {}; + for (let i = 0; i < all_records.length; i++) { + const record = all_records[i]; + const value = record[key]; + + if (existing_records[value]) { + duplicates.push(record); + } + + existing_records[value] = true; + } + return duplicates; + } + + const duplicated_values = await database.collection(table).aggregate([ + {"$group" : { "_id": `$${key}`, "count": { "$sum": 1 } } }, + {"$match": {"_id" :{ "$ne" : null } , "count" : {"$gt": 1} } }, + {"$project": {[key] : "$_id", "_id" : 0} } + ]).toArray(); + + for (let i = 0; i < duplicated_values.length; i++) { + const duplicated_value = duplicated_values[i]; + const duplicated_records = await exports.getRecords(table, duplicated_value, false); + if (duplicated_records.length > 1) { + duplicates = duplicates.concat(duplicated_records.slice(1, duplicated_records.length)); + } + } + return duplicates; +} + exports.removeAllRecords = async (table = null, filter_obj = null) => { // local db override const tables_to_remove = table ? [table] : tables_list; @@ -918,6 +989,52 @@ const createDownloadsRecords = (downloads) => { return new_downloads; } +exports.backupDB = async () => { + const backup_dir = path.join('appdata', 'db_backup'); + fs.ensureDirSync(backup_dir); + const backup_file_name = `${using_local_db ? 'local' : 'remote'}_db.json.${Date.now()/1000}.bak`; + const path_to_backups = path.join(backup_dir, backup_file_name); + + logger.verbose(`Backing up ${using_local_db ? 'local' : 'remote'} DB to ${path_to_backups}`); + + const table_to_records = {}; + for (let i = 0; i < tables_list.length; i++) { + const table = tables_list[i]; + table_to_records[table] = await exports.getRecords(table); + } + + fs.writeJsonSync(path_to_backups, table_to_records); + + return backup_file_name; +} + +exports.restoreDB = async (file_name) => { + const path_to_backup = path.join('appdata', 'db_backup', file_name); + + logger.debug('Reading database backup file.'); + const table_to_records = fs.readJSONSync(path_to_backup); + + if (!table_to_records) { + logger.error(`Failed to restore DB! Backup file '${path_to_backup}' could not be read.`); + return false; + } + + logger.debug('Clearing database.'); + await exports.removeAllRecords(); + + logger.debug('Database cleared! Beginning restore.'); + let success = true; + for (let i = 0; i < tables_list.length; i++) { + const table = tables_list[i]; + if (!table_to_records[table] || table_to_records[table].length === 0) continue; + success &= await exports.bulkInsertRecordsIntoTable(table, table_to_records[table]); + } + + logger.debug('Restore finished!'); + + return success; +} + exports.transferDB = async (local_to_remote) => { const table_to_records = {}; for (let i = 0; i < tables_list.length; i++) { @@ -927,9 +1044,8 @@ exports.transferDB = async (local_to_remote) => { using_local_db = !local_to_remote; if (local_to_remote) { - // backup local DB - logger.debug('Backup up Local DB...'); - await fs.copyFile('appdata/local_db.json', `appdata/local_db.json.${Date.now()/1000}.bak`); + logger.debug('Backup up DB...'); + await exports.backupDB(); const db_connected = await exports.connectToDB(5, true); if (!db_connected) { logger.error('Failed to transfer database - could not connect to MongoDB. Verify that your connection URL is valid.'); diff --git a/backend/downloader.js b/backend/downloader.js index 16aaaa8..108501b 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -3,7 +3,6 @@ const { uuid } = require('uuidv4'); const path = require('path'); const mergeFiles = require('merge-files'); const NodeID3 = require('node-id3') -const glob = require('glob') const Mutex = require('async-mutex').Mutex; const youtubedl = require('youtube-dl'); @@ -11,28 +10,22 @@ const youtubedl = require('youtube-dl'); const logger = require('./logger'); const config_api = require('./config'); const twitch_api = require('./twitch'); +const { create } = require('xmlbuilder2'); const categories_api = require('./categories'); const utils = require('./utils'); - -let db_api = null; +const db_api = require('./db'); const mutex = new Mutex(); let should_check_downloads = true; const archivePath = path.join(__dirname, 'appdata', 'archives'); -function setDB(input_db_api) { db_api = input_db_api } - -exports.initialize = (input_db_api) => { - setDB(input_db_api); - categories_api.initialize(db_api); - if (db_api.database_initialized) { - setupDownloads(); - } else { - db_api.database_initialized_bs.subscribe(init => { - if (init) setupDownloads(); - }); - } +if (db_api.database_initialized) { + setupDownloads(); +} else { + db_api.database_initialized_bs.subscribe(init => { + if (init) setupDownloads(); + }); } exports.createDownload = async (url, type, options, user_uid = null, sub_id = null, sub_name = null) => { @@ -278,7 +271,9 @@ async function downloadQueuedFile(download_uid) { } else if (output) { if (output.length === 0 || output[0].length === 0) { // ERROR! - logger.warn(`No output received for video download, check if it exists in your archive.`) + const error_message = `No output received for video download, check if it exists in your archive.`; + await handleDownloadError(download_uid, error_message); + logger.warn(error_message); resolve(false); return; } @@ -328,6 +323,10 @@ async function downloadQueuedFile(download_uid) { if (!success) logger.error('Failed to apply ID3 tag to audio file ' + output_json['_filename']); } + if (config_api.getConfigItem('ytdl_generate_nfo_files')) { + exports.generateNFOFile(output_json, `${filepath_no_extension}.nfo`); + } + if (options.cropFileSettings) { await utils.cropFile(full_file_path, options.cropFileSettings.cropFileStart, options.cropFileSettings.cropFileEnd, ext); } @@ -339,9 +338,10 @@ async function downloadQueuedFile(download_uid) { } if (options.merged_string !== null && options.merged_string !== undefined) { - let current_merged_archive = fs.readFileSync(path.join(fileFolderPath, `merged_${type}.txt`), 'utf8'); - let diff = current_merged_archive.replace(options.merged_string, ''); - const archive_path = download['user_uid'] ? path.join(fileFolderPath, 'archives', `archive_${type}.txt`) : path.join(archivePath, `archive_${type}.txt`); + const archive_folder = getArchiveFolder(fileFolderPath, options, download['user_uid']); + const current_merged_archive = fs.readFileSync(path.join(archive_folder, `merged_${type}.txt`), 'utf8'); + const diff = current_merged_archive.replace(options.merged_string, ''); + const archive_path = path.join(archive_folder, `archive_${type}.txt`); fs.appendFileSync(archive_path, diff); } @@ -369,7 +369,7 @@ async function downloadQueuedFile(download_uid) { // helper functions -exports.generateArgs = async (url, type, options, user_uid = null) => { +exports.generateArgs = async (url, type, options, user_uid = null, simulated = false) => { const audioFolderPath = config_api.getConfigItem('ytdl_audio_folder_path'); const videoFolderPath = config_api.getConfigItem('ytdl_video_folder_path'); @@ -409,7 +409,7 @@ exports.generateArgs = async (url, type, options, user_uid = null) => { downloadConfig = customArgs.split(',,'); } else { if (customQualityConfiguration) { - qualityPath = ['-f', customQualityConfiguration]; + qualityPath = ['-f', customQualityConfiguration, '--merge-output-format', 'mp4']; } else if (selectedHeight && selectedHeight !== '' && !is_audio) { qualityPath = ['-f', `'(mp4)[height=${selectedHeight}'`]; } else if (is_audio) { @@ -450,23 +450,16 @@ exports.generateArgs = async (url, type, options, user_uid = null) => { let useYoutubeDLArchive = config_api.getConfigItem('ytdl_use_youtubedl_archive'); if (useYoutubeDLArchive) { - let archive_folder = null; - if (options.customArchivePath) { - archive_folder = path.join(options.customArchivePath); - } else if (user_uid) { - archive_folder = path.join(fileFolderPath, 'archives'); - } else { - archive_folder = path.join(archivePath); - } + const archive_folder = getArchiveFolder(fileFolderPath, options, user_uid); const archive_path = path.join(archive_folder, `archive_${type}.txt`); await fs.ensureDir(archive_folder); await fs.ensureFile(archive_path); - let blacklist_path = path.join(archive_folder, `blacklist_${type}.txt`); + const blacklist_path = path.join(archive_folder, `blacklist_${type}.txt`); await fs.ensureFile(blacklist_path); - let merged_path = path.join(fileFolderPath, `merged_${type}.txt`); + const merged_path = path.join(archive_folder, `merged_${type}.txt`); await fs.ensureFile(merged_path); // merges blacklist and regular archive let inputPathList = [archive_path, blacklist_path]; @@ -510,7 +503,7 @@ exports.generateArgs = async (url, type, options, user_uid = null) => { // filter out incompatible args downloadConfig = filterArgs(downloadConfig, is_audio); - logger.verbose(`youtube-dl args being used: ${downloadConfig.join(',')}`); + if (!simulated) logger.verbose(`youtube-dl args being used: ${downloadConfig.join(',')}`); return downloadConfig; } @@ -589,18 +582,49 @@ async function checkDownloadPercent(download_uid) { if (!resulting_file_size) return; let sum_size = 0; - glob(`{${files_to_check_for_progress.join(',')}, }*`, async (err, files) => { - files.forEach(async file => { - try { - const file_stats = fs.statSync(file); - if (file_stats && file_stats.size) { - sum_size += file_stats.size; - } - } catch (e) { - + for (let i = 0; i < files_to_check_for_progress.length; i++) { + const file_to_check_for_progress = files_to_check_for_progress[i]; + const dir = path.dirname(file_to_check_for_progress); + if (!fs.existsSync(dir)) continue; + fs.readdir(dir, async (err, files) => { + for (let j = 0; j < files.length; j++) { + const file = files[j]; + if (!file.includes(path.basename(file_to_check_for_progress))) continue; + try { + const file_stats = fs.statSync(path.join(dir, file)); + if (file_stats && file_stats.size) { + sum_size += file_stats.size; + } + } catch (e) {} } + + const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2); + await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete}); }); - const percent_complete = (sum_size/resulting_file_size * 100).toFixed(2); - await db_api.updateRecord('download_queue', {uid: download_uid}, {percent_complete: percent_complete}); - }); + } +} + +exports.generateNFOFile = (info, output_path) => { + const nfo_obj = { + episodedetails: { + title: info['fulltitle'], + episode: info['playlist_index'] ? info['playlist_index'] : undefined, + premiered: utils.formatDateString(info['upload_date']), + plot: `${info['uploader_url']}\n${info['description']}\n${info['playlist_title'] ? info['playlist_title'] : ''}`, + director: info['artist'] ? info['artist'] : info['uploader'] + } + }; + const doc = create(nfo_obj); + const xml = doc.end({ prettyPrint: true }); + fs.writeFileSync(output_path, xml); +} + +function getArchiveFolder(fileFolderPath, options, user_uid) { + if (options.customArchivePath) { + return path.join(options.customArchivePath); + } else if (user_uid) { + return path.join(fileFolderPath, 'archives'); + } else { + return path.join(archivePath); + } } \ No newline at end of file diff --git a/backend/ecosystem.config.js b/backend/ecosystem.config.js new file mode 100644 index 0000000..70b6e9d --- /dev/null +++ b/backend/ecosystem.config.js @@ -0,0 +1,8 @@ +module.exports = { + apps : [{ + name : "YoutubeDL-Material", + script : "./app.js", + watch : "placeholder", + watch_delay: 5000 + }] +} diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index 611bcc8..59ffdb6 100755 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/sh set -eu -CMD="forever app.js" +CMD="pm2-runtime pm2.config.js" # if the first arg starts with "-" pass it to program if [ "${1#-}" != "$1" ]; then @@ -11,7 +11,7 @@ fi # chown current working directory to current user if [ "$*" = "$CMD" ] && [ "$(id -u)" = "0" ]; then find . \! -user "$UID" -exec chown "$UID:$GID" -R '{}' + || echo "WARNING! Could not change directory ownership. If you manage permissions externally this is fine, otherwise you may experience issues when downloading or deleting videos." - exec su-exec "$UID:$GID" "$0" "$@" + exec gosu "$UID:$GID" "$0" "$@" fi exec "$@" diff --git a/backend/fix-scripts/001-fix_download_permissions.sh b/backend/fix-scripts/001-fix_download_permissions.sh new file mode 100644 index 0000000..cd6cc42 --- /dev/null +++ b/backend/fix-scripts/001-fix_download_permissions.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +# INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M +# Date: 2022-05-03 + +# If you want to run this script on a bare-metal installation instead of within Docker +# make sure that the paths configured below match your paths! (it's wise to use the full paths) +# USAGE: within your container's bash shell: +# chmod -R +x ./fix-scripts/ +# ./fix-scripts/001-fix_download_permissions.sh + +# User defines / Docker env defaults +PATH_SUBS=/app/subscriptions +PATH_AUDIO=/app/audio +PATH_VIDS=/app/video + +clear -x +echo "\n" +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "Welcome to the INTERACTIVE PERMISSIONS FIX SCRIPT FOR YTDL-M." +echo "This script will set YTDL-M's download paths' owner to ${USER} (${UID}:${GID})" +echo "and permissions to the default of 644." +printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - # horizontal line +echo "\n" + +# check whether dirs exist +i=0 +[ -d $PATH_SUBS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Subscriptions directory at ${PATH_SUBS}" +[ -d $PATH_AUDIO ] && i=$((i+1)) && echo "✔ (${i}/3) Found Audio directory at ${PATH_AUDIO}" +[ -d $PATH_VIDS ] && i=$((i+1)) && echo "✔ (${i}/3) Found Video directory at ${PATH_VIDS}" + +# Ask to proceed or cancel, exit on missing paths +case $i in + 0) + echo "\nCouldn't find any download path to fix permissions for! \nPlease edit this script to configure!" + exit 2;; + 3) + echo "\nFound all download paths to fix permissions for. \nProceed? (Y/N)";; + *) + echo "\nOnly found ${i} out of 3 download paths! Something about this script's config must be wrong. \nProceed anyways? (Y/N)";; +esac +old_stty_cfg=$(stty -g) +stty raw -echo ; answer=$(head -c 1) ; stty $old_stty_cfg # Careful playing with stty +if echo "$answer" | grep -iq "^y" ;then + echo "\n Running jobs now... (this may take a while)\n" + [ -d $PATH_SUBS ] && chown "$UID:$GID" -R $PATH_SUBS && echo "✔ Set owner of ${PATH_SUBS} to ${USER}." + [ -d $PATH_SUBS ] && chmod 644 -R $PATH_SUBS && echo "✔ Set permissions of ${PATH_SUBS} to 644." + [ -d $PATH_AUDIO ] && chown "$UID:$GID" -R $PATH_AUDIO && echo "✔ Set owner of ${PATH_AUDIO} to ${USER}." + [ -d $PATH_AUDIO ] && chmod 644 -R $PATH_AUDIO && echo "✔ Set permissions of ${PATH_AUDIO} to 644." + [ -d $PATH_VIDS ] && chown "$UID:$GID" -R $PATH_VIDS && echo "✔ Set owner of ${PATH_VIDS} to ${USER}." + [ -d $PATH_VIDS ] && chmod 644 -R $PATH_VIDS && echo "✔ Set permissions of ${PATH_VIDS} to 644." + echo "\n✔ Done." + echo "\n If you noticed file access errors those MAY be due to currently running downloads." + echo " Feel free to re-run this script, however download parts should have correct file permissions anyhow. :)" + exit +else + echo "\nOkay, bye." +fi diff --git a/backend/package-lock.json b/backend/package-lock.json index fbade26..421898c 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -4,6 +4,53 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "requires": { + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==" + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -17,89 +64,19 @@ "defer-to-connect": "^1.0.1" } }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.7", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.7.tgz", - "integrity": "sha512-dCOT5lcmV/uC2J9k0rPafATeeyz+99xTt54ReX11/LObZgfzJqZNcW27zGhYyX+9iSEGXGt5qLPwRSvBZcLvtQ==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.9", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.9.tgz", - "integrity": "sha512-DG0BYg6yO+ePW+XoDENYz8zhNGC3jDDEpComMYn7WJc4mY1Us8Rw9ax2YhJXxpyk2SF47PQAoQ0YyVT1a0bEkA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, "@types/ldapjs": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-1.0.9.tgz", - "integrity": "sha512-3PvY7Drp1zoLbcGlothCAkoc5o6Jp9KvUPwHadlHyKp3yPvyeIh7w2zQc9UXMzgDRkoeGXUEODtbEs5XCh9ZyA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@types/ldapjs/-/ldapjs-2.2.2.tgz", + "integrity": "sha512-U5HdnwIZ5uZa+f3usxdqgyfNmOROxOxXvQdQtsu6sKo8fte5vej9br2csHxPvXreAbAO1bs8/rdEzvCLpi67nQ==", "requires": { "@types/node": "*" } }, - "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" - }, "@types/node": { "version": "14.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.0.tgz", "integrity": "sha512-mikldZQitV94akrc4sCcSjtJfsTKt4p+e/s0AGscVA6XArQ9kFclP+ZiYUMnq987rc6QlYxXv/EivqlfSLxpKA==" }, - "@types/passport": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.4.tgz", - "integrity": "sha512-h5OfAbfBBYSzjeU0GTuuqYEk9McTgWeGQql9g3gUw2/NNCfD7VgExVRYJVVeU13Twn202Mvk9BT0bUrl30sEgA==", - "requires": { - "@types/express": "*" - } - }, - "@types/qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-+wYo+L6ZF6BMoEjtf8zB2esQsqdV6WsjRK/GP9WOgLPrq87PbNWgIxS76dS5uvl/QXtHGakZmwTznIfcPXcKlQ==" - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" - }, - "@types/serve-static": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.5.tgz", - "integrity": "sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ==", - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -110,6 +87,11 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -120,9 +102,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -156,9 +138,9 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -203,27 +185,17 @@ "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, "archiver": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", - "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", "requires": { "archiver-utils": "^2.1.0", - "async": "^2.6.3", + "async": "^3.2.3", "buffer-crc32": "^0.2.1", - "glob": "^7.1.4", - "readable-stream": "^3.4.0", - "tar-stream": "^2.1.0", - "zip-stream": "^2.1.2" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - } + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" } }, "archiver-utils": { @@ -283,9 +255,9 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" }, "async-mutex": { "version": "0.3.1", @@ -316,11 +288,11 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.2.tgz", + "integrity": "sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==", "requires": { - "follow-redirects": "^1.10.0" + "follow-redirects": "^1.14.0" } }, "backoff": { @@ -337,9 +309,9 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -389,26 +361,26 @@ "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -455,12 +427,12 @@ "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" }, "buffer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", - "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { @@ -488,17 +460,6 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, - "bunyan": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.14.tgz", - "integrity": "sha512-LlahJUxXzZLuw/hetUQJmRgZ1LF6+cr5TPpRj6jf327AsiIq2jhYEH4oqUUkVKTor+9w2BT3oxVwhzE5lw9tcg==", - "requires": { - "dtrace-provider": "~0.8", - "moment": "^2.19.3", - "mv": "~2", - "safe-json-stringify": "~1" - } - }, "busboy": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", @@ -557,6 +518,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -639,17 +609,12 @@ "wrap-ansi": "^7.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -663,12 +628,12 @@ } }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -685,30 +650,20 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colornames": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", - "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -721,30 +676,14 @@ } }, "compress-commons": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", - "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", "requires": { "buffer-crc32": "^0.2.13", - "crc32-stream": "^3.0.1", + "crc32-stream": "^4.0.2", "normalize-path": "^3.0.0", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "readable-stream": "^3.6.0" } }, "compressible": { @@ -828,11 +767,18 @@ "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "content-type": { @@ -841,9 +787,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", @@ -855,23 +801,29 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "requires": { - "buffer": "^5.1.0" - } + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" }, "crc32-stream": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", - "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", "requires": { - "crc": "^3.4.4", + "crc-32": "^1.2.0", "readable-stream": "^3.4.0" } }, + "cron-parser": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-3.5.0.tgz", + "integrity": "sha512-wyVZtbRs6qDfFd8ap457w3XVntdvqcwBGxBoTvJQH9KGVKL/fB+h2k3C8AqiVxvUQKN1Ps/Ns46CNViOpVDhfQ==", + "requires": { + "is-nan": "^1.3.2", + "luxon": "^1.26.0" + } + }, "cross-spawn": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", @@ -931,15 +883,24 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depd": { "version": "1.1.2", @@ -951,16 +912,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "diagnostics": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", - "requires": { - "colorspace": "1.1.x", - "enabled": "1.0.x", - "kuler": "1.0.x" - } - }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -1006,15 +957,6 @@ "is-obj": "^2.0.0" } }, - "dtrace-provider": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", - "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==", - "optional": true, - "requires": { - "nan": "^2.14.0" - } - }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -1072,12 +1014,9 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "enabled": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", - "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", - "requires": { - "env-variable": "0.0.x" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "encodeurl": { "version": "1.0.2", @@ -1092,11 +1031,6 @@ "once": "^1.4.0" } }, - "env-variable": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", - "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1117,16 +1051,16 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "exe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/exe/-/exe-1.0.2.tgz", - "integrity": "sha1-9iUYQLKJ1kJe5fpotZ7hUYH6pC8=" - }, "execa": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/execa/-/execa-3.2.0.tgz", @@ -1145,16 +1079,16 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -1168,17 +1102,51 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, "extend": { @@ -1201,15 +1169,10 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", - "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "fill-range": { "version": "7.0.1", @@ -1266,10 +1229,15 @@ } } }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "forever-agent": { "version": "0.6.1", @@ -1287,9 +1255,9 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fresh": { "version": "0.5.2", @@ -1334,11 +1302,26 @@ "rimraf": "2" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", @@ -1436,11 +1419,32 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -1473,22 +1477,15 @@ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "toidentifier": "1.0.1" } }, "http-signature": { @@ -1515,9 +1512,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore-by-default": { "version": "1.0.1", @@ -1611,6 +1608,15 @@ "is-path-inside": "^3.0.1" } }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -1651,6 +1657,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, "is-yarn-global": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", @@ -1672,9 +1683,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { "argparse": "^2.0.1" } @@ -1689,11 +1700,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -1746,14 +1752,21 @@ } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + } } }, "jwa": { @@ -1784,12 +1797,9 @@ } }, "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "latest-version": { "version": "5.1.0", @@ -1800,9 +1810,9 @@ } }, "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "requires": { "readable-stream": "^2.0.5" }, @@ -1824,69 +1834,37 @@ } }, "ldap-filter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.2.2.tgz", - "integrity": "sha1-8rhCvguG2jNSeYUFsx68rlkNd9A=", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/ldap-filter/-/ldap-filter-0.3.3.tgz", + "integrity": "sha1-KxTGiiqdQQTb28kQocqF/Riel5c=", "requires": { - "assert-plus": "0.1.5" - }, - "dependencies": { - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" - } + "assert-plus": "^1.0.0" } }, "ldapauth-fork": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-4.3.3.tgz", - "integrity": "sha512-x76VpQ5ZqkwAJmqwcD6KIwDiNEbgIGIPGwC/eA17e1dxWhlTx36w0DlLOFwjTuZ2iuaLTsZsUprlVqvSlwc/1Q==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/ldapauth-fork/-/ldapauth-fork-5.0.2.tgz", + "integrity": "sha512-fWrrBwJ162rzQIIqfPsfCHy/861kEalQNIu16gmwOMr5cmdfjNkw7XfTlzCTJHybnFg9oW9WaX4DGXa0xiGPmA==", "requires": { - "@types/ldapjs": "^1.0.0", - "@types/node": "*", + "@types/ldapjs": "^2.2.2", "bcryptjs": "^2.4.0", - "ldapjs": "^1.0.2", - "lru-cache": "^5.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } + "ldapjs": "^2.2.1", + "lru-cache": "^6.0.0" } }, "ldapjs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-1.0.2.tgz", - "integrity": "sha1-VE/3Ayt7g8aPBwEyjZKXqmlDQPk=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/ldapjs/-/ldapjs-2.3.2.tgz", + "integrity": "sha512-FU+GR/qbQ96WUZ2DUb7FzaEybYvv3240wTVPcbsdELB3o4cK92zGVjntsh68siVkLeCmlCcsd/cIQzyGXSS7LA==", "requires": { - "asn1": "0.2.3", + "abstract-logging": "^2.0.0", + "asn1": "^0.2.4", "assert-plus": "^1.0.0", "backoff": "^2.5.0", - "bunyan": "^1.8.3", - "dashdash": "^1.14.0", - "dtrace-provider": "~0.8", - "ldap-filter": "0.2.2", + "ldap-filter": "^0.3.3", "once": "^1.4.0", - "vasync": "^1.6.4", + "vasync": "^2.2.0", "verror": "^1.8.1" - }, - "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - } } }, "listenercount": { @@ -1963,17 +1941,18 @@ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1995,24 +1974,29 @@ } }, "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz", + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==", "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" }, "dependencies": { "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, + "long-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", + "integrity": "sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=" + }, "lowdb": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", @@ -2030,6 +2014,19 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2126,9 +2123,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp": { "version": "0.5.4", @@ -2139,41 +2136,55 @@ } }, "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.6", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" }, @@ -2185,20 +2196,59 @@ } } }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==" + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } }, "strip-json-comments": { "version": "3.1.1", @@ -2216,19 +2266,19 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", + "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" }, "mongodb": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.9.tgz", - "integrity": "sha512-1nSCKgSunzn/CXwgOWgbPHUWOO5OfERcuOWISmqd610jn0s8BU9K4879iJVabqgpPPbA6hO7rG48eq+fGED3Mg==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", "denque": "^1.4.1", - "optional-require": "^1.0.3", + "optional-require": "^1.1.8", "safe-buffer": "^5.1.2", "saslprep": "^1.0.0" }, @@ -2303,41 +2353,6 @@ } } }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -2348,32 +2363,23 @@ "thenify-all": "^1.0.0" } }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "optional": true - }, "nanoid": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-id3": { "version": "0.1.16", @@ -2383,6 +2389,16 @@ "iconv-lite": "^0.4.15" } }, + "node-schedule": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.0.tgz", + "integrity": "sha512-nl4JTiZ7ZQDc97MmpTq9BQjYhq7gOtoh7SiPH069gBFBj0PzD8HI7zyFs6rzqL8Y5tTiEEYLxgtbx034YPrbyQ==", + "requires": { + "cron-parser": "^3.5.0", + "long-timeout": "0.1.1", + "sorted-array-functions": "^1.3.0" + } + }, "nodemon": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", @@ -2451,6 +2467,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2473,9 +2494,12 @@ } }, "one-time": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", - "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } }, "onetime": { "version": "5.1.0", @@ -2486,9 +2510,12 @@ } }, "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } }, "p-cancelable": { "version": "1.1.0", @@ -2590,13 +2617,11 @@ } }, "passport-ldapauth": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-2.1.4.tgz", - "integrity": "sha512-VeVL69ZK+cpJe0DKMSGuwcf7k+V4dr0U0Y7ZhXL785pcRb5gRA6qYZfIH+XTsAzwqTK9l0Dn3Ds4weOZ1jKkLQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/passport-ldapauth/-/passport-ldapauth-3.0.1.tgz", + "integrity": "sha512-TRRx3BHi8GC8MfCT9wmghjde/EGeKjll7zqHRRfGRxXbLcaDce2OftbQrFG7/AWaeFhR6zpZHtBQ/IkINdLVjQ==", "requires": { - "@types/node": "*", - "@types/passport": "^1.0.0", - "ldapauth-fork": "^4.3.2", + "ldapauth-fork": "^5.0.1", "passport-strategy": "^1.0.0" } }, @@ -2674,11 +2699,11 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, @@ -2723,9 +2748,9 @@ } }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "randombytes": { "version": "2.1.0", @@ -2741,20 +2766,20 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -2787,6 +2812,14 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", + "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", + "requires": { + "minimatch": "^3.0.4" + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -2850,6 +2883,11 @@ } } }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2891,11 +2929,10 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-json-stringify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", - "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==", - "optional": true + "safe-stable-stringify": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz", + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==" }, "safer-buffer": { "version": "2.1.2", @@ -2932,9 +2969,9 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -2943,38 +2980,38 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "requires": { "randombytes": "^2.1.0" } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "setimmediate": { @@ -2983,9 +3020,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -3021,6 +3058,11 @@ "is-arrayish": "^0.3.1" } }, + "sorted-array-functions": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", + "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==" + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -3030,6 +3072,11 @@ "memory-pager": "^1.0.2" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -3088,9 +3135,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "emoji-regex": { "version": "8.0.0", @@ -3126,6 +3173,13 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + } } }, "strip-final-newline": { @@ -3155,11 +3209,11 @@ } }, "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "requires": { - "bl": "^4.0.1", + "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", @@ -3206,9 +3260,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -3227,6 +3281,11 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, "traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -3406,26 +3465,11 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vasync": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz", - "integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vasync/-/vasync-2.2.1.tgz", + "integrity": "sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==", "requires": { - "verror": "1.6.0" - }, - "dependencies": { - "extsprintf": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz", - "integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk=" - }, - "verror": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz", - "integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=", - "requires": { - "extsprintf": "1.2.0" - } - } + "verror": "1.10.0" } }, "verror": { @@ -3438,6 +3482,20 @@ "extsprintf": "^1.2.0" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3446,38 +3504,6 @@ "isexe": "^2.0.0" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -3487,65 +3513,36 @@ } }, "winston": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", - "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz", + "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==", "requires": { - "async": "^2.6.1", - "diagnostics": "^1.1.1", - "is-stream": "^1.1.0", - "logform": "^2.1.1", - "one-time": "0.0.4", - "readable-stream": "^3.1.1", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.3.0" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "requires": { - "lodash": "^4.17.14" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - } + "winston-transport": "^4.5.0" } }, "winston-transport": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", - "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { - "readable-stream": "^2.3.6", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" } }, "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" }, "wrap-ansi": { "version": "7.0.0", @@ -3557,17 +3554,12 @@ "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -3593,6 +3585,37 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, + "xmlbuilder2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.0.2.tgz", + "integrity": "sha512-h4MUawGY21CTdhV4xm3DG9dgsqyhDkZvVJBx88beqX8wJs3VgyGQgAn5VreHuae6unTQxh115aMK5InCVmOIKw==", + "requires": { + "@oozcitak/dom": "1.15.10", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "@types/node": "*", + "js-yaml": "3.14.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -3603,6 +3626,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -3634,9 +3662,9 @@ }, "dependencies": { "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" } } }, @@ -3685,13 +3713,13 @@ "integrity": "sha1-o97wa6XjmuZEhQu0yirUEStIVek=" }, "zip-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", - "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", "requires": { "archiver-utils": "^2.1.0", - "compress-commons": "^2.1.1", - "readable-stream": "^3.4.0" + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" } } } diff --git a/backend/package.json b/backend/package.json index c857561..bf926a1 100644 --- a/backend/package.json +++ b/backend/package.json @@ -30,33 +30,32 @@ }, "homepage": "", "dependencies": { - "archiver": "^3.1.1", - "async": "^3.1.0", + "archiver": "^5.3.1", + "async": "^3.2.3", "async-mutex": "^0.3.1", - "axios": "^0.21.1", + "axios": "^0.21.2", "bcryptjs": "^2.4.0", "compression": "^1.7.4", "config": "^3.2.3", - "exe": "^1.0.2", - "express": "^4.17.1", + "express": "^4.17.3", "fluent-ffmpeg": "^2.1.2", "fs-extra": "^9.0.0", - "glob": "^7.1.6", "jsonwebtoken": "^8.5.1", "lowdb": "^1.0.0", "md5": "^2.2.1", "merge-files": "^0.1.2", - "mocha": "^8.4.0", - "moment": "^2.29.1", + "mocha": "^9.2.2", + "moment": "^2.29.2", "mongodb": "^3.6.9", "multer": "^1.4.2", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.7", "node-id3": "^0.1.14", + "node-schedule": "^2.1.0", "nodemon": "^2.0.7", "passport": "^0.4.1", "passport-http": "^0.3.0", "passport-jwt": "^4.0.0", - "passport-ldapauth": "^2.1.4", + "passport-ldapauth": "^3.0.1", "passport-local": "^1.0.0", "progress": "^2.0.3", "ps-node": "^0.1.6", @@ -65,7 +64,8 @@ "shortid": "^2.2.15", "unzipper": "^0.10.10", "uuidv4": "^6.0.6", - "winston": "^3.2.1", + "winston": "^3.7.2", + "xmlbuilder2": "^3.0.2", "youtube-dl": "^3.0.2" } } diff --git a/backend/pm2.config.js b/backend/pm2.config.js new file mode 100644 index 0000000..af9fea2 --- /dev/null +++ b/backend/pm2.config.js @@ -0,0 +1,9 @@ +module.exports = { + apps : [{ + name : "YoutubeDL-Material", + script : "./app.js", + watch : "placeholder", + out_file: "/dev/null", + error_file: "/dev/null" + }] +} \ No newline at end of file diff --git a/backend/subscriptions.js b/backend/subscriptions.js index 90b6873..e14f121 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -8,15 +8,8 @@ const logger = require('./logger'); const debugMode = process.env.YTDL_MODE === 'debug'; -let db_api = null; -let downloader_api = null; - -function setDB(input_db_api) { db_api = input_db_api } - -function initialize(input_db_api, input_downloader_api) { - setDB(input_db_api); - downloader_api = input_downloader_api; -} +const db_api = require('./db'); +const downloader_api = require('./downloader'); async function subscribe(sub, user_uid = null) { const result_obj = { @@ -148,6 +141,7 @@ async function unsubscribe(sub, deleteMode, user_uid = null) { if (sub.archive && (await fs.pathExists(sub.archive))) { const archive_file_path = path.join(sub.archive, 'archive.txt'); // deletes archive if it exists + // TODO: Keep entries in blacklist_video.txt by moving them to a global blacklist if (await fs.pathExists(archive_file_path)) { await fs.unlink(archive_file_path); } @@ -273,11 +267,17 @@ async function getVideosForSub(sub, user_uid = null) { } resolve(false); } else if (output) { + if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) { + await setFreshUploads(sub, user_uid); + checkVideosForFreshUploads(sub, user_uid); + } + if (output.length === 0 || (output.length === 1 && output[0] === '')) { logger.verbose('No additional videos to download for ' + sub.name); resolve(true); return; } + const output_jsons = []; for (let i = 0; i < output.length; i++) { let output_json = null; @@ -301,14 +301,7 @@ async function getVideosForSub(sub, user_uid = null) { } resolve(files_to_download); - - if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) { - await setFreshUploads(sub, user_uid); - checkVideosForFreshUploads(sub, user_uid); - } - - resolve(true); - } + } }); }, err => { logger.error(err); @@ -350,11 +343,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de const file_output = config_api.getConfigItem('ytdl_default_file_output') ? config_api.getConfigItem('ytdl_default_file_output') : '%(title)s'; - let fullOutput = `${appendedBasePath}/${file_output}.%(ext)s`; + let fullOutput = `"${appendedBasePath}/${file_output}.%(ext)s"`; if (desired_path) { - fullOutput = `${desired_path}.%(ext)s`; + fullOutput = `"${desired_path}.%(ext)s"`; } else if (sub.custom_output) { - fullOutput = `${appendedBasePath}/${sub.custom_output}.%(ext)s`; + fullOutput = `"${appendedBasePath}/${sub.custom_output}.%(ext)s"`; } let downloadConfig = ['--dump-json', '-o', fullOutput, !redownload ? '-ciw' : '-ci', '--write-info-json', '--print-json']; @@ -387,7 +380,11 @@ async function generateArgsForSubscription(sub, user_uid, redownload = false, de if (useArchive && !redownload) { if (sub.archive) { archive_dir = sub.archive; - archive_path = path.join(archive_dir, 'archive.txt') + if (sub.type && sub.type === 'audio') { + archive_path = path.join(archive_dir, 'merged_audio.txt'); + } else { + archive_path = path.join(archive_dir, 'merged_video.txt'); + } } downloadConfig.push('--download-archive', archive_path); } @@ -431,7 +428,7 @@ async function getFilesToDownload(sub, output_jsons) { const files_to_download = []; for (let i = 0; i < output_jsons.length; i++) { const output_json = output_jsons[i]; - const file_missing = !(await db_api.getRecord('files', {sub_id: sub.id, url: output_json['webpage_url']})) && !(await db_api.getRecord('download_queue', {sub_id: sub.id, url: output_json['webpage_url'], error: null})); + const file_missing = !(await db_api.getRecord('files', {sub_id: sub.id, url: output_json['webpage_url']})) && !(await db_api.getRecord('download_queue', {sub_id: sub.id, url: output_json['webpage_url'], error: null, finished: false})); if (file_missing) { const file_with_path_exists = await db_api.getRecord('files', {sub_id: sub.id, path: output_json['_filename']}); if (file_with_path_exists) { @@ -480,22 +477,24 @@ async function updateSubscriptionProperty(sub, assignment_obj) { return true; } -async function setFreshUploads(sub, user_uid) { +async function setFreshUploads(sub) { + const sub_files = await db_api.getRecords('files', {sub_id: sub.id}); const current_date = new Date().toISOString().split('T')[0].replace(/-/g, ''); - sub.videos.forEach(async video => { - if (current_date === video['upload_date'].replace(/-/g, '')) { + sub_files.forEach(async file => { + if (current_date === file['upload_date'].replace(/-/g, '')) { // set upload as fresh - const video_uid = video['uid']; - await db_api.setVideoProperty(video_uid, {'fresh_upload': true}, user_uid, sub['id']); + const file_uid = file['uid']; + await db_api.setVideoProperty(file_uid, {'fresh_upload': true}); } }); } async function checkVideosForFreshUploads(sub, user_uid) { + const sub_files = await db_api.getRecords('files', {sub_id: sub.id}); const current_date = new Date().toISOString().split('T')[0].replace(/-/g, ''); - sub.videos.forEach(async video => { - if (video['fresh_upload'] && current_date > video['upload_date'].replace(/-/g, '')) { - await checkVideoIfBetterExists(video, sub, user_uid) + sub_files.forEach(async file => { + if (file['fresh_upload'] && current_date > file['upload_date'].replace(/-/g, '')) { + await checkVideoIfBetterExists(file, sub, user_uid) } }); } @@ -517,13 +516,13 @@ async function checkVideoIfBetterExists(file_obj, sub, user_uid) { logger.verbose(`Failed to download better version of video ${file_obj['id']}`); } else if (output) { logger.verbose(`Successfully upgraded video ${file_obj['id']}'s ${metric_to_compare} from ${file_obj[metric_to_compare]} to ${output[metric_to_compare]}`); - await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]}, user_uid, sub['id']); + await db_api.setVideoProperty(file_obj['uid'], {[metric_to_compare]: output[metric_to_compare]}); } }); } } }); - await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false}, user_uid, sub['id']); + await db_api.setVideoProperty(file_obj['uid'], {'fresh_upload': false}); } // helper functions @@ -542,7 +541,6 @@ module.exports = { unsubscribe : unsubscribe, deleteSubscriptionFile : deleteSubscriptionFile, getVideosForSub : getVideosForSub, - initialize : initialize, updateSubscriptionPropertyMultiple : updateSubscriptionPropertyMultiple, generateOptionsForSubscriptionDownload: generateOptionsForSubscriptionDownload } diff --git a/backend/tasks.js b/backend/tasks.js new file mode 100644 index 0000000..ba6379c --- /dev/null +++ b/backend/tasks.js @@ -0,0 +1,195 @@ +const db_api = require('./db'); +const youtubedl_api = require('./youtube-dl'); + +const fs = require('fs-extra'); +const logger = require('./logger'); +const scheduler = require('node-schedule'); + +const TASKS = { + backup_local_db: { + run: db_api.backupDB, + title: 'Backup DB', + job: null + }, + missing_files_check: { + run: checkForMissingFiles, + confirm: deleteMissingFiles, + title: 'Missing files check', + job: null + }, + missing_db_records: { + run: db_api.importUnregisteredFiles, + title: 'Import missing DB records', + job: null + }, + duplicate_files_check: { + run: checkForDuplicateFiles, + confirm: removeDuplicates, + title: 'Find duplicate files in DB', + job: null + }, + youtubedl_update_check: { + run: youtubedl_api.checkForYoutubeDLUpdate, + confirm: youtubedl_api.updateYoutubeDL, + title: 'Update youtube-dl', + job: null + } +} + +function scheduleJob(task_key, schedule) { + // schedule has to be converted from our format to one node-schedule can consume + let converted_schedule = null; + if (schedule['type'] === 'timestamp') { + converted_schedule = new Date(schedule['data']['timestamp']); + } else if (schedule['type'] === 'recurring') { + const dayOfWeek = schedule['data']['dayOfWeek'] != null ? schedule['data']['dayOfWeek'] : null; + const hour = schedule['data']['hour'] != null ? schedule['data']['hour'] : null; + const minute = schedule['data']['minute'] != null ? schedule['data']['minute'] : null; + converted_schedule = new scheduler.RecurrenceRule(null, null, null, dayOfWeek, hour, minute); + } else { + logger.error(`Failed to schedule job '${task_key}' as the type '${schedule['type']}' is invalid.`) + return null; + } + + return scheduler.scheduleJob(converted_schedule, async () => { + const task_state = await db_api.getRecord('tasks', {key: task_key}); + if (task_state['running'] || task_state['confirming']) { + logger.verbose(`Skipping running task ${task_state['key']} as it is already in progress.`); + return; + } + + // remove schedule if it's a one-time task + if (task_state['schedule']['type'] !== 'recurring') await db_api.updateRecord('tasks', {key: task_key}, {schedule: null}); + // we're just "running" the task, any confirmation should be user-initiated + exports.executeRun(task_key); + }); +} + +if (db_api.database_initialized) { + exports.setupTasks(); +} else { + db_api.database_initialized_bs.subscribe(init => { + if (init) exports.setupTasks(); + }); +} + +exports.setupTasks = async () => { + const tasks_keys = Object.keys(TASKS); + for (let i = 0; i < tasks_keys.length; i++) { + const task_key = tasks_keys[i]; + const task_in_db = await db_api.getRecord('tasks', {key: task_key}); + if (!task_in_db) { + // insert task metadata into table if missing + await db_api.insertRecordIntoTable('tasks', { + key: task_key, + title: TASKS[task_key]['title'], + last_ran: null, + last_confirmed: null, + running: false, + confirming: false, + data: null, + error: null, + schedule: null, + options: {} + }); + } else { + // reset task if necessary + await db_api.updateRecord('tasks', {key: task_key}, {running: false, confirming: false}); + + // schedule task and save job + if (task_in_db['schedule']) { + // prevent timestamp schedules from being set to the past + if (task_in_db['schedule']['type'] === 'timestamp' && task_in_db['schedule']['data']['timestamp'] < Date.now()) { + await db_api.updateRecord('tasks', {key: task_key}, {schedule: null}); + continue; + } + TASKS[task_key]['job'] = scheduleJob(task_key, task_in_db['schedule']); + } + } + } +} + +exports.executeTask = async (task_key) => { + if (!TASKS[task_key]) { + logger.error(`Task ${task_key} does not exist!`); + return; + } + logger.verbose(`Executing task ${task_key}`); + await exports.executeRun(task_key); + if (!TASKS[task_key]['confirm']) return; + await exports.executeConfirm(task_key); + logger.verbose(`Finished executing ${task_key}`); +} + +exports.executeRun = async (task_key) => { + logger.verbose(`Running task ${task_key}`); + // don't set running to true when backup up DB as it will be stick "running" if restored + if (task_key !== 'backup_local_db') await db_api.updateRecord('tasks', {key: task_key}, {running: true}); + const data = await TASKS[task_key].run(); + await db_api.updateRecord('tasks', {key: task_key}, {data: TASKS[task_key]['confirm'] ? data : null, last_ran: Date.now()/1000, running: false}); + logger.verbose(`Finished running task ${task_key}`); +} + +exports.executeConfirm = async (task_key) => { + logger.verbose(`Confirming task ${task_key}`); + if (!TASKS[task_key]['confirm']) { + return null; + } + await db_api.updateRecord('tasks', {key: task_key}, {confirming: true}); + const task_obj = await db_api.getRecord('tasks', {key: task_key}); + const data = task_obj['data']; + await TASKS[task_key].confirm(data); + await db_api.updateRecord('tasks', {key: task_key}, {confirming: false, last_confirmed: Date.now()/1000, data: null}); + logger.verbose(`Finished confirming task ${task_key}`); +} + +exports.updateTaskSchedule = async (task_key, schedule) => { + logger.verbose(`Updating schedule for task ${task_key}`); + await db_api.updateRecord('tasks', {key: task_key}, {schedule: schedule}); + if (TASKS[task_key]['job']) { + TASKS[task_key]['job'].cancel(); + } + if (schedule) { + TASKS[task_key]['job'] = scheduleJob(task_key, schedule); + } +} + +// missing files check + +async function checkForMissingFiles() { + const missing_files = []; + const all_files = await db_api.getRecords('files'); + for (let i = 0; i < all_files.length; i++) { + const file_to_check = all_files[i]; + const file_exists = fs.existsSync(file_to_check['path']); + if (!file_exists) missing_files.push(file_to_check['uid']); + } + return {uids: missing_files}; +} + +async function deleteMissingFiles(data) { + const uids = data['uids']; + for (let i = 0; i < uids.length; i++) { + const uid = uids[i]; + await db_api.removeRecord('files', {uid: uid}); + } +} + +// duplicate files check + +async function checkForDuplicateFiles() { + const duplicate_files = await db_api.findDuplicatesByKey('files', 'path'); + const duplicate_uids = duplicate_files.map(duplicate_file => duplicate_file['uid']); + if (duplicate_uids && duplicate_uids.length > 0) { + return {uids: duplicate_uids}; + } + return {uids: []}; +} + +async function removeDuplicates(data) { + for (let i = 0; i < data['uids'].length; i++) { + await db_api.removeRecord('files', {uid: data['uids'][i]}); + } +} + +exports.TASKS = TASKS; \ No newline at end of file diff --git a/backend/test/sample.info.json b/backend/test/sample.info.json new file mode 100644 index 0000000..8d65c5b --- /dev/null +++ b/backend/test/sample.info.json @@ -0,0 +1 @@ +{"fps": 25, "webpage_url_basename": "watch", "vbr": 3546.159, "age_limit": 0, "_filename": "video\\20091024 - Rick Astley - Never Gonna Give You Up (Official Music Video).mp4", "height": 1080, "description": "Rick Astley's official music video for \u201cNever Gonna Give You Up", "thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "resolution": null, "webpage_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "average_rating": 4.894496, "ext": "mp4", "formats": [{"fps": null, "abr": 46.492, "height": null, "format_id": "249", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=249&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1232413&dur=212.061&lmt=1624945854503369&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOQPPrlgzOqNtORq4sWu11c9B7xu7oDsAw2tubKwfknwAiBqNjjMPHEVKlGNnOplfYZ_zuITnJ0PQAicXP1qyYRDWA%3D%3D&sig=AOq0QJ8wRgIhAOBiYeG7Pq0puYb5QjUVfMdTQStw09143tjience7YyJAiEAyK77-fXJ55w7RP2_ML9Gysg9ZrqhjcBzsolQIVHx6I4=", "format": "249 - audio only (tiny)", "filesize": 1232413, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 46.492, "width": null}, {"fps": null, "abr": 61.494, "height": null, "format_id": "250", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=250&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1630086&dur=212.061&lmt=1624945852595198&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgGn2dRpsfP4xqu8rwvbRoH6SV9eCoQNr9KhOHIzWHcfwCIQCNXPD8U5zRz8nOD86M7E79GYNf9sR1QYI8Q0vRwh90zQ%3D%3D&sig=AOq0QJ8wRAIgMX4-9T8B0Rk8YxA7umuAzrb7Cf81aYG4PiV3uKTP4zQCIDw876bIcVsfWIO4Lx4qS7txMIkqDsnofhAfcIrAc9-T", "format": "250 - audio only (tiny)", "filesize": 1630086, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 61.494, "width": null}, {"fps": null, "abr": 129.51, "height": null, "format_id": "140", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=140&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3433514&dur=212.091&lmt=1628122153868652&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5532434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIb6WyFCUS1IO9DY2BvkCDbeQpYU54NUMD8wHVUv-CgoAiBBk9HxGnh0qQAJqGRNFHGTtqiNhjBxPQCfHWqDOmzMbg%3D%3D&sig=AOq0QJ8wRAIgUstXqxWkdk_oRE6snyI1OaunA8jmDtA5gFsO__xRSWgCIDN6rrueyDicOohCGgyy-VOLBEHuwtjxpTpEdFrdzLtd", "format": "140 - audio only (tiny)", "filesize": 3433514, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "mp4a.40.2", "quality": 0, "container": "m4a_dash", "ext": "m4a", "protocol": "https", "vcodec": "none", "tbr": 129.51, "width": null}, {"fps": null, "abr": 129.689, "height": null, "format_id": "251", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=251&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3437753&dur=212.061&lmt=1624945852795821&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAO1WGRPqP3fz7DeczBl9uDNWvypP_xmoQapWlTCG66d9AiEAvZrhvA9jWZGnwCDEhntzc9utiYJZq-_PdXBpKlfUKAY%3D&sig=AOq0QJ8wRQIgPP7v5vRzBQVhBUFexSLhOsqNNfttu2TFH4qIctUxqAsCIQDixqdmBoxi72zvNSXdw-VyXAKd6mQfO_GmsvapdAutvA==", "format": "251 - audio only (tiny)", "filesize": 3437753, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 129.689, "width": null}, {"fps": 25, "format": "394 - 256x144 (144p)", "height": 144, "format_id": "394", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=394&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1806317&dur=212.040&lmt=1624947805339431&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgMcmJsqnRfEbWlqbPt1EPKCpOF5UzkyaABbAi0SXEwHICIHVGwJ69zGvjLE7SfFLy7c-1L-psZ1M4cHbx0s_FlJEu&sig=AOq0QJ8wRQIgXnlbLnaTYCnHNGSv3NHchQ_uPCQKO-EuJ8le0QekHdsCIQDsHRE_83b11n_QLvDF0qhNgOtpfYgkhKU05RNt_DiwYg==", "vbr": 68.15, "filesize": 1806317, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 68.15, "width": 256}, {"fps": 25, "format": "160 - 256x144 (144p)", "height": 144, "format_id": "160", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=160&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1902470&dur=212.040&lmt=1628130952822277&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhANAbvnZihueHQl6DlS0KDCcmD612v91WicDPh0MMooE3AiEApFWRu4aPyDGym8F6QMLxc8yrVTWSSFBaUxjDWrx59FA%3D&sig=AOq0QJ8wRgIhAIKLvUYN8RN1LzNPHRN4Rb3fC0zDev9KlSdeCExTXPosAiEA_yY2AJ69va_G3eTdbkifrdePATiSrgb8PVDdMk-6hYw=", "vbr": 71.777, "filesize": 1902470, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d400c", "tbr": 71.777, "width": 256}, {"fps": 25, "format": "278 - 256x144 (144p)", "height": 144, "format_id": "278", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=2377337&dur=212.040&lmt=1628133100068252&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgYxpgVafit-zpha31Q8EtJBdHaBpRj1y65ew-cOr0644CIQD8SJ7dYuyflAm0T7T6ny03WB5jOjmHO87TDSwLeAPwZA%3D%3D&sig=AOq0QJ8wRQIgZP8HNivYFUpLZC2a5UHDX26raL9ekwrCP3fNwgST874CIQDuD4D2kg8lxP-4BC8J_x9cP8vGKfwD1w9HVad9TXIbjg==", "vbr": 89.693, "filesize": 2377337, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 89.693, "width": 256}, {"fps": 25, "format": "133 - 426x240 (240p)", "height": 240, "format_id": "133", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=133&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3107257&dur=212.040&lmt=1628130952261127&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgNlYpzWhXOUhMEpm6bv_NUP8flw8_gbDOPuh_BpF1NWkCIA7dMuvigM6xlyoiJa8HxjDx-zeZODadHPUQ7DSxuy-u&sig=AOq0QJ8wRQIgfZ33AlJlf8H6DyxSVCHeZvA7i3QC9giEfW2FL6iXqTACIQCYEK8Rqbt9EgjKbGEks_iWoxXtm6TFLPM1vmx7722hrg==", "vbr": 117.232, "filesize": 3107257, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d4015", "tbr": 117.232, "width": 426}, {"fps": 25, "format": "395 - 426x240 (240p)", "height": 240, "format_id": "395", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=395&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3563582&dur=212.040&lmt=1624947923168885&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhALb3kDbV5djjgibZrxg1kD6hfnxNHcgVWv0snt354vKHAiEA5UJIuEWmRqTsPtKGbHwcWducF6aUoEaFxKx1Tz5L008%3D&sig=AOq0QJ8wRQIgKib1QlEvGVYibzu3l1BDT63OFgt9Ttv4HCcqpCKebncCIQCGk-H3AdMNUzWU5I7015YbmU_X4g2Es44BBWCzLYUM6w==", "vbr": 134.449, "filesize": 3563582, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 134.449, "width": 426}, {"fps": 25, "format": "242 - 426x240 (240p)", "height": 240, "format_id": "242", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=242&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=4215000&dur=212.040&lmt=1628133101514133&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPDAPJegoPAAF6kQgTebJ5-GdTQHu-dnudbQ9wUfaIWKAiEA4kNlwtfnb1zuhOb7OlIlBInYYdOTFyoI9mE7-yxxbxM%3D&sig=AOq0QJ8wRgIhALxu_H89hpmniExLrH6A073CxYUCJVhiVe0KFK3Skz7gAiEAlnZsUIv_GSPJYDafWKjskYOJkbRY2tTqSVZO3tHiVPg=", "vbr": 159.026, "filesize": 4215000, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 159.026, "width": 426}, {"fps": 25, "format": "134 - 640x360 (360p)", "height": 360, "format_id": "134", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=134&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=5820414&dur=212.040&lmt=1628130952382425&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOtn2CoLBwcHCnbLpyhRugJMSvb5A3Mt7q0oc2GewlP5AiBSL9UpjE1pdqmlim_prX4T9hURk5K8YDHf24Gvlo29Sw%3D%3D&sig=AOq0QJ8wRAIgGt5L323eYDn6EDy6r2IYX0xGkzGzVMeH7NruficAzMECIGrivYII2PAGKL5Rv6lDc-l53z6PVid6W_8Jco5BYmFB", "vbr": 219.596, "filesize": 5820414, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 219.596, "width": 640}, {"fps": 25, "format": "396 - 640x360 (360p)", "height": 360, "format_id": "396", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=396&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=6957752&dur=212.040&lmt=1624947999257981&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgHlGjZ2Fo06YkUp_59h9RpX89UUj7yF86OMbElBaaDRQCIBIJuyfWeNSKFP3s6BkXIk8Cy3F2mHRO3PRoR5CuacA3&sig=AOq0QJ8wRQIhANp7jIO5PM8sEwGd4-EmADAfLNsIw-mWhZDI0XAmQ666AiAfEAjcDgczL2TMBWQm9xobP6cbCrDVxfVxR_3IbYIYXg==", "vbr": 262.507, "filesize": 6957752, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.01M.08", "tbr": 262.507, "width": 640}, {"fps": 25, "format": "243 - 640x360 (360p)", "height": 360, "format_id": "243", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=243&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=7257207&dur=212.040&lmt=1628133101141872&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgdk8qX0zqkEIlabAum60ghDNmMy2W1zWAsnvKpoef1igCIQCWvArsFhNndiLBBq7UEdk2qX9FvYej4tCuDFknrNyyDA%3D%3D&sig=AOq0QJ8wRgIhAN3hiLrHN-nYrc4xRIFk0mcVYxqR5FNRhzcEz8DJyLAuAiEAiIsaYG5R6ZcaTuWfwV4qp3iJqAYPBLX0QkDgNbXhGl4=", "vbr": 273.805, "filesize": 7257207, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 273.805, "width": 640}, {"fps": 25, "format": "135 - 854x480 (480p)", "height": 480, "format_id": "135", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=135&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=8935471&dur=212.040&lmt=1628130953383927&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgGK75aA2fI4WwFkPZV42bMbNbkOG6OtuIXjuFNqezr4MCIGst4mxew5OX2AYcbwTj9f0e3PBAS8QGTYs3yDeVbNdT&sig=AOq0QJ8wRgIhALIazj23a4uqcFohSavkQCmmByUR_7DxHo6ohKjOc5yiAiEAoleQpPWYZ8tO0O7gZsT_H4aUuGh_p9F2oNjrx5eLKqQ=", "vbr": 337.123, "filesize": 8935471, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 337.123, "width": 854}, {"fps": 25, "format": "244 - 854x480 (480p)", "height": 480, "format_id": "244", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=10532052&dur=212.040&lmt=1628133102160132&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAJKhoFYw7Q-a6k4sgJZO69oCR8yu-_86cfVvZDVnlxcrAiEA6ghEBhCbESj7wH3LcFmHp4dNFEVI_H3dazQKTWPxMnk%3D&sig=AOq0QJ8wRgIhAN3WW-w6rLDTOWF4r6kqvmbOlsgkp0wgxnvHeMJOPa8oAiEA4s9L5_hPFQ9pjUD9VWVjJrYKTT5pzeFfXCD2Cd7tR6s=", "vbr": 397.36, "filesize": 10532052, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 397.36, "width": 854}, {"fps": 25, "format": "397 - 854x480 (480p)", "height": 480, "format_id": "397", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=397&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=11930795&dur=212.040&lmt=1624948131494790&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcoFDjq9zIiJ_ofRzFyQjv_6wRL4EV6mbVDCkwBYN8t0CIFvyQbtU537nm7Iw9-t_e9Scxlcyt5SwbrhtWIiA4zt5&sig=AOq0QJ8wRgIhAPf62Xh3p8Sk1zf3iZTK1zaEoSJz6eft26JJ9VR8N2CPAiEAtZtW4sdAYDDmAqS524Qxy6ZD9BZgvdFZWkTyZwrbkyo=", "vbr": 450.133, "filesize": 11930795, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.04M.08", "tbr": 450.133, "width": 854}, {"fps": 25, "format": "136 - 1280x720 (720p)", "height": 720, "format_id": "136", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=136&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=17375531&dur=212.040&lmt=1628130952538181&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAN1ZFXb_ZOXOofsWiuyAlB_PEmFOXLMiMWlLzcrb33zgAiARNS1RT8FOIEst33KIGloOKR9Y6_fSg0o1s_cr8PrDTQ%3D%3D&sig=AOq0QJ8wRAIgeCl2ZWgWyfopoNoWUVV4Lijvm2aYyFZhH4KZsPLOWb8CICgDOyLogiCIwOIiNz4zamJTtkakt8VDaLhV__Z4b9An", "vbr": 655.556, "filesize": 17375531, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401f", "tbr": 655.556, "width": 1280}, {"fps": 25, "format": "247 - 1280x720 (720p)", "height": 720, "format_id": "247", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=247&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=18530394&dur=212.040&lmt=1628133100666546&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIEWZfOAPFeUw2-xI2l_IvQ2XJG92s_5Yd77n9pgCvISAiByI9uxsyN5xk_PtxDSFF4UG1Q-7OpXrYr3i6jBz880JQ%3D%3D&sig=AOq0QJ8wRgIhAL3l9xAE1mvJmZ5wEGtRO-f_vhHCRtts8Cj-jD1ZpcUqAiEAsKbVkjHRYLtXGbmwUT1qe6medMxHmIYGsLrPTftbuYI=", "vbr": 699.128, "filesize": 18530394, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 699.128, "width": 1280}, {"fps": 25, "format": "398 - 1280x720 (720p)", "height": 720, "format_id": "398", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=398&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=22755091&dur=212.040&lmt=1624947952304594&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPYMgegprlBtjtqtXJkbsbAeeXS6XNWySYoxae2IvrLKAiEApXXh7mr2C8UMrfXNGaIB--m-4kkSy91IN3muC3Z4t18%3D&sig=AOq0QJ8wRgIhAPm3dPdmeLw7e6muiJwhSDKe1nlkHoQ1WkXcmz6ngRkVAiEAqShfUbwRICZ7TI3pggP-3rWlFlpExlV1ebinn5JLc4k=", "vbr": 858.52, "filesize": 22755091, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.05M.08", "tbr": 858.52, "width": 1280}, {"fps": 25, "format": "399 - 1920x1080 (1080p)", "height": 1080, "format_id": "399", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=41772768&dur=212.040&lmt=1624948154710174&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcCja1-Lsriw-hfwc2KwX9G4VBYJ1a9p3OGBQYwa3pywCIFMEO6QGSXUQoQomqSYxqUu4HOZHqHnhVUFlaroP-l2h&sig=AOq0QJ8wRQIgIPISNyI_OU4-cpSkzZjvP6oF2w0izlJKe8DCwl9bH5QCIQDHydWqPWx7k9ctYkmtelvOV6Ao_hUwUzeJuMaaXqllkw==", "vbr": 1576.033, "filesize": 41772768, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.08M.08", "tbr": 1576.033, "width": 1920}, {"fps": 25, "format": "137 - 1920x1080 (1080p)", "height": 1080, "format_id": "137", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=137&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=93990963&dur=212.040&lmt=1628130818054956&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgfImvk-1wtFA9tIjgPP0B-zd95cwOlEHMhBvV3aE7zl0CIQCEf3d3oZfoThLk__WJL1AOe1URRgkj_SIcftgH8HG_jg%3D%3D&sig=AOq0QJ8wRgIhAJItHQu2MeVv3to1Z0luBDsircwDXjWzWeBmYRAKDW9rAiEA1iafsfDk5Yp-9zACBxgmxyL_pidNC3mqYV_TKjHcklY=", "vbr": 3546.159, "filesize": 93990963, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.640028", "tbr": 3546.159, "width": 1920}, {"fps": 25, "format": "18 - 640x360 (360p)", "height": 360, "format_id": "18", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=18&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=zMV9mnhHv3UnwW1w1ilGGmgG&gir=yes&clen=16724503&ratebypass=yes&dur=212.091&lmt=1624987724234745&mt=1631594013&fvip=4&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5530322&n=EFswOlbBGAoK1nv1&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANvKM6JozEQa97eFLe2GBuj7K6UqHz8r0ilGwRnrl5OBAiAHdOlZ3a0nr2sKPzU2cfBNdSgdtRYyYem2sOJCFRRdkg%3D%3D&sig=AOq0QJ8wRQIhAO27Mc8XHMtx364tjalsNLXk8X5zzE11s4ovWD-0cVMwAiB4giGZbFxOvmRb0Eo1OTuExAAWvFfl_IB8vrJXPHMAsQ==", "filesize": 16724503, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "format_note": "360p", "acodec": "mp4a.40.2", "quality": 2, "ext": "mp4", "protocol": "https", "vcodec": "avc1.42001E", "tbr": 630.842, "width": 640}], "id": "dQw4w9WgXcQ", "format_id": "137+251", "uploader": "Rick Astley", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "acodec": "opus", "thumbnails": [{"height": 94, "resolution": "168x94", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd2KtelLHaNSXrI9_5K-NvTscKNw", "width": 168, "id": "0"}, {"height": 110, "resolution": "196x110", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUpEOOWUXWkNyijQuZ4UPzp2BE-w", "width": 196, "id": "1"}, {"height": 138, "resolution": "246x138", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBCyhr8AqpJ1SxKVU6SyK5ODJ_IpA", "width": 246, "id": "2"}, {"height": 188, "resolution": "336x188", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB_p0PncTtkrhaNDZtntrE3gKkoYw", "width": 336, "id": "3"}, {"height": 1080, "resolution": "1920x1080", "url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "width": 1920, "id": "4"}], "extractor_key": "Youtube", "fulltitle": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "categories": ["Music"], "view_count": 1046140382, "format": "137 - 1920x1080 (1080p)+251 - audio only (tiny)", "is_live": null, "upload_date": "20091024", "track": "Never Gonna Give You Up (7\" Mix)", "extractor": "youtube", "artist": "Rick Astley", "abr": 129.689, "creator": "Rick Astley", "channel": "Rick Astley", "title": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "vcodec": "avc1.640028", "display_id": "dQw4w9WgXcQ", "width": 1920, "alt_title": "Never Gonna Give You Up (7\" Mix)", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "stretched_ratio": null, "uploader_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "like_count": 11756010, "playlist": null, "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics", "rick rolled", "the boys soundtrack", "the boys amazon prime", "Never gonna give you up the boys", "official", "Rick Roll", "music video", "Rick Astley album", "rick astley official", "together forever", "Whenever You Need Somebody", "rickrolled", "WRECK-IT RALPH 2", "Fortnite song", "Fortnite event", "Fortnite dance", "fortnite never gonna give you up", "rick astley never gonna give you up", "rick astley never gonna give you up lyrics"], "duration": 212, "uploader_url": "http://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "dislike_count": 318477, "playlist_index": null} \ No newline at end of file diff --git a/backend/test/tests.js b/backend/test/tests.js index 99b79b2..9ae95a8 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -70,6 +70,17 @@ describe('Database', async function() { const success = await db_api.getRecord('test', {test: 'test'}); assert(success); }); + + it('Restore db', async function() { + const db_stats = await db_api.getDBStats(); + + const file_name = await db_api.backupDB(); + await db_api.restoreDB(file_name); + + const new_db_stats = await db_api.getDBStats(); + + assert(JSON.stringify(db_stats), JSON.stringify(new_db_stats)); + }); }); describe('Export', function() { @@ -83,12 +94,37 @@ describe('Database', async function() { await db_api.removeAllRecords('test'); }); it('Add and read record', async function() { + this.timeout(120000); await db_api.insertRecordIntoTable('test', {test_add: 'test', test_undefined: undefined, test_null: undefined}); const added_record = await db_api.getRecord('test', {test_add: 'test', test_undefined: undefined, test_null: null}); assert(added_record['test_add'] === 'test'); await db_api.removeRecord('test', {test_add: 'test'}); }); + it('Find duplicates by key', async function() { + const test_duplicates = [ + { + test: 'testing', + key: '1' + }, + { + test: 'testing', + key: '2' + }, + { + test: 'testing_missing', + key: '3' + }, + { + test: 'testing', + key: '4' + } + ]; + await db_api.insertRecordsIntoTable('test', test_duplicates); + const duplicates = await db_api.findDuplicatesByKey('test', 'test'); + console.log(duplicates); + }); + it('Update record', async function() { await db_api.insertRecordIntoTable('test', {test_update: 'test'}); await db_api.updateRecord('test', {test_update: 'test'}, {added_field: true}); @@ -122,6 +158,7 @@ describe('Database', async function() { }); it('Bulk add', async function() { + this.timeout(120000); const NUM_RECORDS_TO_ADD = 2002; // max batch ops is 1000 const test_records = []; for (let i = 0; i < NUM_RECORDS_TO_ADD; i++) { @@ -291,7 +328,6 @@ describe('Multi User', async function() { describe('Downloader', function() { const downloader_api = require('../downloader'); - downloader_api.initialize(db_api); const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; const sub_id = 'dc834388-3454-41bf-a618-e11cb8c7de1c'; const options = { @@ -339,4 +375,107 @@ describe('Downloader', function() { const args = await downloader_api.generateArgs(url, 'video', sub_options, 'admin'); console.log(args); }); + + it('Generate kodi NFO file', async function() { + const nfo_file_path = './test/sample.nfo'; + if (fs.existsSync(nfo_file_path)) { + fs.unlinkSync(nfo_file_path); + } + const sample_json = fs.readJSONSync('./test/sample.info.json'); + downloader_api.generateNFOFile(sample_json, nfo_file_path); + assert(fs.existsSync(nfo_file_path), true); + fs.unlinkSync(nfo_file_path); + }); }); + +describe('Tasks', function() { + const tasks_api = require('../tasks'); + beforeEach(async function() { + await db_api.connectToDB(); + await db_api.removeAllRecords('tasks'); + + const dummy_task = { + run: async () => { await utils.wait(500); return true; }, + confirm: async () => { await utils.wait(500); return true; }, + title: 'Dummy task', + job: null + }; + tasks_api.TASKS['dummy_task'] = dummy_task; + + await tasks_api.initialize(); + }); + it('Backup db', async function() { + const backups_original = await utils.recFindByExt('appdata', 'bak'); + const original_length = backups_original.length; + await tasks_api.executeTask('backup_local_db'); + const backups_new = await utils.recFindByExt('appdata', 'bak'); + const new_length = backups_new.length; + assert(original_length, new_length-1); + }); + + it('Check for missing files', async function() { + await db_api.removeAllRecords('files', {uid: 'test'}); + const test_missing_file = {uid: 'test', path: 'test/missing_file.mp4'}; + await db_api.insertRecordIntoTable('files', test_missing_file); + await tasks_api.executeTask('missing_files_check'); + const task_obj = await db_api.getRecord('tasks', {key: 'missing_files_check'}); + assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); + }); + + it('Check for duplicate files', async function() { + this.timeout(300000); + await db_api.removeAllRecords('files', {uid: 'test1'}); + await db_api.removeAllRecords('files', {uid: 'test2'}); + const test_duplicate_file1 = {uid: 'test1', path: 'test/missing_file.mp4'}; + const test_duplicate_file2 = {uid: 'test2', path: 'test/missing_file.mp4'}; + const test_duplicate_file3 = {uid: 'test3', path: 'test/missing_file.mp4'}; + await db_api.insertRecordIntoTable('files', test_duplicate_file1); + await db_api.insertRecordIntoTable('files', test_duplicate_file2); + await db_api.insertRecordIntoTable('files', test_duplicate_file3); + await tasks_api.executeTask('duplicate_files_check'); + const task_obj = await db_api.getRecord('tasks', {key: 'duplicate_files_check'}); + const duplicated_record_count = await db_api.getRecords('files', {path: 'test/missing_file.mp4'}, true); + assert(task_obj['data'] && task_obj['data']['uids'] && task_obj['data']['uids'].length >= 1, true); + assert(duplicated_record_count == 1, true); + }); + + it('Import unregistered files', async function() { + this.timeout(300000); + + // pre-test cleanup + await db_api.removeAllRecords('files', {title: 'Sample File'}); + if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); + if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + + // copies in files + fs.copyFileSync('test/sample.info.json', 'video/sample.info.json'); + fs.copyFileSync('test/sample.mp4', 'video/sample.mp4'); + await tasks_api.executeTask('missing_db_records'); + const imported_file = await db_api.getRecord('files', {title: 'Sample File'}); + assert(!!imported_file, true); + + // post-test cleanup + if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); + if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + }); + + it('Schedule and cancel task', async function() { + const today_4_hours = new Date(); + today_4_hours.setHours(today_4_hours.getHours() + 4); + await tasks_api.updateTaskSchedule('dummy_task', today_4_hours); + assert(!!tasks_api.TASKS['dummy_task']['job'], true); + await tasks_api.updateTaskSchedule('dummy_task', null); + assert(!!tasks_api.TASKS['dummy_task']['job'], false); + }); + + it('Schedule and run task', async function() { + this.timeout(5000); + const today_1_second = new Date(); + today_1_second.setSeconds(today_1_second.getSeconds() + 1); + await tasks_api.updateTaskSchedule('dummy_task', today_1_second); + assert(!!tasks_api.TASKS['dummy_task']['job'], true); + await utils.wait(2000); + const dummy_task_obj = await db_api.getRecord('tasks', {key: 'dummy_task'}); + assert(dummy_task_obj['data'], true); + }); +}); \ No newline at end of file diff --git a/backend/utils.js b/backend/utils.js index 9c07833..a6eaf7e 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -1,10 +1,13 @@ -const fs = require('fs-extra') -const path = require('path') +const fs = require('fs-extra'); +const path = require('path'); const ffmpeg = require('fluent-ffmpeg'); +const archiver = require('archiver'); +const fetch = require('node-fetch'); +const ProgressBar = require('progress'); + const config_api = require('./config'); const logger = require('./logger'); -const CONSTS = require('./consts') -const archiver = require('archiver'); +const CONSTS = require('./consts'); const is_windows = process.platform === 'win32'; @@ -45,8 +48,7 @@ async function getDownloadedFilesByType(basePath, type, full_metadata = false) { files.push(jsonobj); continue; } - var upload_date = jsonobj.upload_date; - upload_date = upload_date ? `${upload_date.substring(0, 4)}-${upload_date.substring(4, 6)}-${upload_date.substring(6, 8)}` : null; + var upload_date = formatDateString(jsonobj.upload_date); var isaudio = type === 'audio'; var file_obj = new File(id, jsonobj.title, jsonobj.thumbnail, isaudio, jsonobj.duration, jsonobj.webpage_url, jsonobj.uploader, @@ -56,13 +58,13 @@ async function getDownloadedFilesByType(basePath, type, full_metadata = false) { return files; } -async function createContainerZipFile(container_obj, container_file_objs) { +async function createContainerZipFile(file_name, container_file_objs) { const container_files_to_download = []; for (let i = 0; i < container_file_objs.length; i++) { const container_file_obj = container_file_objs[i]; container_files_to_download.push(container_file_obj.path); } - return await createZipFile(path.join('appdata', container_obj.name + '.zip'), container_files_to_download); + return await createZipFile(path.join('appdata', file_name + '.zip'), container_files_to_download); } async function createZipFile(zip_file_path, file_paths) { @@ -267,7 +269,7 @@ function getCurrentDownloader() { return details_json['downloader']; } -async function recFindByExt(base,ext,files,result) +async function recFindByExt(base, ext, files, result, recursive = true) { files = files || (await fs.readdir(base)) result = result || [] @@ -276,6 +278,7 @@ async function recFindByExt(base,ext,files,result) var newbase = path.join(base,file) if ( (await fs.stat(newbase)).isDirectory() ) { + if (!recursive) continue; result = await recFindByExt(newbase,ext,await fs.readdir(newbase),result) } else @@ -295,6 +298,10 @@ function removeFileExtension(filename) { return filename_parts.join('.'); } +function formatDateString(date_string) { + return date_string ? `${date_string.substring(0, 4)}-${date_string.substring(4, 6)}-${date_string.substring(6, 8)}` : 'N/A'; +} + function createEdgeNGrams(str) { if (str && str.length > 3) { const minGram = 3 @@ -352,6 +359,62 @@ async function cropFile(file_path, start, end, ext) { }); } +async function checkExistsWithTimeout(filePath, timeout) { + return new Promise(function (resolve, reject) { + + var timer = setTimeout(function () { + if (watcher) watcher.close(); + reject(new Error('File did not exists and was not created during the timeout.')); + }, timeout); + + fs.access(filePath, fs.constants.R_OK, function (err) { + if (!err) { + clearTimeout(timer); + if (watcher) watcher.close(); + resolve(); + } + }); + + var dir = path.dirname(filePath); + var basename = path.basename(filePath); + var watcher = fs.watch(dir, function (eventType, filename) { + if (eventType === 'rename' && filename === basename) { + clearTimeout(timer); + if (watcher) watcher.close(); + resolve(); + } + }); + }); +} + +// helper function to download file using fetch +async function fetchFile(url, path, file_label) { + var len = null; + const res = await fetch(url); + + len = parseInt(res.headers.get("Content-Length"), 10); + + var bar = new ProgressBar(` Downloading ${file_label} [:bar] :percent :etas`, { + complete: '=', + incomplete: ' ', + width: 20, + total: len + }); + const fileStream = fs.createWriteStream(path); + await new Promise((resolve, reject) => { + res.body.pipe(fileStream); + res.body.on("error", (err) => { + reject(err); + }); + res.body.on('data', function (chunk) { + bar.tick(chunk.length); + }); + fileStream.on("finish", function() { + resolve(); + }); + }); +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { @@ -389,8 +452,11 @@ module.exports = { getCurrentDownloader: getCurrentDownloader, recFindByExt: recFindByExt, removeFileExtension: removeFileExtension, + formatDateString: formatDateString, cropFile: cropFile, createEdgeNGrams: createEdgeNGrams, wait: wait, + checkExistsWithTimeout: checkExistsWithTimeout, + fetchFile: fetchFile, File: File } diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js new file mode 100644 index 0000000..80432fb --- /dev/null +++ b/backend/youtube-dl.js @@ -0,0 +1,127 @@ +const fs = require('fs-extra'); +const fetch = require('node-fetch'); + +const logger = require('./logger'); +const utils = require('./utils'); +const CONSTS = require('./consts'); +const config_api = require('./config.js'); + +const is_windows = process.platform === 'win32'; + +const download_sources = { + 'youtube-dl': { + 'tags_url': 'https://api.github.com/repos/ytdl-org/youtube-dl/tags', + 'func': downloadLatestYoutubeDLBinary + }, + 'youtube-dlc': { + 'tags_url': 'https://api.github.com/repos/blackjack4494/yt-dlc/tags', + 'func': downloadLatestYoutubeDLCBinary + }, + 'yt-dlp': { + 'tags_url': 'https://api.github.com/repos/yt-dlp/yt-dlp/tags', + 'func': downloadLatestYoutubeDLPBinary + } +} + +exports.checkForYoutubeDLUpdate = async () => { + return new Promise(async resolve => { + const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); + const tags_url = download_sources[default_downloader]['tags_url']; + // get current version + let current_app_details_exists = fs.existsSync(CONSTS.DETAILS_BIN_PATH); + if (!current_app_details_exists) { + logger.warn(`Failed to get youtube-dl binary details at location '${CONSTS.DETAILS_BIN_PATH}'. Generating file...`); + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, {"version":"2020.00.00", "downloader": default_downloader}); + } + let current_app_details = JSON.parse(fs.readFileSync(CONSTS.DETAILS_BIN_PATH)); + let current_version = current_app_details['version']; + let current_downloader = current_app_details['downloader']; + let stored_binary_path = current_app_details['path']; + if (!stored_binary_path || typeof stored_binary_path !== 'string') { + // logger.info(`INFO: Failed to get youtube-dl binary path at location: ${CONSTS.DETAILS_BIN_PATH}, attempting to guess actual path...`); + const guessed_base_path = 'node_modules/youtube-dl/bin/'; + const guessed_file_path = guessed_base_path + 'youtube-dl' + (is_windows ? '.exe' : ''); + if (fs.existsSync(guessed_file_path)) { + stored_binary_path = guessed_file_path; + // logger.info('INFO: Guess successful! Update process continuing...') + } else { + logger.error(`Guess '${guessed_file_path}' is not correct. Cancelling update check. Verify that your youtube-dl binaries exist by running npm install.`); + resolve(null); + return; + } + } + + // got version, now let's check the latest version from the youtube-dl API + + + fetch(tags_url, {method: 'Get'}) + .then(async res => res.json()) + .then(async (json) => { + // check if the versions are different + if (!json || !json[0]) { + logger.error(`Failed to check ${default_downloader} version for an update.`) + resolve(null); + return; + } + const latest_update_version = json[0]['name']; + if (current_version !== latest_update_version || default_downloader !== current_downloader) { + // versions different or different downloader is being used, download new update + resolve(latest_update_version); + } else { + resolve(null); + } + return; + }) + .catch(err => { + logger.error(`Failed to check ${default_downloader} version for an update.`) + logger.error(err); + resolve(null); + return; + }); + }); +} + +exports.updateYoutubeDL = async (latest_update_version) => { + const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); + await download_sources[default_downloader]['func'](latest_update_version); +} + +async function downloadLatestYoutubeDLBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/ytdl-org/youtube-dl/releases/latest/download/youtube-dl${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `youtube-dl ${new_version}`); + + updateDetailsJSON(new_version, 'youtube-dl'); +} + +async function downloadLatestYoutubeDLCBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/blackjack4494/yt-dlc/releases/latest/download/youtube-dlc${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `youtube-dlc ${new_version}`); + + updateDetailsJSON(new_version, 'youtube-dlc'); +} + +async function downloadLatestYoutubeDLPBinary(new_version) { + const file_ext = is_windows ? '.exe' : ''; + + const download_url = `https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp${file_ext}`; + const output_path = `node_modules/youtube-dl/bin/youtube-dl${file_ext}`; + + await utils.fetchFile(download_url, output_path, `yt-dlp ${new_version}`); + + updateDetailsJSON(new_version, 'yt-dlp'); +} + +function updateDetailsJSON(new_version, downloader) { + const details_json = fs.readJSONSync(CONSTS.DETAILS_BIN_PATH); + if (new_version) details_json['version'] = new_version; + details_json['downloader'] = downloader; + fs.writeJSONSync(CONSTS.DETAILS_BIN_PATH, details_json); +} diff --git a/docker-build.sh b/docker-build.sh new file mode 100644 index 0000000..2a81d43 --- /dev/null +++ b/docker-build.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +# THANK YOU TALULAH (https://github.com/nottalulah) for your help in figuring this out +# and also optimizing some code with this commit. +# xoxo :D + +case $(uname -m) in + x86_64) + ARCH=amd64;; + aarch64) + ARCH=arm64;; + armhf) + ARCH=armhf;; + armv7) + ARCH=armel;; + armv7l) + ARCH=armel;; + *) + echo "Unsupported architecture: $(uname -m)" + exit 1 +esac + +echo "(INFO) Architecture detected: $ARCH" +echo "(1/5) READY - Acquire temp dependencies in ffmpeg obtain layer" +apt-get update && apt-get -y install curl xz-utils +echo "(2/5) DOWNLOAD - Acquire latest ffmpeg and ffprobe from John van Sickle's master-sourced builds in ffmpeg obtain layer" +curl -o ffmpeg.txz \ + --connect-timeout 5 \ + --max-time 10 \ + --retry 5 \ + --retry-delay 0 \ + --retry-max-time 40 \ + "https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-${ARCH}-static.tar.xz" +mkdir /tmp/ffmpeg +tar xf ffmpeg.txz -C /tmp/ffmpeg +echo "(3/5) CLEANUP - Remove temp dependencies from ffmpeg obtain layer" +apt-get -y remove curl xz-utils +apt-get -y autoremove +echo "(4/5) PROVISION - Provide ffmpeg and ffprobe from ffmpeg obtain layer" +cp /tmp/ffmpeg/*/ffmpeg /usr/local/bin/ffmpeg +cp /tmp/ffmpeg/*/ffprobe /usr/local/bin/ffprobe +echo "(5/5) CLEANUP - Remove temporary downloads from ffmpeg obtain layer" +rm -rf /tmp/ffmpeg ffmpeg.txz \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2d0d73e..60aef89 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,8 @@ services: ytdl_use_local_db: 'false' write_ytdl_config: 'true' restart: always + depends_on: + - ytdl-mongo-db volumes: - ./appdata:/app/appdata - ./audio:/app/audio @@ -23,5 +25,6 @@ services: logging: driver: "none" container_name: mongo-db + restart: always volumes: - ./db/:/data/db \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2ac2dfa..06f052e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,171 +4,231 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", - "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", + "@ampproject/remapping": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" + "@jridgewell/resolve-uri": "^3.0.3", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1303.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.3.tgz", + "integrity": "sha512-WRVVBCzLlMqRZVhZXGASHzNJK/OCAvl/DTGhlLuJDIjF7lVGnXHjtwNM8ilYZq949OnC3fly5Z61TfhbN/OHCg==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.3", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular-devkit/build-angular": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1100.4.tgz", - "integrity": "sha512-qVkMbtOwlo+k8fvOBOwwfKWMx06k4I1qrdjpRYAoZCt3cdje4EBepSciLrHnTB+ouIqWxpEDfEXTYBS98tXbBg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.3.tgz", + "integrity": "sha512-iEpNF3tF+9Gw+qQKL63fPFHIvWokJdrgVU4GzENQ5QeL8zk8iYTEbH3jWogq5tWy5+VmNP/mKkasq9i78lRiYw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/build-optimizer": "0.1100.4", - "@angular-devkit/build-webpack": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@babel/core": "7.12.3", - "@babel/generator": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/runtime": "7.12.1", - "@babel/template": "7.10.4", - "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "11.0.4", + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1303.3", + "@angular-devkit/build-webpack": "0.1303.3", + "@angular-devkit/core": "13.3.3", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.3.3", "ansi-colors": "4.1.1", - "autoprefixer": "9.8.6", - "babel-loader": "8.1.0", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", - "cacache": "15.0.5", - "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.0", - "copy-webpack-plugin": "6.2.1", - "core-js": "3.6.5", - "css-loader": "4.3.0", - "cssnano": "4.1.10", - "file-loader": "6.1.1", - "find-cache-dir": "3.3.1", - "glob": "7.1.6", - "inquirer": "7.3.3", - "jest-worker": "26.5.0", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild": "0.14.22", + "esbuild-wasm": "0.14.22", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", "karma-source-map-support": "1.4.0", - "less": "3.12.2", - "less-loader": "7.0.2", - "license-webpack-plugin": "2.3.1", - "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.2.1", - "minimatch": "3.0.4", - "open": "7.3.0", - "ora": "5.1.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.5", + "open": "8.4.0", + "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "pnp-webpack-plugin": "1.6.4", - "postcss": "7.0.32", - "postcss-import": "12.0.1", - "postcss-loader": "4.0.4", - "raw-loader": "4.0.2", - "regenerator-runtime": "0.13.7", - "resolve-url-loader": "3.1.2", - "rimraf": "3.0.2", - "rollup": "2.32.1", - "rxjs": "6.6.3", - "sass": "1.27.0", - "sass-loader": "10.0.5", - "semver": "7.3.2", - "source-map": "0.7.3", - "source-map-loader": "1.1.2", - "source-map-support": "0.5.19", - "speed-measure-webpack-plugin": "1.3.3", - "style-loader": "2.0.0", - "stylus": "0.54.8", - "stylus-loader": "4.3.1", - "terser": "5.3.7", - "terser-webpack-plugin": "4.2.3", + "piscina": "3.2.0", + "postcss": "8.4.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.49.9", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.11.0", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "4.44.2", - "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.0", - "webpack-merge": "5.2.0", - "webpack-sources": "2.0.1", - "webpack-subresource-integrity": "1.5.1", - "worker-plugin": "5.0.0" + "tslib": "2.3.1", + "webpack": "5.70.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/highlight": "^7.16.7" + } + }, + "@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", + "gensync": "^1.0.0-beta.2", "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", + "semver": "^6.3.0", "source-map": "^0.5.0" }, "dependencies": { "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", "dev": true }, + "esbuild": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz", + "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.14.22", + "esbuild-darwin-64": "0.14.22", + "esbuild-darwin-arm64": "0.14.22", + "esbuild-freebsd-64": "0.14.22", + "esbuild-freebsd-arm64": "0.14.22", + "esbuild-linux-32": "0.14.22", + "esbuild-linux-64": "0.14.22", + "esbuild-linux-arm": "0.14.22", + "esbuild-linux-arm64": "0.14.22", + "esbuild-linux-mips64le": "0.14.22", + "esbuild-linux-ppc64le": "0.14.22", + "esbuild-linux-riscv64": "0.14.22", + "esbuild-linux-s390x": "0.14.22", + "esbuild-netbsd-64": "0.14.22", + "esbuild-openbsd-64": "0.14.22", + "esbuild-sunos-64": "0.14.22", + "esbuild-windows-32": "0.14.22", + "esbuild-windows-64": "0.14.22", + "esbuild-windows-arm64": "0.14.22" + } + }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -179,445 +239,672 @@ "path-is-absolute": "^1.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz", - "integrity": "sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw==", - "dev": true, - "requires": { - "loader-utils": "2.0.0", - "source-map": "0.7.3", - "tslib": "2.0.3", - "typescript": "4.0.5", - "webpack-sources": "2.0.1" - }, - "dependencies": { + }, "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1100.4.tgz", - "integrity": "sha512-uxe8gNSej3KF1FgqNtJmuRDbbINh3yLtXanXhRxFQLUj8IiNR8IciIVvy6RfXC5gqxcWwy1cOefJLLnuN9AOxQ==", + "version": "0.1303.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.3.tgz", + "integrity": "sha512-v/z/YgwrAzYn1LfN9OHNxqcThyyg4LLx28hmHzDs5gyDShAK189y34EoT9uQ+lCyQrPVhP7UKACCxCdSwOEJiA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" + "@angular-devkit/architect": "0.1303.3", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.3.tgz", + "integrity": "sha512-lfQwY9LuVRwcNVzGmyPcwOpb3CAobP4T+c3joR1LLIPS5lzcM0oeCE2bon9N52Ktn4Q/pH98dVtjWL+jSrUADw==", "requires": { - "ajv": "6.12.6", + "ajv": "8.9.0", + "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.6.3", + "rxjs": "6.6.7", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@angular-devkit/schematics": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", - "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.3.tgz", + "integrity": "sha512-S8UNlw6IoR/kxBYbiwesuA7oJGSnFkD6bJwVLhpHdT6Sqrz2/IrjHcNgTJRAvhsOKIbfDtMtXRzl/PUdWEfgyw==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "ora": "5.1.0", - "rxjs": "6.6.3" + "@angular-devkit/core": "13.3.3", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "@angular/animations": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.0.4.tgz", - "integrity": "sha512-NI7UdLNdzTfLCDu0zVqwhdKq2z1flRsM2GCD9RHG/NRjlohh73uRTBW+BcYpfh+o+Wq4giiq8UkTIgS2ReqDGg==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.4.tgz", + "integrity": "sha512-cXjjbzYR2hda9BDAu0teJUVbbA03jJTK53vIYnDLIAvN20YRPo9LqINxpUlbAzH6hE8v5xF2LLnAXcaQROVpIw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/cdk": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-11.0.2.tgz", - "integrity": "sha512-hdZ9UJVGgCFhdOuB4RPS1Ku45VSG/WfRjbyxu/7teYyFKqAvcd3vawkeQfZf+lExmFaeW43+5hnpu/JIlGTrSA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.4.tgz", + "integrity": "sha512-im4LKxJaIuqFVzmtf650PoiYsn/SZlvBV2zEgzusK8HwQ24C1Lya7NQSApwl8k43h4eKO1OvUKBjqL5uDgEQag==", "requires": { "parse5": "^5.0.0", - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/cli": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.0.4.tgz", - "integrity": "sha512-VkE/gx6P80EJHg13fG+gkZfd2DJmRaDAtnamcCGM4AThzoUN9XBdxc24uMLEzBb0/mJ4vpMK9+WTNIdMmzl+Tg==", + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.3.tgz", + "integrity": "sha512-a+nnzFP1FfnypXpAhrHbIBaJcxzegWLZUvVzJQwt6P2z60IoHdvTVmyNbY89qI0LE1SrAokEUO1zW3Yjmu7fUw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "@schematics/angular": "11.0.4", - "@schematics/update": "0.1100.4", + "@angular-devkit/architect": "0.1303.3", + "@angular-devkit/core": "13.3.3", + "@angular-devkit/schematics": "13.3.3", + "@schematics/angular": "13.3.3", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "4.2.0", - "ini": "1.3.5", - "inquirer": "7.3.3", - "npm-package-arg": "8.1.0", - "npm-pick-manifest": "6.1.0", - "open": "7.3.0", - "pacote": "9.5.12", - "resolve": "1.18.1", - "rimraf": "3.0.2", - "semver": "7.3.2", - "symbol-observable": "2.0.3", - "universal-analytics": "0.4.23", - "uuid": "8.3.1" + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.3", + "resolve": "1.22.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true } } }, "@angular/common": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-11.0.4.tgz", - "integrity": "sha512-4R2ALj71J6EAHVCKNnHHCKL7wcosMsv3gcMXbMTE+Wpzo3khEhM0Tej+I1qmMbVmGXVlRb//4+rjE4gff6FvQw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.4.tgz", + "integrity": "sha512-vPZuUGWMXz6r30obBqH+iIG4Feq4YEK/4wUks7PEYGke8MXFPYsNKuHMhKCgYEhabD/4Mo4GEp3i18/3Kk72Mw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/compiler": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-11.0.4.tgz", - "integrity": "sha512-Smf8FKSjkqd522ZCdXjSnVv1lYA0b21AN3WC5L1mwtRwyl/VacqCA/YEklLneDGgI2FdSIC9+bzSQIV+CCVftA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.4.tgz", + "integrity": "sha512-Yf1Dv2BVytjmv5Nnv05hUciUOH/UpKgXG1Ql5XwQG/qGV4eEs33PJBtGsUJTPuddxfRm72JMsbZcoRjVADqbcw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/compiler-cli": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-11.0.4.tgz", - "integrity": "sha512-FV010O6GAldRe5sr+qegHe7oLinTylES70NX+0PIp44/W4tPx75Zvop+FVT90I4xPcvFvteLemy8nFAnMK+x5g==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.4.tgz", + "integrity": "sha512-wCnt2YOS5EiwWCEv8oCqIfiwUtifs+COhcYH6fpmf/3X9w1yKO1ZMA+OsFQ0IVS4d0YYavm5DTPQ2ep2c0sF5w==", "dev": true, "requires": { - "@babel/core": "^7.8.6", - "@babel/types": "^7.8.6", - "canonical-path": "1.0.0", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.7.2", - "fs-extra": "4.0.2", - "magic-string": "^0.25.0", - "minimist": "^1.2.0", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", - "semver": "^6.3.0", - "source-map": "^0.6.1", + "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", - "tslib": "^2.0.0", - "yargs": "^16.1.1" + "tslib": "^2.3.0", + "yargs": "^17.2.1" }, "dependencies": { - "@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "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 + }, + "magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "sourcemap-codec": "^1.4.8" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } }, "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", "dev": true } } }, "@angular/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.0.4.tgz", - "integrity": "sha512-860cTMjdCHcvEsHOsTzpg5rThxwVgtnY4yT0SgboWiphrlzX+aNoyN/cCJHxWhmOTRlrl6/+hkeRq95E2BZkKw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.4.tgz", + "integrity": "sha512-PqPwx9oaV0Bh0m0fdI2jtXUC6s04jfD4vyzB4sjEuRI9pRUnZ6M5hZ5Vn/KJVZyt411MevbJfqzUVf0W+GDZew==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/forms": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-11.0.4.tgz", - "integrity": "sha512-Fhfc4buwMZk0WumDvl/X7XBnOKFeTRTJrwKdi8LlhY6o1Og8H4e/f69u9iDJCF3YjU4qC6yGtPp9YpSVCPP7Ew==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.4.tgz", + "integrity": "sha512-QHyUXOKYITysaJJ4VnmBacE69oz0rw4G7Y2lhPb2V3a1XsWeO61SZEeGMfAWo7sLoDvi2MCEWNEhl1du4dK14A==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/language-service": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.0.4.tgz", - "integrity": "sha512-KtQxVSlZi3SwZEN4E56KHkNTFEYa3FPZfLJFm6WD1dSobFyMwJgvztO08GWSaT4S0ht0NNRD2IRt0XzBYuZkag==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-13.3.4.tgz", + "integrity": "sha512-9k2q9TJaTG2QgIDNLUVOPCdzYRXLOw4aKiHTeMeIJOw4Zhp2dV7I4oX/aC/a1AN86JIO6m5nujeVf4SkK95WSw==", "dev": true }, "@angular/localize": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-11.0.4.tgz", - "integrity": "sha512-r0dWvwFvEqQJ/H94rr548S092Hq53RqyMANuFD09CpkWXS6yAWBfArB6mW77PARnicEC0zkbi5qMGACjtSyNtA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-13.3.4.tgz", + "integrity": "sha512-T55072wuH4jFweHA0cYhKaomitjxEpyVMro3QA9+SaBMy10yAP2Z1h1vA16A/vXxqVy8oSrmuda4UwMOwZv3Aw==", "requires": { - "@babel/core": "7.8.3", - "glob": "7.1.2", - "yargs": "^16.1.1" + "@babel/core": "7.17.2", + "glob": "7.2.0", + "yargs": "^17.2.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" + } } }, "@angular/material": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-11.0.2.tgz", - "integrity": "sha512-qmLxrIcbbowXrE0+ZiGA/RXfaZTtVKtgLchn7GvI+R5DZ79g5IicTPxayzQavLJSTESX19JTjlByRSGiXJstgA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.4.tgz", + "integrity": "sha512-jK9rWmBaPrE+3re6uIdyvG5DCzc47VUvnP1DqblNnpaa8GCKllb1cFRGqa5GPYB1/96d3wO+RPwzhC06qqV+yw==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/platform-browser": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-11.0.4.tgz", - "integrity": "sha512-+uUCKJgspSghJ3R6Fk0XHA0tolbaRBi8JFS2cY+hi9s27WKB88peGvtsK6RCOPJONY6JdOuhpcZqRN8dKfPi7w==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.4.tgz", + "integrity": "sha512-IjBOkjrIVIbbZCDQJRdel0FSDcExSLDgMxcCSQ6pKa6oR/t59BJpSpOhB1W9nRwLtvMmGYkS/oyLFsKk65UoYA==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/platform-browser-dynamic": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.4.tgz", - "integrity": "sha512-ZOWTZaFfZSHhMy7a0RIxipiZoiobHWrGlq8/YaMrIgzUb9Fv518FeFCCI68BP0/GuyxX74MJmzv4ZgQctKKxXw==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.4.tgz", + "integrity": "sha512-UApjgrL6B3QTdSYoCOPzMvFDmSewAHrLpreLYEmADutMWkD0ZcTPux4MJp8awT4P3l6wKzBeGJIKLlk8zsXmGQ==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, "@angular/router": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-11.0.4.tgz", - "integrity": "sha512-B0sqv8zMM6j88+udEZzO8wKBw61pHgWZmLopnAqA65rRPrAvMsvAHUnYqX6w5pYqhJQxCVLVeKM+0QlQh1+WnA==", + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.4.tgz", + "integrity": "sha512-UuMAjWHoFKF8b9gFOiqL7fpVXjIr89BtxVES3yXReVq/IZJz9gWup6lYK3KMja+F8HZB8LBUMYgtqjS9iyLV/Q==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" }, "dependencies": { "tslib": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", - "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "dev": true, + "requires": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, "@babel/code-frame": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", - "dev": true + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==" }, "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", + "version": "7.17.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz", + "integrity": "sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==", "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", + "@ampproject/remapping": "^2.0.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.17.2", + "@babel/parser": "^7.17.0", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.0", + "@babel/types": "^7.17.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "@ampproject/remapping": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", + "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.0" + } + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, "@babel/generator": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.5.tgz", - "integrity": "sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", "requires": { - "@babel/types": "^7.12.5", + "@babel/types": "^7.17.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -630,274 +917,266 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", - "dev": true, + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", - "browserslist": "^4.14.5", - "semver": "^5.5.0" + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "regexpu-core": "^4.7.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, "dependencies": { - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - } + "@babel/types": "^7.16.7" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", - "requires": { - "@babel/types": "^7.10.4" + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", - "dev": true, + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.17.0" } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", - "dev": true, + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" } } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz", - "integrity": "sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", - "dev": true, + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.17.0" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" - }, - "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", "dev": true }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" + }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" } }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" } }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", @@ -905,141 +1184,186 @@ } }, "@babel/parser": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.7.tgz", - "integrity": "sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg==" + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==" }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", - "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-dynamic-import": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -1052,12 +1376,21 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1141,418 +1474,462 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", "dev": true, "requires": { - "regenerator-transform": "^0.14.2" + "regenerator-transform": "^0.15.0" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz", - "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", - "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", - "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", - "semver": "^5.5.0" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -1563,78 +1940,136 @@ } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + } } }, "@babel/traverse": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.9.tgz", - "integrity": "sha512-iX9ajqnLdoU1s1nHt36JDI9KG4k+vmI8WgjK5d+aDTwQbL2fUnzedNedssA645Ede3PM2ma1n8Q4h2ohwXgMXw==", + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" + }, + "@babel/highlight": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } } } }, "@babel/types": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.7.tgz", - "integrity": "sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" } } }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, "@electron/get": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.9.0.tgz", - "integrity": "sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz", + "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==", "dev": true, "requires": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", + "global-agent": "^3.0.0", "global-tunnel-ng": "^2.7.1", "got": "^9.6.0", "progress": "^2.0.3", - "sanitize-filename": "^1.6.2", + "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "dependencies": { @@ -1648,6 +2083,12 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -1713,6 +2154,17 @@ } } }, + "@fontsource/material-icons": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@fontsource/material-icons/-/material-icons-4.5.4.tgz", + "integrity": "sha512-YGmXkkEdu6EIgpFKNmB/nIXzZocwSmbI01Ninpmml8x8BT0M6RR++V1KqOfpzZ6Cw/FQ2/KYonQ3x4IY/4VRRA==" + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", @@ -1730,25 +2182,58 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true - }, - "@jsdevtools/coverage-istanbul-loader": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz", - "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==", + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "convert-source-map": "^1.7.0", - "istanbul-lib-instrument": "^4.0.3", - "loader-utils": "^2.0.0", - "merge-source-map": "^1.1.0", - "schema-utils": "^2.7.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" } }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", + "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==" + } + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, "@ngneat/content-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@ngneat/content-loader/-/content-loader-5.0.0.tgz", @@ -1765,15 +2250,10 @@ } }, "@ngtools/webpack": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.0.4.tgz", - "integrity": "sha512-MAV7inQmsMISTnDcXwyRX5oJZx8F7K/tZRLJciQwkM0DqZyq8fI9KDRwBcmYeQ+J0mSJV9LUVdExmpulpkywqw==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "enhanced-resolve": "5.3.1", - "webpack-sources": "2.0.1" - } + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.3.tgz", + "integrity": "sha512-O6EzafKfFuvI3Ju941u7ANs0mT7YDdChbVRhVECCPWOTm3Klr73js3bnCDzaJlxZNjzlG/KeUu5ghrhbMrHjSw==", + "dev": true }, "@nodelib/fs.scandir": { "version": "2.1.3", @@ -1801,13 +2281,87 @@ "fastq": "^1.6.0" } }, - "@npmcli/move-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", "dev": true, "requires": { - "mkdirp": "^1.0.4" + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" }, "dependencies": { "mkdirp": { @@ -1818,45 +2372,42 @@ } } }, - "@schematics/angular": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.0.4.tgz", - "integrity": "sha512-LwBD9TIoLy9XqqInJvlN4BHtPyJExyeorNiOp6rXb/wafuDbvZ+9kY9GWZTY1auVo5PNKqErfxr74ydA3FFb9g==", + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "jsonc-parser": "2.3.1" + "infer-owner": "^1.0.4" } }, - "@schematics/update": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1100.4.tgz", - "integrity": "sha512-YwFtgxCQQkYC89IC7dfshyGr0roE6bpp5HgpQLdS/AOjHeZKo7/SPdM0W4ddB+Fml1Fo6v4eFG/Ia9oR7qNv1A==", + "@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", - "npm-package-arg": "^8.0.0", - "pacote": "9.5.12", - "semver": "7.3.2", - "semver-intersect": "1.4.0" - }, - "dependencies": { - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@schematics/angular": { + "version": "13.3.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.3.tgz", + "integrity": "sha512-kX5ghVCmWHcMN+g0pUaFuIJzwrXsVnK4bfid8DckU4EEtfFSv3UA5I1QNJRgpCPxTPhNEAk+3ePN8nzDSjdU+w==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.3", + "@angular-devkit/schematics": "13.3.3", + "jsonc-parser": "3.0.0" } }, "@sindresorhus/is": { @@ -1865,6 +2416,12 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -1874,25 +2431,135 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, "@types/core-js": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-2.5.3.tgz", "integrity": "sha512-F9RHpjuPSit4dCCRXgi7XcqA01DAjy9QY+v9yICoxXsjXD9cgQpyZyL2eSZnTkBGXGaQnea8waZOZTogLDB+rA==", "dev": true }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", "integrity": "sha512-g1QUuhYVVAamfCifK7oB7G3aIl4BbOyzDOqVyUfEr4tfBKrXfeH+M+Tg7HKCXSrbzxYdhyCP7z9WbKo0R2hBCw==", "dev": true }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "requires": { - "@types/minimatch": "*", "@types/node": "*" } }, @@ -1903,15 +2570,15 @@ "dev": true }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, "@types/node": { @@ -1926,10 +2593,22 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, "@types/selenium-webdriver": { @@ -1938,29 +2617,41 @@ "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "@types/webpack-sources": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", - "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", "dev": true, "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" } }, "@typescript-eslint/eslint-plugin": { @@ -2159,185 +2850,156 @@ } }, "@videogular/ngx-videogular": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@videogular/ngx-videogular/-/ngx-videogular-2.1.0.tgz", - "integrity": "sha512-YVTutwUc5j1JN7x2FGlX4KR8t7E3h8bqDg1H9oqxk80nsjqIC/opY8zlKsKpULs0ZaSmTfsjKrzVAu6WdBXIzg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@videogular/ngx-videogular/-/ngx-videogular-5.0.1.tgz", + "integrity": "sha512-ITA3GZBzh0XoCAGQzucAX+q7h72z43kG8G9ZspLMAfyvl2Z2MEHMfC6ct6hzSWTfqr48x62Avl935dcdl/NgXQ==", "requires": { "tslib": "^1.11.1 || ^2.0.0" } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -2359,20 +3021,16 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { @@ -2386,9 +3044,15 @@ } }, "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", "dev": true }, "acorn-jsx": { @@ -2398,13 +3062,26 @@ "dev": true }, "adjust-sourcemap-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz", - "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "requires": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } } }, "adm-zip": { @@ -2413,12 +3090,6 @@ "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -2429,11 +3100,13 @@ } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, @@ -2451,6 +3124,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2458,11 +3132,31 @@ "uri-js": "^4.2.2" } }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } }, "ajv-keywords": { "version": "3.5.2", @@ -2470,12 +3164,6 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2483,24 +3171,24 @@ "dev": true }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -2511,9 +3199,9 @@ } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -2527,11 +3215,34 @@ "dev": true }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -2551,30 +3262,6 @@ "commander": "^2.11.0" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -2593,18 +3280,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -2700,18 +3375,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2725,18 +3388,17 @@ "dev": true }, "autoprefixer": { - "version": "9.8.6", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", - "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "version": "10.4.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", + "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", - "colorette": "^1.2.1", + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001317", + "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" } }, "aws-sign2": { @@ -2761,29 +3423,17 @@ } }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -2803,6 +3453,21 @@ "emojis-list": "^3.0.0", "json5": "^1.0.1" } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -2815,78 +3480,62 @@ "object.assign": "^4.1.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -2926,11 +3575,29 @@ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, "blocking-proxy": { "version": "1.0.1", @@ -2941,18 +3608,6 @@ "minimist": "^1.2.0" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -3015,9 +3670,9 @@ "dev": true }, "boolean": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", "dev": true, "optional": true }, @@ -3039,115 +3694,16 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.15.0.tgz", - "integrity": "sha512-IJ1iysdMkGmjjYeRlDU8PQejVwxvVO5QOfXH7ylW31GO6LwNRSmm/SgRXtNsEXqMLl2e+2H5eEJ7sfynF8TCaQ==", - "dev": true, + "version": "4.20.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", + "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", "requires": { - "caniuse-lite": "^1.0.30001164", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.612", + "caniuse-lite": "^1.0.30001317", + "electron-to-chromium": "^1.4.84", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^2.0.2", + "picocolors": "^1.0.0" } }, "browserstack": { @@ -3160,14 +3716,13 @@ } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-crc32": { @@ -3188,24 +3743,12 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -3219,11 +3762,12 @@ "dev": true }, "cacache": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", - "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, "requires": { + "@npmcli/fs": "^1.0.0", "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3238,15 +3782,15 @@ "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", - "ssri": "^8.0.0", + "ssri": "^8.0.1", "tar": "^6.0.2", "unique-filename": "^1.1.1" }, "dependencies": { "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3265,23 +3809,6 @@ } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -3298,9 +3825,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" @@ -3313,76 +3840,39 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true } } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", "dev": true }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", - "dev": true - }, - "canonical-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "version": "1.0.30001332", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", + "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==" }, "caseless": { "version": "0.12.0", @@ -3407,19 +3897,30 @@ "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "chownr": { @@ -3429,60 +3930,16 @@ "dev": true }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true }, "clean-stack": { "version": "2.2.0", @@ -3500,9 +3957,9 @@ } }, "cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -3547,17 +4004,6 @@ "mimic-response": "^1.0.0" } }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, "codelyzer": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.1.tgz", @@ -3609,29 +4055,15 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true + }, + "zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "dev": true } } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3645,20 +4077,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true }, "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", - "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, "colors": { @@ -3688,33 +4116,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "dev": true, - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -3774,9 +4181,9 @@ } }, "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "optional": true, "requires": { @@ -3819,25 +4226,27 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "content-type": { @@ -3847,17 +4256,17 @@ "dev": true }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", "requires": { "safe-buffer": "~5.1.1" } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "cookie-signature": { @@ -3866,104 +4275,126 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "is-what": "^3.14.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "copy-webpack-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz", - "integrity": "sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", "dev": true, "requires": { - "cacache": "^15.0.5", - "fast-glob": "^3.2.4", - "find-cache-dir": "^3.3.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.1", - "loader-utils": "^2.0.0", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", "normalize-path": "^3.0.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "webpack-sources": "^1.4.3" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "dependencies": { - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "yocto-queue": "^0.1.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "fast-deep-equal": "^3.1.3" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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, + "requires": { + "is-glob": "^4.0.3" + }, + "dependencies": { + "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, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -3974,12 +4405,12 @@ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.2.tgz", + "integrity": "sha512-Fns9lU06ZJ07pdfmPMu7OnkIKGPKDzXKIiuGlSvHHapwqMUF2QnnsWwtueFZtSyZEilP0o6iUeHQwpn7LxtLUw==", "dev": true, "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.20.2", "semver": "7.0.0" }, "dependencies": { @@ -3997,93 +4428,120 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "object-assign": "^4", + "vary": "^1" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "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 + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "crypto-js": { @@ -4092,15 +4550,14 @@ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "dev": true, "requires": { - "inherits": "^2.0.3", + "inherits": "^2.0.4", "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "source-map-resolve": "^0.6.0" }, "dependencies": { "source-map": { @@ -4111,46 +4568,44 @@ } } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" } }, "css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "requires": { - "camelcase": "^6.0.0", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", - "semver": "^7.3.2" + "semver": "^7.3.5" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -4158,33 +4613,25 @@ } } }, - "css-parse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", - "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", - "dev": true, - "requires": { - "css": "^2.0.0" - } + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true }, "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, "css-selector-tokenizer": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", @@ -4195,28 +4642,10 @@ "fastparse": "^1.1.2" } }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssauron": { @@ -4228,144 +4657,24 @@ "through": "X.X.X" } }, + "cssdb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", - "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -4382,9 +4691,9 @@ } }, "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", "dev": true }, "debug": { @@ -4437,13 +4746,12 @@ "dev": true }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" } }, "defaults": { @@ -4461,6 +4769,12 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -4470,122 +4784,85 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "@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" + } + }, + "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, + "requires": { + "is-glob": "^4.0.1" } }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "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" } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "braces": "^3.0.2", + "picomatch": "^2.3.1" } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true } } }, @@ -4595,6 +4872,12 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -4602,21 +4885,11 @@ "dev": true }, "dependency-graph": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -4641,25 +4914,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4676,9 +4930,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -4716,52 +4970,40 @@ } }, "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "requires": { "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", - "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", - "dev": true - } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "domelementtype": "^2.2.0" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } }, "duplexer3": { @@ -4770,18 +5012,6 @@ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -4799,45 +5029,29 @@ "dev": true }, "electron": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-8.2.0.tgz", - "integrity": "sha512-mnV43gKCrCUMHLmGws/DU/l8LhaxrFD53A4ofwtthdCqOZWGIdk1+eMphiVumXR5a3lC64XVvmXQ2k28i7F/zw==", + "version": "13.6.6", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.6.tgz", + "integrity": "sha512-TP2Bl1nTxaH1yRmlYiF7imzvKE/NASE0cl6wOYA3AaP/UrBGc4L3NwJfn5Z55o+1t4TH8vCRxENufESyb32HhA==", "dev": true, "requires": { "@electron/get": "^1.0.1", - "@types/node": "^12.0.12", + "@types/node": "^14.6.2", "extract-zip": "^1.0.3" - } - }, - "electron-to-chromium": { - "version": "1.3.621", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.621.tgz", - "integrity": "sha512-FeIuBzArONbAmKmZIsZIFGu/Gc9AVGlVeVbhCq+G2YIl6QkT0TDn2HKN/FMf1btXEB9kEmIuQf3/lBTVAbmFOg==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "@types/node": { + "version": "14.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.12.tgz", + "integrity": "sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==", "dev": true } } }, + "electron-to-chromium": { + "version": "1.4.118", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz", + "integrity": "sha512-maZIKjnYDvF7Fs35nvVcyr44UcKNwybr93Oba2n3HkKDFAtk0svERkLN/HyczJDS3Fo4wU9th9fUQd09ZLtj1w==" + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4860,15 +5074,17 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "requires": { "iconv-lite": "^0.6.2" }, "dependencies": { "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -4885,102 +5101,69 @@ } }, "engine.io": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", - "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" }, "dependencies": { "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, - "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", - "dev": true - } - } - }, - "engine.io-client": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", - "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" - }, - "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "ws": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", - "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true } } }, "engine.io-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", - "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "@socket.io/base64-arraybuffer": "~1.0.2" } }, "enhanced-resolve": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", - "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" }, "dependencies": { "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true } } @@ -5001,28 +5184,29 @@ "dev": true }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true }, "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "optional": true, "requires": { "prr": "~1.0.1" } @@ -5036,47 +5220,11 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true }, "es6-error": { "version": "4.1.1", @@ -5085,17 +5233,6 @@ "dev": true, "optional": true }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -5111,15 +5248,144 @@ "es6-promise": "^4.0.3" } }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "esbuild-android-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz", + "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==", "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz", + "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz", + "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz", + "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz", + "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz", + "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz", + "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz", + "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz", + "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz", + "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz", + "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz", + "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz", + "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz", + "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz", + "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz", + "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz", + "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz", + "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz", + "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz", + "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==", + "dev": true, + "optional": true }, "escalade": { "version": "3.1.1", @@ -5381,12 +5647,12 @@ } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -5488,6 +5754,12 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -5495,43 +5767,34 @@ "dev": true }, "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + } } }, "exit": { @@ -5540,68 +5803,18 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -5615,25 +5828,59 @@ "on-finished": "~2.3.0", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", "statuses": "~1.5.0", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5643,27 +5890,80 @@ "ms": "2.0.0" } }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dev": true, - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", - "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "dev": true + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true } } @@ -5674,27 +5974,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -5706,71 +5985,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -5852,9 +6066,9 @@ } }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -5869,12 +6083,6 @@ "pend": "~1.2.0" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -5893,29 +6101,6 @@ "flat-cache": "^3.0.4" } }, - "file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, "file-saver": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz", @@ -5968,9 +6153,9 @@ } }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -5978,25 +6163,6 @@ "pkg-dir": "^4.1.0" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -6006,30 +6172,6 @@ "semver": "^6.0.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "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 - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -6039,12 +6181,13 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "fingerprintjs2": { @@ -6071,31 +6214,15 @@ } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "forever-agent": { @@ -6116,19 +6243,16 @@ } }, "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true }, "fresh": { "version": "0.5.2", @@ -6136,25 +6260,30 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fs-extra": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", - "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", - "dev": true, + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } } }, "fs-minipass": { @@ -6166,17 +6295,11 @@ "minipass": "^3.0.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true }, "fs.realpath": { "version": "1.0.0", @@ -6184,9 +6307,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -6202,12 +6325,56 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "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 + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6219,9 +6386,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -6229,6 +6396,12 @@ "has-symbols": "^1.0.1" } }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -6238,12 +6411,6 @@ "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -6257,6 +6424,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6267,43 +6435,44 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, "global-agent": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", - "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "optional": true, "requires": { - "boolean": "^3.0.0", - "core-js": "^3.6.4", + "boolean": "^3.0.1", "es6-error": "^4.1.1", - "matcher": "^2.1.0", - "roarr": "^2.15.2", - "semver": "^7.1.2", - "serialize-error": "^5.0.0" + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" }, "dependencies": { - "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", - "dev": true, - "optional": true - }, "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -6326,9 +6495,9 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", "dev": true, "optional": true, "requires": { @@ -6336,17 +6505,75 @@ } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, "requires": { - "array-union": "^2.1.0", + "array-union": "^3.0.1", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@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" + } + }, + "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, + "requires": { + "is-glob": "^4.0.1" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } } }, "got": { @@ -6371,8 +6598,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { "version": "2.0.1", @@ -6380,6 +6606,27 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -6422,153 +6669,53 @@ } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-value": { + "has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "has-symbols": "^1.0.2" } }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" } }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -6586,28 +6733,10 @@ "wbuf": "^1.1.0" } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-escaper": { @@ -6649,6 +6778,12 @@ } } }, + "http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -6661,147 +6796,38 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "debug": "4" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" } }, "http-signature": { @@ -6815,12 +6841,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -6842,6 +6862,12 @@ } } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -6861,13 +6887,10 @@ } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true }, "ieee754": { "version": "1.2.1", @@ -6875,12 +6898,6 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", @@ -6888,9 +6905,9 @@ "dev": true }, "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -6909,24 +6926,28 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "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, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "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 + } } }, "imurmurhash": { @@ -6941,18 +6962,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -6980,21 +6989,22 @@ "dev": true }, "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", + "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.19", + "lodash": "^4.17.21", "mute-stream": "0.0.8", + "ora": "^5.4.1", "run-async": "^2.4.0", - "rxjs": "^6.6.0", + "rxjs": "^7.2.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6" @@ -7010,9 +7020,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -7040,11 +7050,14 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } }, "supports-color": { "version": "7.2.0", @@ -7054,70 +7067,35 @@ "requires": { "has-flag": "^4.0.0" } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true } } }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "requires": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-arrayish": { @@ -7135,102 +7113,28 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "has-tostringtag": "^1.0.0" } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-extglob": { @@ -7259,10 +7163,10 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", "dev": true }, "is-number": { @@ -7271,35 +7175,23 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } + "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 + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -7311,59 +7203,37 @@ } }, "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-retina": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", - "integrity": "sha1-10AbKGvqKuN/Ykd1iN5QTQuGR+M=" - }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true }, "is-wsl": { @@ -7382,9 +7252,9 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", - "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", "dev": true }, "isexe": { @@ -7412,17 +7282,24 @@ "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz", + "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==", "dev": true, "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "dependencies": { + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -7575,14 +7452,14 @@ "dev": true }, "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" }, "dependencies": { "has-flag": { @@ -7592,9 +7469,9 @@ "dev": true }, "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==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -7646,16 +7523,20 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "json-schema-ref-parser": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", + "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", + "dev": true, + "requires": { + "@apidevtools/json-schema-ref-parser": "9.0.9" + } }, "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==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -7669,24 +7550,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "dev": true }, "jsonfile": { @@ -7705,21 +7577,29 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "dependencies": { + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + } } }, "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.9.1.tgz", + "integrity": "sha512-H9A60xPqJ1CuC4Ka6qxzXZeU8aNmgOeP5IFqwJbQQwtu2EUYxota3LdsiZWplF7Wgd9tkAd0mdu36nceSaPuYw==", "dev": true, "requires": { "lie": "~3.3.0", @@ -7729,92 +7609,74 @@ } }, "karma": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", - "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", "dev": true, "requires": { "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.0.0", - "colors": "^1.4.0", + "chokidar": "^3.5.1", + "colors": "1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", - "flatted": "^2.0.2", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.15", - "log4js": "^6.2.1", - "mime": "^2.4.5", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^2.3.0", + "socket.io": "^4.2.0", "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.21", - "yargs": "^15.3.1" + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" } }, - "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==", + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "optional": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -7825,41 +7687,44 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "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, "requires": { - "p-locate": "^4.1.0" + "is-glob": "^4.0.1" } }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "minimist": "^1.2.5" } }, - "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 + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } }, "source-map": { "version": "0.6.1", @@ -7875,52 +7740,6 @@ "requires": { "rimraf": "^3.0.0" } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -7996,12 +7815,6 @@ "json-buffer": "3.0.0" } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -8009,25 +7822,27 @@ "dev": true }, "klona": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", - "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", "dev": true, "requires": { + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", "source-map": "~0.6.0", - "tslib": "^1.10.0" + "tslib": "^2.3.0" }, "dependencies": { "source-map": { @@ -8038,35 +7853,20 @@ "optional": true }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true } } }, "less-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.0.2.tgz", - "integrity": "sha512-7MKlgjnkCf63E3Lv6w2FvAEgLMx3d/tNBExITcanAq7ys5U8VPWT3F6xcRjYmdNfkoQ9udoVFb1r2azSiTnD6w==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", "dev": true, "requires": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "klona": "^2.0.4" } }, "levn": { @@ -8080,31 +7880,12 @@ } }, "license-webpack-plugin": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.1.tgz", - "integrity": "sha512-yhqTmlYIEpZWA122lf6E0G8+rkn0AzoQ1OpzUKKs/lXUqG1plmGnwmkuuPlfggzJR5y6DLOdot/Tv00CC51CeQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "requires": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "webpack-sources": "^3.0.0" } }, "lie": { @@ -8117,42 +7898,37 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true }, "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.clonedeep": { "version": "4.5.0", @@ -8160,10 +7936,10 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, "lodash.merge": { @@ -8178,19 +7954,14 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^4.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "dependencies": { "ansi-styles": { @@ -8203,9 +7974,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -8245,24 +8016,29 @@ } }, "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "dev": true, "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -8303,169 +8079,73 @@ "dev": true }, "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", "dev": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { + "agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "debug": "4" } }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "matcher": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", - "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "dev": true, "optional": true, "requires": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^4.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "optional": true } } }, "material-icons": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-0.5.4.tgz", - "integrity": "sha512-5ycazkNmIOtV78Ff3WgvxQESoJuujdRm0cNbf18fmyJN20jHyqp9rpwi4EfQyGimag0ZLElxtVg3H9enIKdOOw==" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.10.8.tgz", + "integrity": "sha512-CbtQXCmC9MXIIkz/0CmEfxELosxKxLegrjoa0mxM0zPA+GgAuhnWX6ITo/5oON/JFaCi/bh4MydEUNu0erbaxw==" }, "media-typer": { "version": "0.3.0", @@ -8473,14 +8153,13 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "fs-monkey": "1.0.3" } }, "merge-descriptors": { @@ -8489,23 +8168,6 @@ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -8534,24 +8196,6 @@ "picomatch": "^2.0.5" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -8586,41 +8230,51 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz", - "integrity": "sha512-G3yw7/TQaPfkuiR73MDcyiqhyP8SnbmLhUbpC76H+wtQxA6wfKhMCQOCb6wnPK0dQbjORAeOILQqEesg4/wF7A==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", "dev": true, "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -8631,12 +8285,6 @@ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -8646,14 +8294,15 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true }, "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -8668,6 +8317,18 @@ "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -8677,6 +8338,16 @@ "minipass": "^3.0.0" } }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, "minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -8686,6 +8357,15 @@ "minipass": "^3.0.0" } }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -8696,45 +8376,6 @@ "yallist": "^4.0.0" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", @@ -8744,45 +8385,6 @@ "minimist": "^1.2.5" } }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8815,31 +8417,11 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "dev": true, - "optional": true + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true }, "natural-compare": { "version": "1.4.0", @@ -8847,6 +8429,30 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -8854,15 +8460,9 @@ "dev": true }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "ng-lazyload-image": { @@ -8870,106 +8470,136 @@ "resolved": "https://registry.npmjs.org/ng-lazyload-image/-/ng-lazyload-image-7.1.0.tgz", "integrity": "sha512-1fip2FdPBDRnjGyBokI/DupBxOnrKh2lbtT8X8N1oPbE3KBZXXl82VIKcK2Sx+XQD67/+VtFzlISmrgsatzYuw==" }, - "ngx-avatar": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ngx-avatar/-/ngx-avatar-4.0.0.tgz", - "integrity": "sha512-Uk40UXl26RvDy1ori9NDsGFB+f84AaxMnsIwZA6JPJK0pLcbo3F4vZTmzLZeOusOw1Qtgk5IzF630jo06keXwQ==", + "ngx-avatars": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ngx-avatars/-/ngx-avatars-1.3.1.tgz", + "integrity": "sha512-8ciKom5hQrzqAQX8YDPk/cDBNmg14v3GC2kURPpqQ0AqgLIdvT72FoxUPyd8XsuulndHF7e4zx6C7Bh1tmJm3g==", "requires": { - "is-retina": "^1.0.3", - "ts-md5": "^1.2.4" + "ts-md5": "^1.2.11", + "tslib": "^2.3.1" + }, + "dependencies": { + "ts-md5": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.11.tgz", + "integrity": "sha512-vAwy9rEuRE6a8xa1MavIVkLFyyU0ydk4CLMFA5vOVccmQKLOuGb/BHm3oEN7XHf2FoqS+z0pSvhaad/ombd1Vg==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } } }, "ngx-file-drop": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-9.0.1.tgz", - "integrity": "sha512-xtUUjGMr9c8wwSfA4Cyy0iZMPLnBOg9i32A3tHOPfEivRrn9evULvxriCM45Qz6HpuuqA7vZGxGZZTCUIj/h3A==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/ngx-file-drop/-/ngx-file-drop-13.0.0.tgz", + "integrity": "sha512-1OF9ln2ZesfNxWEBXMpkkFpUuggejpZtNlGFuyaVAmXyYO4NlCHsOWrgfWB7d8SliHgePD/7s0e60IQs/zqr9g==", "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "tslib": "^2.0.0" } }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, - "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", - "dev": true + "node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "dev": true, + "optional": true }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node-releases": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", + "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - } + "abbrev": "1" } }, "normalize-path": { @@ -8984,16 +8614,10 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", - "dev": true - }, "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -9029,9 +8653,9 @@ }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9046,20 +8670,20 @@ "dev": true }, "npm-package-arg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.0.tgz", - "integrity": "sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", "dev": true, "requires": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9068,31 +8692,49 @@ } }, "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "npm-pick-manifest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", - "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", "dev": true, "requires": { "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.0.0", - "semver": "^7.0.0" + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -9101,85 +8743,250 @@ } }, "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" }, "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.6.tgz", + "integrity": "sha512-9a/MLxGaw3LEGes0HaPez2RgZWDV6X0jrgChsuxfEh8xoDoYGxaGrkMe7Dlyjrb655tA/b8fX0qlUg6Ii5MBvw==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", + "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", "dev": true }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "make-fetch-happen": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz", + "integrity": "sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.2", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^9.0.0" + }, + "dependencies": { + "minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + } + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "ssri": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", + "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } } } }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" } }, "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9192,50 +8999,13 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, "requires": { - "call-bind": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.1.3" } }, @@ -9245,15 +9015,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -9266,38 +9027,6 @@ "object-keys": "^1.1.1" } }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -9337,28 +9066,38 @@ } }, "open": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", - "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "openapi-typescript-codegen": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.21.0.tgz", + "integrity": "sha512-wohx5b03jNfPVKocNoyzu7zVscPoRjyq/G/P5Bdtsjeze2BkXiLxd8uwkVCESQx6Sid4xihohKUgDy4MO09nsg==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "camelcase": "^6.3.0", + "commander": "^9.0.0", + "handlebars": "^4.7.7", + "json-schema-ref-parser": "^9.0.9" }, "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", "dev": true } } @@ -9378,17 +9117,18 @@ } }, "ora": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", - "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "requires": { + "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", + "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, @@ -9403,9 +9143,9 @@ } }, "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -9444,55 +9184,18 @@ } } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -9503,12 +9206,12 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -9521,12 +9224,13 @@ } }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, "requires": { - "retry": "^0.12.0" + "@types/retry": "^0.12.0", + "retry": "^0.13.1" } }, "p-try": { @@ -9536,195 +9240,36 @@ "dev": true }, "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^12.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true } } @@ -9735,17 +9280,6 @@ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9763,28 +9297,23 @@ } } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true }, "parse5": { "version": "5.1.1", @@ -9810,6 +9339,23 @@ } } }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parse5-sax-parser": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", @@ -9827,46 +9373,16 @@ } } }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "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 }, "path-is-absolute": { @@ -9881,15 +9397,16 @@ "dev": true }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -9903,19 +9420,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -9928,6 +9432,11 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -9955,22 +9464,25 @@ "pinkie": "^2.0.0" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "requires": { - "find-up": "^3.0.0" + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" } }, - "pnp-webpack-plugin": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", - "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "ts-pnp": "^1.1.6" + "find-up": "^4.0.0" } }, "portfinder": { @@ -9994,225 +9506,196 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" } }, - "postcss-calc": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", - "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dev": true, "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" + "postcss-selector-parser": "^6.0.2" } }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss-value-parser": "^4.2.0" } }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true + }, + "postcss-custom-properties": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", + "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss-value-parser": "^4.2.0" } }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss-selector-parser": "^6.0.4" } }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-double-position-gradients": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true + }, + "postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true + }, + "postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" } }, "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true + }, + "postcss-lab-function": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" } }, "postcss-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.4.tgz", - "integrity": "sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "klona": "^2.0.5", + "semver": "^7.3.5" }, "dependencies": { - "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "import-fresh": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", - "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "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 - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -10220,440 +9703,162 @@ } } }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" } }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "postcss-nesting": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss-selector-parser": "^6.0.10" } }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true + }, + "postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" } }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "postcss-pseudo-class-any-link": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "postcss-selector-parser": "^6.0.10" } }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } + "balanced-match": "^1.0.0" } }, "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", "dev": true, "requires": { "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", "util-deprecate": "^1.0.2" } }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prelude-ls": { @@ -10662,10 +9867,16 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, "process-nextick-args": { @@ -10687,19 +9898,19 @@ "dev": true }, "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "dependencies": { "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true } } @@ -10711,15 +9922,6 @@ "dev": true, "optional": true }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -11080,20 +10282,29 @@ } }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true + "dev": true, + "optional": true }, "psl": { "version": "1.8.0", @@ -11101,28 +10312,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -11133,40 +10322,11 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -11179,24 +10339,6 @@ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11206,16 +10348,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -11242,29 +10374,6 @@ } } }, - "raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -11282,6 +10391,16 @@ } } }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -11298,9 +10417,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -11313,45 +10432,35 @@ "dev": true }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", "dev": true }, "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, "regex-parser": { "version": "2.2.11", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", @@ -11359,34 +10468,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "functions-have-names": "^1.2.2" } }, "regexpp": { @@ -11395,16 +10484,30 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, + "regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -11418,24 +10521,6 @@ } } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -11480,8 +10565,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -11499,90 +10583,39 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "requires": { - "adjust-sourcemap-loader": "3.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", "source-map": "0.6.1" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "emojis-list": "^3.0.0", + "json5": "^2.1.2" } }, "source-map": { @@ -11590,15 +10623,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -11621,16 +10645,10 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { @@ -11639,46 +10657,10 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", - "dev": true - }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rimraf": { @@ -11706,24 +10688,14 @@ } } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "roarr": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.2.tgz", - "integrity": "sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, "optional": true, "requires": { - "boolean": "^3.0.0", + "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", @@ -11740,15 +10712,6 @@ } } }, - "rollup": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", - "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - } - }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -11761,15 +10724,6 @@ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -11795,50 +10749,31 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", "dev": true, "requires": { - "chokidar": ">=2.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sass-loader": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.5.tgz", - "integrity": "sha512-2LqoNPtKkZq/XbXNQ4C64GFEleSEHKv6NPSI+bMC/l+jpEXGJhiRYkAQToO24MR7NU4JRY2RpLpJ/gjo2Uf13w==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dev": true, "requires": { "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" }, "dependencies": { "neo-async": { @@ -11846,26 +10781,6 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -11881,8 +10796,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "2.7.1", @@ -11948,18 +10862,19 @@ } }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "semver-compare": { "version": "1.0.0", @@ -11977,19 +10892,10 @@ "semver": "^5.3.0" } }, - "semver-intersect": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", - "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, - "requires": { - "semver": "^5.0.0" - } - }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", "dev": true, "requires": { "debug": "2.6.9", @@ -11999,9 +10905,9 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.8.1", "mime": "1.6.0", - "ms": "2.1.1", + "ms": "2.1.3", "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" @@ -12024,37 +10930,62 @@ } } }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true } } }, "serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "optional": true, "requires": { - "type-fest": "^0.8.0" + "type-fest": "^0.13.1" }, "dependencies": { "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "optional": true } } }, "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -12117,15 +11048,15 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.17.2" } }, "set-blocking": { @@ -12140,51 +11071,12 @@ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -12195,43 +11087,26 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - } - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -12276,383 +11151,171 @@ } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "ms": "2.1.2" } } } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", - "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", - "dev": true, - "requires": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, "socket.io-adapter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", - "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", "dev": true }, - "socket.io-client": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", - "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", + "@types/component-emitter": "^1.2.10", "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" + "debug": "~4.3.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "socket.io-parser": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", - "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - } - } - }, - "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true } } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true } } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", "dev": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" }, "dependencies": { "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" } } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, "source-map-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.2.tgz", - "integrity": "sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dev": true, "requires": { "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "source-map": "^0.6.1", - "whatwg-mimetype": "^2.3.0" + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" }, "dependencies": { "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "decode-uri-component": "^0.2.0" } }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -12667,49 +11330,11 @@ } } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -12750,24 +11375,6 @@ } } }, - "speed-measure-webpack-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", - "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -12800,106 +11407,21 @@ "minipass": "^3.1.1" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", "dev": true, "requires": { - "date-format": "^2.1.0", + "date-format": "^4.0.3", "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } + "fs-extra": "^10.0.0" } }, "string-width": { @@ -12912,26 +11434,6 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -12949,10 +11451,10 @@ "ansi-regex": "^5.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { @@ -12961,82 +11463,33 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", - "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, "stylus": { - "version": "0.54.8", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", - "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", "dev": true, "requires": { - "css-parse": "~2.0.0", - "debug": "~3.1.0", + "css": "^3.0.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -13046,50 +11499,57 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, "stylus-loader": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.1.tgz", - "integrity": "sha512-apDYJEM5ZpOAWbWInWcsbtI8gHNr/XYVcSY/tWqOUPt7M5tqhtwXVsAkgyiVjhuvw2Yrjq474a9H+g4d047Ebw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", "dev": true, "requires": { - "fast-glob": "^3.2.4", + "fast-glob": "^3.2.7", "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^3.0.0" + "normalize-path": "^3.0.0" }, "dependencies": { - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@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" } + }, + "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, + "requires": { + "is-glob": "^4.0.1" + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true } } }, @@ -13110,31 +11570,16 @@ "has-flag": "^3.0.0" } }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, "table": { @@ -13172,15 +11617,15 @@ } }, "tapable": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", - "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true }, "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -13200,49 +11645,37 @@ } }, "terser": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", - "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" } }, "terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" + "terser": "^5.7.2" }, "dependencies": { - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -13252,15 +11685,32 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } } } @@ -13277,37 +11727,12 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13317,61 +11742,17 @@ "os-tmpdir": "~1.0.2" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13403,20 +11784,6 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", - "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } - }, - "ts-md5": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.7.tgz", - "integrity": "sha512-emODogvKGWi1KO1l9c6YxLMBn6CEH3VrH5mVPIyOtxBG52BvV4jP3GWz6bOZCz61nLgBc3ffQYE4+EHfCD+V7w==" - }, "ts-node": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.0.6.tgz", @@ -13492,12 +11859,6 @@ } } }, - "ts-pnp": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", - "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", - "dev": true - }, "tsconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", @@ -13573,12 +11934,6 @@ } } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", @@ -13601,12 +11956,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -13617,9 +11966,9 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "type-is": { @@ -13632,6 +11981,12 @@ "mime-types": "~2.1.24" } }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -13639,66 +11994,49 @@ "dev": true }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==" + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" }, "ua-parser-js": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", - "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, + "uglify-js": { + "version": "3.15.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.4.tgz", + "integrity": "sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==", + "dev": true, + "optional": true + }, "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true }, "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, "unique-filename": { @@ -13719,17 +12057,6 @@ "imurmurhash": "^0.1.4" } }, - "universal-analytics": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", - "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "request": "^2.88.2", - "uuid": "^3.0.0" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -13742,58 +12069,6 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -13802,40 +12077,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -13843,90 +12084,20 @@ "dev": true, "requires": { "prepend-http": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -13954,16 +12125,6 @@ "user-home": "^1.1.1" } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -13979,12 +12140,6 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", - "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", - "dev": true - }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -13996,12 +12151,6 @@ "extsprintf": "^1.2.0" } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -14009,244 +12158,13 @@ "dev": true }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "wbuf": { @@ -14267,11 +12185,6 @@ "defaults": "^1.0.3" } }, - "web-animations-js": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/web-animations-js/-/web-animations-js-2.3.2.tgz", - "integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA==" - }, "webdriver-js-extender": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", @@ -14283,823 +12196,234 @@ } }, "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } } } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "default-gateway": "^6.0.3", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^6.0.1" } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true } } }, "webpack-merge": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.2.0.tgz", - "integrity": "sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -15107,56 +12431,28 @@ } }, "webpack-sources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", - "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", - "dev": true, - "requires": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true }, "webpack-subresource-integrity": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.1.tgz", - "integrity": "sha512-uekbQ93PZ9e7BFB8Hl9cFIVYQyQqiXp2ExKk9Zv+qZfH/zHXHrCFAfw1VW0+NqWbTWrs/HnuDrto3+tiPXh//Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "requires": { - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "typed-assert": "^1.0.8" } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -15166,12 +12462,6 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -15187,6 +12477,15 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -15199,45 +12498,11 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "worker-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-5.0.0.tgz", - "integrity": "sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true }, "wrap-ansi": { "version": "7.0.0", @@ -15278,12 +12543,33 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true + }, + "xliff": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/xliff/-/xliff-4.4.0.tgz", + "integrity": "sha512-SVzjB3hTHJ/CbsIJtbQg2BAxhvVJqbZ3OluMS7u6JnCbf0/twuj2KASghYHiKHz2sJqZo42dGjydp0URKmWWoA==", "requires": { - "async-limiter": "~1.0.0" + "xml-js": "1.6.11" + } + }, + "xliff-to-json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/xliff-to-json/-/xliff-to-json-1.0.4.tgz", + "integrity": "sha512-shxNrU2ZzFbyvRxVIff0KxYyU0nNP8/AZsLCEW4Pb+p7Ei11FIr8hFmmbk3EqXzBgbNrVHVB9FPUNpLQ3ADakw==", + "requires": { + "xliff": "^4.4.0" + } + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" } }, "xml2js": { @@ -15302,18 +12588,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.2.tgz", - "integrity": "sha512-tYOaldF/0BLfKuoA39QMwD4j2m8lq4DIncqj1yuNELX4vz9+z/ieG/vwmctjJce+boFHXstqhWnHSxc4W8f4qg==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", @@ -15326,15 +12600,16 @@ "dev": true }, "yaml": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", - "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15348,7 +12623,8 @@ "yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true }, "yauzl": { "version": "2.10.0", @@ -15360,28 +12636,26 @@ "fd-slicer": "~1.1.0" } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true }, - "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 - }, "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "requires": { + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + } + } } } } diff --git a/package.json b/package.json index ad1f6f9..43dd6cb 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", + "build": "ng build --configuration production", + "prebuild": "node src/postbuild.mjs", "heroku-postbuild": "npm install --prefix backend", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e", - "electron": "ng build --base-href ./ && electron ." + "electron": "ng build --base-href ./ && electron .", + "generate": "openapi --input ./\"Public API v1.yaml\" --output ./src/api-types --exportCore false --exportServices false --exportModels true" }, "engines": { "node": "12.3.1", @@ -18,42 +20,44 @@ }, "private": true, "dependencies": { - "@angular-devkit/core": "^11.0.4", - "@angular/animations": "^11.0.4", - "@angular/cdk": "^11.0.2", - "@angular/common": "^11.0.4", - "@angular/compiler": "^11.0.4", - "@angular/core": "^11.0.4", - "@angular/forms": "^11.0.4", - "@angular/localize": "^11.0.4", - "@angular/material": "^11.0.2", - "@angular/platform-browser": "^11.0.4", - "@angular/platform-browser-dynamic": "^11.0.4", - "@angular/router": "^11.0.4", + "@angular-devkit/core": "^13.3.3", + "@angular/animations": "^13.3.4", + "@angular/cdk": "^13.3.4", + "@angular/common": "^13.3.4", + "@angular/compiler": "^13.3.4", + "@angular/core": "^13.3.4", + "@angular/forms": "^13.3.4", + "@angular/localize": "^13.3.4", + "@angular/material": "^13.3.4", + "@angular/platform-browser": "^13.3.4", + "@angular/platform-browser-dynamic": "^13.3.4", + "@angular/router": "^13.3.4", + "@fontsource/material-icons": "^4.5.4", "@ngneat/content-loader": "^5.0.0", - "@videogular/ngx-videogular": "^2.1.0", + "@videogular/ngx-videogular": "^5.0.1", "core-js": "^2.4.1", "crypto-js": "^4.1.1", "file-saver": "^2.0.2", "filesize": "^6.1.0", "fingerprintjs2": "^2.1.0", - "material-icons": "^0.5.4", + "fs-extra": "^10.0.0", + "material-icons": "^1.10.8", "nan": "^2.14.1", "ng-lazyload-image": "^7.0.1", - "ngx-avatar": "^4.0.0", - "ngx-file-drop": "^9.0.1", + "ngx-avatars": "^1.3.1", + "ngx-file-drop": "^13.0.0", "rxjs": "^6.6.3", "rxjs-compat": "^6.0.0-rc.0", "tslib": "^2.0.0", - "typescript": "~4.0.5", - "web-animations-js": "^2.3.2", - "zone.js": "~0.10.2" + "typescript": "~4.6.3", + "xliff-to-json": "^1.0.4", + "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.1100.4", - "@angular/cli": "^11.0.4", - "@angular/compiler-cli": "^11.0.4", - "@angular/language-service": "^11.0.4", + "@angular-devkit/build-angular": "^13.3.3", + "@angular/cli": "^13.3.3", + "@angular/compiler-cli": "^13.3.4", + "@angular/language-service": "^13.3.4", "@types/core-js": "^2.5.2", "@types/file-saver": "^2.0.1", "@types/jasmine": "~3.6.0", @@ -61,16 +65,17 @@ "@typescript-eslint/eslint-plugin": "^4.29.0", "@typescript-eslint/parser": "^4.29.0", "codelyzer": "^6.0.0", - "electron": "^8.0.1", + "electron": "^13.6.6", "eslint": "^7.32.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", - "karma": "~5.0.0", + "karma": "~6.3.16", "karma-chrome-launcher": "~3.1.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", + "openapi-typescript-codegen": "^0.21.0", "protractor": "~7.0.0", "ts-node": "~3.0.4", "tslint": "~6.1.0" diff --git a/src/_palette.scss b/src/_palette.scss index 90bc8bd..ee0753b 100644 --- a/src/_palette.scss +++ b/src/_palette.scss @@ -1,11 +1,11 @@ /* Coolors Exported Palette - coolors.co/e8aeb7-b8e1ff-a9fff7-94fbab-82aba1 */ /* HSL */ -$color1: hsla(351%, 56%, 80%, 1); -$softblue: hsla(205%, 100%, 86%, 1); -$color3: hsla(174%, 100%, 83%, 1); -$color4: hsla(133%, 93%, 78%, 1); -$color5: hsla(165%, 20%, 59%, 1); +$color1: hsla(351, 56%, 80%, 1); +$softblue: hsla(205, 100%, 86%, 1); +$color3: hsla(174, 100%, 83%, 1); +$color4: hsla(133, 93%, 78%, 1); +$color5: hsla(165, 20%, 59%, 1); /* RGB */ $color1: rgba(232, 174, 183, 1); diff --git a/src/api-types/index.ts b/src/api-types/index.ts new file mode 100644 index 0000000..43f0f06 --- /dev/null +++ b/src/api-types/index.ts @@ -0,0 +1,111 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type { AddFileToPlaylistRequest } from './models/AddFileToPlaylistRequest'; +export type { BaseChangePermissionsRequest } from './models/BaseChangePermissionsRequest'; +export type { body_19 } from './models/body_19'; +export type { body_20 } from './models/body_20'; +export type { Category } from './models/Category'; +export { CategoryRule } from './models/CategoryRule'; +export type { ChangeRolePermissionsRequest } from './models/ChangeRolePermissionsRequest'; +export type { ChangeUserPermissionsRequest } from './models/ChangeUserPermissionsRequest'; +export type { CheckConcurrentStreamRequest } from './models/CheckConcurrentStreamRequest'; +export type { CheckConcurrentStreamResponse } from './models/CheckConcurrentStreamResponse'; +export type { ConcurrentStream } from './models/ConcurrentStream'; +export type { Config } from './models/Config'; +export type { ConfigResponse } from './models/ConfigResponse'; +export type { CreateCategoryRequest } from './models/CreateCategoryRequest'; +export type { CreateCategoryResponse } from './models/CreateCategoryResponse'; +export type { CreatePlaylistRequest } from './models/CreatePlaylistRequest'; +export type { CreatePlaylistResponse } from './models/CreatePlaylistResponse'; +export type { CropFileSettings } from './models/CropFileSettings'; +export type { DatabaseFile } from './models/DatabaseFile'; +export { DBBackup } from './models/DBBackup'; +export type { DBInfoResponse } from './models/DBInfoResponse'; +export type { DeleteCategoryRequest } from './models/DeleteCategoryRequest'; +export type { DeleteMp3Mp4Request } from './models/DeleteMp3Mp4Request'; +export type { DeletePlaylistRequest } from './models/DeletePlaylistRequest'; +export type { DeleteSubscriptionFileRequest } from './models/DeleteSubscriptionFileRequest'; +export type { DeleteUserRequest } from './models/DeleteUserRequest'; +export type { Download } from './models/Download'; +export type { DownloadArchiveRequest } from './models/DownloadArchiveRequest'; +export type { DownloadFileRequest } from './models/DownloadFileRequest'; +export type { DownloadRequest } from './models/DownloadRequest'; +export type { DownloadResponse } from './models/DownloadResponse'; +export type { DownloadTwitchChatByVODIDRequest } from './models/DownloadTwitchChatByVODIDRequest'; +export type { DownloadTwitchChatByVODIDResponse } from './models/DownloadTwitchChatByVODIDResponse'; +export type { DownloadVideosForSubscriptionRequest } from './models/DownloadVideosForSubscriptionRequest'; +export type { File } from './models/File'; +export { FileType } from './models/FileType'; +export type { GenerateArgsResponse } from './models/GenerateArgsResponse'; +export type { GenerateNewApiKeyResponse } from './models/GenerateNewApiKeyResponse'; +export type { GetAllCategoriesResponse } from './models/GetAllCategoriesResponse'; +export type { GetAllDownloadsRequest } from './models/GetAllDownloadsRequest'; +export type { GetAllDownloadsResponse } from './models/GetAllDownloadsResponse'; +export type { GetAllFilesResponse } from './models/GetAllFilesResponse'; +export type { GetAllSubscriptionsResponse } from './models/GetAllSubscriptionsResponse'; +export type { GetAllTasksResponse } from './models/GetAllTasksResponse'; +export type { GetDBBackupsResponse } from './models/GetDBBackupsResponse'; +export type { GetDownloadRequest } from './models/GetDownloadRequest'; +export type { GetDownloadResponse } from './models/GetDownloadResponse'; +export type { GetFileFormatsRequest } from './models/GetFileFormatsRequest'; +export type { GetFileFormatsResponse } from './models/GetFileFormatsResponse'; +export type { GetFileRequest } from './models/GetFileRequest'; +export type { GetFileResponse } from './models/GetFileResponse'; +export type { GetFullTwitchChatRequest } from './models/GetFullTwitchChatRequest'; +export type { GetFullTwitchChatResponse } from './models/GetFullTwitchChatResponse'; +export type { GetLogsRequest } from './models/GetLogsRequest'; +export type { GetLogsResponse } from './models/GetLogsResponse'; +export type { GetMp3sResponse } from './models/GetMp3sResponse'; +export type { GetMp4sResponse } from './models/GetMp4sResponse'; +export type { GetPlaylistRequest } from './models/GetPlaylistRequest'; +export type { GetPlaylistResponse } from './models/GetPlaylistResponse'; +export type { GetPlaylistsRequest } from './models/GetPlaylistsRequest'; +export type { GetPlaylistsResponse } from './models/GetPlaylistsResponse'; +export type { GetRolesResponse } from './models/GetRolesResponse'; +export type { GetSubscriptionRequest } from './models/GetSubscriptionRequest'; +export type { GetSubscriptionResponse } from './models/GetSubscriptionResponse'; +export type { GetTaskRequest } from './models/GetTaskRequest'; +export type { GetTaskResponse } from './models/GetTaskResponse'; +export type { GetUsersResponse } from './models/GetUsersResponse'; +export type { IncrementViewCountRequest } from './models/IncrementViewCountRequest'; +export type { inline_response_200_15 } from './models/inline_response_200_15'; +export type { LoginRequest } from './models/LoginRequest'; +export type { LoginResponse } from './models/LoginResponse'; +export type { Playlist } from './models/Playlist'; +export type { RegisterRequest } from './models/RegisterRequest'; +export type { RegisterResponse } from './models/RegisterResponse'; +export type { RestoreDBBackupRequest } from './models/RestoreDBBackupRequest'; +export { Schedule } from './models/Schedule'; +export type { SetConfigRequest } from './models/SetConfigRequest'; +export type { SharingToggle } from './models/SharingToggle'; +export type { SubscribeRequest } from './models/SubscribeRequest'; +export type { SubscribeResponse } from './models/SubscribeResponse'; +export type { Subscription } from './models/Subscription'; +export type { SubscriptionRequestData } from './models/SubscriptionRequestData'; +export type { SuccessObject } from './models/SuccessObject'; +export type { TableInfo } from './models/TableInfo'; +export type { Task } from './models/Task'; +export type { TestConnectionStringRequest } from './models/TestConnectionStringRequest'; +export type { TestConnectionStringResponse } from './models/TestConnectionStringResponse'; +export type { TransferDBRequest } from './models/TransferDBRequest'; +export type { TransferDBResponse } from './models/TransferDBResponse'; +export type { TwitchChatMessage } from './models/TwitchChatMessage'; +export type { UnsubscribeRequest } from './models/UnsubscribeRequest'; +export type { UnsubscribeResponse } from './models/UnsubscribeResponse'; +export type { UpdateCategoriesRequest } from './models/UpdateCategoriesRequest'; +export type { UpdateCategoryRequest } from './models/UpdateCategoryRequest'; +export type { UpdateConcurrentStreamRequest } from './models/UpdateConcurrentStreamRequest'; +export type { UpdateConcurrentStreamResponse } from './models/UpdateConcurrentStreamResponse'; +export type { UpdatePlaylistRequest } from './models/UpdatePlaylistRequest'; +export type { UpdaterStatus } from './models/UpdaterStatus'; +export type { UpdateServerRequest } from './models/UpdateServerRequest'; +export type { UpdateTaskDataRequest } from './models/UpdateTaskDataRequest'; +export type { UpdateTaskScheduleRequest } from './models/UpdateTaskScheduleRequest'; +export type { UpdateUserRequest } from './models/UpdateUserRequest'; +export type { User } from './models/User'; +export { UserPermission } from './models/UserPermission'; +export type { Version } from './models/Version'; +export type { VersionInfoResponse } from './models/VersionInfoResponse'; +export { YesNo } from './models/YesNo'; diff --git a/src/api-types/models/AddFileToPlaylistRequest.ts b/src/api-types/models/AddFileToPlaylistRequest.ts new file mode 100644 index 0000000..b701175 --- /dev/null +++ b/src/api-types/models/AddFileToPlaylistRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface AddFileToPlaylistRequest { + file_uid: string; + playlist_id: string; +} \ No newline at end of file diff --git a/src/api-types/models/BaseChangePermissionsRequest.ts b/src/api-types/models/BaseChangePermissionsRequest.ts new file mode 100644 index 0000000..d548225 --- /dev/null +++ b/src/api-types/models/BaseChangePermissionsRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { UserPermission } from './UserPermission'; +import { YesNo } from './YesNo'; + +export interface BaseChangePermissionsRequest { + permission: UserPermission; + new_value: YesNo; +} \ No newline at end of file diff --git a/src/api-types/models/Category.ts b/src/api-types/models/Category.ts new file mode 100644 index 0000000..055a3d7 --- /dev/null +++ b/src/api-types/models/Category.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { CategoryRule } from './CategoryRule'; + +export interface Category { + name?: string; + uid?: string; + rules?: Array; + /** + * Overrides file output for downloaded files in category + */ + custom_output?: string; +} \ No newline at end of file diff --git a/src/api-types/models/CategoryRule.ts b/src/api-types/models/CategoryRule.ts new file mode 100644 index 0000000..9a8acb9 --- /dev/null +++ b/src/api-types/models/CategoryRule.ts @@ -0,0 +1,26 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CategoryRule { + preceding_operator?: CategoryRule.preceding_operator; + comparator?: CategoryRule.comparator; +} + +export namespace CategoryRule { + + export enum preceding_operator { + OR = 'or', + AND = 'and', + } + + export enum comparator { + INCLUDES = 'includes', + NOT_INCLUDES = 'not_includes', + EQUALS = 'equals', + NOT_EQUALS = 'not_equals', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/ChangeRolePermissionsRequest.ts b/src/api-types/models/ChangeRolePermissionsRequest.ts new file mode 100644 index 0000000..417c8ef --- /dev/null +++ b/src/api-types/models/ChangeRolePermissionsRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; + +export interface ChangeRolePermissionsRequest extends BaseChangePermissionsRequest { + role: string; +} \ No newline at end of file diff --git a/src/api-types/models/ChangeUserPermissionsRequest.ts b/src/api-types/models/ChangeUserPermissionsRequest.ts new file mode 100644 index 0000000..c74dc09 --- /dev/null +++ b/src/api-types/models/ChangeUserPermissionsRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { BaseChangePermissionsRequest } from './BaseChangePermissionsRequest'; + +export interface ChangeUserPermissionsRequest extends BaseChangePermissionsRequest { + user_uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamRequest.ts b/src/api-types/models/CheckConcurrentStreamRequest.ts new file mode 100644 index 0000000..416ab37 --- /dev/null +++ b/src/api-types/models/CheckConcurrentStreamRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CheckConcurrentStreamRequest { + /** + * UID of the concurrent stream + */ + uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/CheckConcurrentStreamResponse.ts b/src/api-types/models/CheckConcurrentStreamResponse.ts new file mode 100644 index 0000000..bd4c70d --- /dev/null +++ b/src/api-types/models/CheckConcurrentStreamResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface CheckConcurrentStreamResponse { + stream: ConcurrentStream; +} \ No newline at end of file diff --git a/src/api-types/models/ConcurrentStream.ts b/src/api-types/models/ConcurrentStream.ts new file mode 100644 index 0000000..19eab7d --- /dev/null +++ b/src/api-types/models/ConcurrentStream.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface ConcurrentStream { + playback_timestamp?: number; + unix_timestamp?: number; + playing?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/Config.ts b/src/api-types/models/Config.ts new file mode 100644 index 0000000..855217a --- /dev/null +++ b/src/api-types/models/Config.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Config { + YoutubeDLMaterial: any; +} \ No newline at end of file diff --git a/src/api-types/models/ConfigResponse.ts b/src/api-types/models/ConfigResponse.ts new file mode 100644 index 0000000..d3ff49a --- /dev/null +++ b/src/api-types/models/ConfigResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Config } from './Config'; + +export interface ConfigResponse { + config_file: Config; + success: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryRequest.ts b/src/api-types/models/CreateCategoryRequest.ts new file mode 100644 index 0000000..0871041 --- /dev/null +++ b/src/api-types/models/CreateCategoryRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CreateCategoryRequest { + name: string; +} \ No newline at end of file diff --git a/src/api-types/models/CreateCategoryResponse.ts b/src/api-types/models/CreateCategoryResponse.ts new file mode 100644 index 0000000..16efded --- /dev/null +++ b/src/api-types/models/CreateCategoryResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface CreateCategoryResponse { + new_category?: Category; + success?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistRequest.ts b/src/api-types/models/CreatePlaylistRequest.ts new file mode 100644 index 0000000..2fef41b --- /dev/null +++ b/src/api-types/models/CreatePlaylistRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface CreatePlaylistRequest { + playlistName: string; + uids: Array; + type: FileType; + thumbnailURL: string; +} \ No newline at end of file diff --git a/src/api-types/models/CreatePlaylistResponse.ts b/src/api-types/models/CreatePlaylistResponse.ts new file mode 100644 index 0000000..4cac9cf --- /dev/null +++ b/src/api-types/models/CreatePlaylistResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface CreatePlaylistResponse { + new_playlist: Playlist; + success: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/CropFileSettings.ts b/src/api-types/models/CropFileSettings.ts new file mode 100644 index 0000000..ec8edec --- /dev/null +++ b/src/api-types/models/CropFileSettings.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface CropFileSettings { + cropFileStart: number; + cropFileEnd: number; +} \ No newline at end of file diff --git a/src/api-types/models/DBBackup.ts b/src/api-types/models/DBBackup.ts new file mode 100644 index 0000000..710c591 --- /dev/null +++ b/src/api-types/models/DBBackup.ts @@ -0,0 +1,21 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DBBackup { + name: string; + timestamp: number; + size: number; + source: DBBackup.source; +} + +export namespace DBBackup { + + export enum source { + LOCAL = 'local', + REMOTE = 'remote', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/DBInfoResponse.ts b/src/api-types/models/DBInfoResponse.ts new file mode 100644 index 0000000..543f12b --- /dev/null +++ b/src/api-types/models/DBInfoResponse.ts @@ -0,0 +1,18 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { TableInfo } from './TableInfo'; + +export interface DBInfoResponse { + using_local_db?: boolean; + stats_by_table?: { +files?: TableInfo, +playlists?: TableInfo, +categories?: TableInfo, +subscriptions?: TableInfo, +users?: TableInfo, +roles?: TableInfo, +download_queue?: TableInfo, +}; +} \ No newline at end of file diff --git a/src/api-types/models/DatabaseFile.ts b/src/api-types/models/DatabaseFile.ts new file mode 100644 index 0000000..b1a17c0 --- /dev/null +++ b/src/api-types/models/DatabaseFile.ts @@ -0,0 +1,22 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DatabaseFile { + id: string; + title: string; + thumbnailURL: string; + isAudio: boolean; + /** + * In seconds + */ + duration: number; + url: string; + uploader: string; + size: number; + path: string; + upload_date: string; + uid: string; + sharingEnabled?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/DeleteCategoryRequest.ts b/src/api-types/models/DeleteCategoryRequest.ts new file mode 100644 index 0000000..37db8d5 --- /dev/null +++ b/src/api-types/models/DeleteCategoryRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteCategoryRequest { + category_uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/DeleteMp3Mp4Request.ts b/src/api-types/models/DeleteMp3Mp4Request.ts new file mode 100644 index 0000000..3202c4f --- /dev/null +++ b/src/api-types/models/DeleteMp3Mp4Request.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteMp3Mp4Request { + uid: string; + blacklistMode?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/DeletePlaylistRequest.ts b/src/api-types/models/DeletePlaylistRequest.ts new file mode 100644 index 0000000..76f2f81 --- /dev/null +++ b/src/api-types/models/DeletePlaylistRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface DeletePlaylistRequest { + playlist_id: string; + type: FileType; +} \ No newline at end of file diff --git a/src/api-types/models/DeleteSubscriptionFileRequest.ts b/src/api-types/models/DeleteSubscriptionFileRequest.ts new file mode 100644 index 0000000..7a166a9 --- /dev/null +++ b/src/api-types/models/DeleteSubscriptionFileRequest.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { SubscriptionRequestData } from './SubscriptionRequestData'; + +export interface DeleteSubscriptionFileRequest { + file: string; + file_uid?: string; + sub: SubscriptionRequestData; + /** + * If true, does not remove id from archive. Only valid if youtube-dl archive is enabled in settings. + */ + deleteForever?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/DeleteUserRequest.ts b/src/api-types/models/DeleteUserRequest.ts new file mode 100644 index 0000000..15a1d09 --- /dev/null +++ b/src/api-types/models/DeleteUserRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DeleteUserRequest { + uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/Dictionary.ts b/src/api-types/models/Dictionary.ts new file mode 100644 index 0000000..8ba0443 --- /dev/null +++ b/src/api-types/models/Dictionary.ts @@ -0,0 +1,7 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type Dictionary = { + [key: string]: T; +} diff --git a/src/api-types/models/Download.ts b/src/api-types/models/Download.ts new file mode 100644 index 0000000..d91dd00 --- /dev/null +++ b/src/api-types/models/Download.ts @@ -0,0 +1,26 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Download { + uid: string; + ui_uid?: string; + running: boolean; + finished: boolean; + paused: boolean; + finished_step: boolean; + url: string; + type: string; + title: string; + step_index: number; + percent_complete: number; + timestamp_start: number; + /** + * Error text, set if download fails. + */ + error?: string | null; + user_uid?: string; + sub_id?: string; + sub_name?: string; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadArchiveRequest.ts b/src/api-types/models/DownloadArchiveRequest.ts new file mode 100644 index 0000000..857910c --- /dev/null +++ b/src/api-types/models/DownloadArchiveRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DownloadArchiveRequest { + sub: { +archive_dir: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadFileRequest.ts b/src/api-types/models/DownloadFileRequest.ts new file mode 100644 index 0000000..a874a8c --- /dev/null +++ b/src/api-types/models/DownloadFileRequest.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface DownloadFileRequest { + uid?: string; + uuid?: string; + sub_id?: string; + playlist_id?: string; + url?: string; + type?: FileType; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadRequest.ts b/src/api-types/models/DownloadRequest.ts new file mode 100644 index 0000000..5c6da09 --- /dev/null +++ b/src/api-types/models/DownloadRequest.ts @@ -0,0 +1,44 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { CropFileSettings } from './CropFileSettings'; +import { FileType } from './FileType'; + +export interface DownloadRequest { + url: string; + /** + * Video format code. Overrides other quality options. + */ + customQualityConfiguration?: string; + /** + * Custom command-line arguments for youtube-dl. Overrides all other options, except url. + */ + customArgs?: string; + /** + * Additional command-line arguments for youtube-dl. Added to whatever args would normally be used. + */ + additionalArgs?: string; + /** + * Custom output filename template. + */ + customOutput?: string; + /** + * Login with this account ID + */ + youtubeUsername?: string; + /** + * Account password + */ + youtubePassword?: string; + /** + * Height of the video, if known + */ + selectedHeight?: string; + /** + * Specify ffmpeg/avconv audio quality + */ + maxBitrate?: string; + type?: FileType; + cropFileSettings?: CropFileSettings; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadResponse.ts b/src/api-types/models/DownloadResponse.ts new file mode 100644 index 0000000..3452abc --- /dev/null +++ b/src/api-types/models/DownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Download } from './Download'; + +export interface DownloadResponse { + download?: Download; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts new file mode 100644 index 0000000..8b86a4e --- /dev/null +++ b/src/api-types/models/DownloadTwitchChatByVODIDRequest.ts @@ -0,0 +1,23 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Subscription } from './Subscription'; + +export interface DownloadTwitchChatByVODIDRequest { + /** + * File ID + */ + id: string; + /** + * ID of the VOD + */ + vodId: string; + type: FileType; + /** + * User UID + */ + uuid?: string; + sub?: Subscription; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts new file mode 100644 index 0000000..9771759 --- /dev/null +++ b/src/api-types/models/DownloadTwitchChatByVODIDResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { TwitchChatMessage } from './TwitchChatMessage'; + +export interface DownloadTwitchChatByVODIDResponse { + chat: Array; +} \ No newline at end of file diff --git a/src/api-types/models/DownloadVideosForSubscriptionRequest.ts b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts new file mode 100644 index 0000000..31d0c6d --- /dev/null +++ b/src/api-types/models/DownloadVideosForSubscriptionRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface DownloadVideosForSubscriptionRequest { + subID: string; +} \ No newline at end of file diff --git a/src/api-types/models/File.ts b/src/api-types/models/File.ts new file mode 100644 index 0000000..5114e53 --- /dev/null +++ b/src/api-types/models/File.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface File { + id?: string; +} \ No newline at end of file diff --git a/src/api-types/models/FileType.ts b/src/api-types/models/FileType.ts new file mode 100644 index 0000000..e1b6f79 --- /dev/null +++ b/src/api-types/models/FileType.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum FileType { + AUDIO = 'audio', + VIDEO = 'video', +} \ No newline at end of file diff --git a/src/api-types/models/GenerateArgsResponse.ts b/src/api-types/models/GenerateArgsResponse.ts new file mode 100644 index 0000000..953a57c --- /dev/null +++ b/src/api-types/models/GenerateArgsResponse.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GenerateArgsResponse { + args?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GenerateNewApiKeyResponse.ts b/src/api-types/models/GenerateNewApiKeyResponse.ts new file mode 100644 index 0000000..378a642 --- /dev/null +++ b/src/api-types/models/GenerateNewApiKeyResponse.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GenerateNewApiKeyResponse { + new_api_key: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllCategoriesResponse.ts b/src/api-types/models/GetAllCategoriesResponse.ts new file mode 100644 index 0000000..e34671d --- /dev/null +++ b/src/api-types/models/GetAllCategoriesResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface GetAllCategoriesResponse { + categories: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsRequest.ts b/src/api-types/models/GetAllDownloadsRequest.ts new file mode 100644 index 0000000..5d26f57 --- /dev/null +++ b/src/api-types/models/GetAllDownloadsRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetAllDownloadsRequest { + /** + * Filters downloads with the array + */ + uids?: Array | null; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllDownloadsResponse.ts b/src/api-types/models/GetAllDownloadsResponse.ts new file mode 100644 index 0000000..5367f56 --- /dev/null +++ b/src/api-types/models/GetAllDownloadsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Download } from './Download'; + +export interface GetAllDownloadsResponse { + downloads?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllFilesResponse.ts b/src/api-types/models/GetAllFilesResponse.ts new file mode 100644 index 0000000..d067555 --- /dev/null +++ b/src/api-types/models/GetAllFilesResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetAllFilesResponse { + files: Array; + /** + * All video playlists + */ + playlists: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllSubscriptionsResponse.ts b/src/api-types/models/GetAllSubscriptionsResponse.ts new file mode 100644 index 0000000..485d0cd --- /dev/null +++ b/src/api-types/models/GetAllSubscriptionsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface GetAllSubscriptionsResponse { + subscriptions: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetAllTasksResponse.ts b/src/api-types/models/GetAllTasksResponse.ts new file mode 100644 index 0000000..221d44a --- /dev/null +++ b/src/api-types/models/GetAllTasksResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Task } from './Task'; + +export interface GetAllTasksResponse { + tasks?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetDBBackupsResponse.ts b/src/api-types/models/GetDBBackupsResponse.ts new file mode 100644 index 0000000..b02ced9 --- /dev/null +++ b/src/api-types/models/GetDBBackupsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DBBackup } from './DBBackup'; + +export interface GetDBBackupsResponse { + tasks?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetDownloadRequest.ts b/src/api-types/models/GetDownloadRequest.ts new file mode 100644 index 0000000..49f102a --- /dev/null +++ b/src/api-types/models/GetDownloadRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetDownloadRequest { + download_uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetDownloadResponse.ts b/src/api-types/models/GetDownloadResponse.ts new file mode 100644 index 0000000..69579b5 --- /dev/null +++ b/src/api-types/models/GetDownloadResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Download } from './Download'; + +export interface GetDownloadResponse { + download?: Download; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsRequest.ts b/src/api-types/models/GetFileFormatsRequest.ts new file mode 100644 index 0000000..1ea3502 --- /dev/null +++ b/src/api-types/models/GetFileFormatsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetFileFormatsRequest { + url?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileFormatsResponse.ts b/src/api-types/models/GetFileFormatsResponse.ts new file mode 100644 index 0000000..dc0f859 --- /dev/null +++ b/src/api-types/models/GetFileFormatsResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { File } from './File'; + +export interface GetFileFormatsResponse { + success: boolean; + result: { +formats?: Array, +}; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileRequest.ts b/src/api-types/models/GetFileRequest.ts new file mode 100644 index 0000000..3bb14b1 --- /dev/null +++ b/src/api-types/models/GetFileRequest.ts @@ -0,0 +1,17 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface GetFileRequest { + /** + * Video UID + */ + uid: string; + type?: FileType; + /** + * User UID + */ + uuid?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetFileResponse.ts b/src/api-types/models/GetFileResponse.ts new file mode 100644 index 0000000..df78e28 --- /dev/null +++ b/src/api-types/models/GetFileResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; + +export interface GetFileResponse { + success: boolean; + file?: DatabaseFile; +} \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatRequest.ts b/src/api-types/models/GetFullTwitchChatRequest.ts new file mode 100644 index 0000000..64a043d --- /dev/null +++ b/src/api-types/models/GetFullTwitchChatRequest.ts @@ -0,0 +1,19 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Subscription } from './Subscription'; + +export interface GetFullTwitchChatRequest { + /** + * File ID + */ + id: string; + type: FileType; + /** + * User UID + */ + uuid?: string; + sub?: Subscription; +} \ No newline at end of file diff --git a/src/api-types/models/GetFullTwitchChatResponse.ts b/src/api-types/models/GetFullTwitchChatResponse.ts new file mode 100644 index 0000000..3bd27f7 --- /dev/null +++ b/src/api-types/models/GetFullTwitchChatResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetFullTwitchChatResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetLogsRequest.ts b/src/api-types/models/GetLogsRequest.ts new file mode 100644 index 0000000..170ce8b --- /dev/null +++ b/src/api-types/models/GetLogsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetLogsRequest { + lines?: number; +} \ No newline at end of file diff --git a/src/api-types/models/GetLogsResponse.ts b/src/api-types/models/GetLogsResponse.ts new file mode 100644 index 0000000..2acf83a --- /dev/null +++ b/src/api-types/models/GetLogsResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetLogsResponse { + /** + * Number of lines to retrieve from the bottom + */ + logs?: string; + success?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetMp3sResponse.ts b/src/api-types/models/GetMp3sResponse.ts new file mode 100644 index 0000000..23a80d7 --- /dev/null +++ b/src/api-types/models/GetMp3sResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetMp3sResponse { + mp3s: Array; + /** + * All audio playlists + */ + playlists: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetMp4sResponse.ts b/src/api-types/models/GetMp4sResponse.ts new file mode 100644 index 0000000..06e1f98 --- /dev/null +++ b/src/api-types/models/GetMp4sResponse.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { DatabaseFile } from './DatabaseFile'; +import { Playlist } from './Playlist'; + +export interface GetMp4sResponse { + mp4s: Array; + /** + * All video playlists + */ + playlists: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistRequest.ts b/src/api-types/models/GetPlaylistRequest.ts new file mode 100644 index 0000000..9a48a9b --- /dev/null +++ b/src/api-types/models/GetPlaylistRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface GetPlaylistRequest { + playlist_id: string; + type?: FileType; + uuid?: string; + include_file_metadata?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistResponse.ts b/src/api-types/models/GetPlaylistResponse.ts new file mode 100644 index 0000000..afe4184 --- /dev/null +++ b/src/api-types/models/GetPlaylistResponse.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; +import { Playlist } from './Playlist'; + +export interface GetPlaylistResponse { + playlist: Playlist; + type: FileType; + success: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsRequest.ts b/src/api-types/models/GetPlaylistsRequest.ts new file mode 100644 index 0000000..2693d19 --- /dev/null +++ b/src/api-types/models/GetPlaylistsRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetPlaylistsRequest { + include_categories?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/GetPlaylistsResponse.ts b/src/api-types/models/GetPlaylistsResponse.ts new file mode 100644 index 0000000..e01f586 --- /dev/null +++ b/src/api-types/models/GetPlaylistsResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface GetPlaylistsResponse { + playlists: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetRolesResponse.ts b/src/api-types/models/GetRolesResponse.ts new file mode 100644 index 0000000..2209ec4 --- /dev/null +++ b/src/api-types/models/GetRolesResponse.ts @@ -0,0 +1,16 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { UserPermission } from './UserPermission'; + +export interface GetRolesResponse { + roles: { +admin?: { +permissions?: Array, +}, +user?: { +permissions?: Array, +}, +}; +} \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionRequest.ts b/src/api-types/models/GetSubscriptionRequest.ts new file mode 100644 index 0000000..c11c5fa --- /dev/null +++ b/src/api-types/models/GetSubscriptionRequest.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetSubscriptionRequest { + /** + * Subscription ID + */ + id: string; + /** + * Subscription name + */ + name?: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetSubscriptionResponse.ts b/src/api-types/models/GetSubscriptionResponse.ts new file mode 100644 index 0000000..0efb102 --- /dev/null +++ b/src/api-types/models/GetSubscriptionResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface GetSubscriptionResponse { + subscription: Subscription; + files: Array; +} \ No newline at end of file diff --git a/src/api-types/models/GetTaskRequest.ts b/src/api-types/models/GetTaskRequest.ts new file mode 100644 index 0000000..655a69f --- /dev/null +++ b/src/api-types/models/GetTaskRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface GetTaskRequest { + task_key: string; +} \ No newline at end of file diff --git a/src/api-types/models/GetTaskResponse.ts b/src/api-types/models/GetTaskResponse.ts new file mode 100644 index 0000000..7f11c6e --- /dev/null +++ b/src/api-types/models/GetTaskResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Task } from './Task'; + +export interface GetTaskResponse { + task?: Task; +} \ No newline at end of file diff --git a/src/api-types/models/GetUsersResponse.ts b/src/api-types/models/GetUsersResponse.ts new file mode 100644 index 0000000..2f17953 --- /dev/null +++ b/src/api-types/models/GetUsersResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; + +export interface GetUsersResponse { + users: Array; +} \ No newline at end of file diff --git a/src/api-types/models/IncrementViewCountRequest.ts b/src/api-types/models/IncrementViewCountRequest.ts new file mode 100644 index 0000000..1294d10 --- /dev/null +++ b/src/api-types/models/IncrementViewCountRequest.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface IncrementViewCountRequest { + file_uid: string; + sub_id?: string; + /** + * User UID + */ + uuid?: string; +} \ No newline at end of file diff --git a/src/api-types/models/LoginRequest.ts b/src/api-types/models/LoginRequest.ts new file mode 100644 index 0000000..2e99447 --- /dev/null +++ b/src/api-types/models/LoginRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface LoginRequest { + username: string; + password: string; +} \ No newline at end of file diff --git a/src/api-types/models/LoginResponse.ts b/src/api-types/models/LoginResponse.ts new file mode 100644 index 0000000..7f5c42d --- /dev/null +++ b/src/api-types/models/LoginResponse.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; +import { UserPermission } from './UserPermission'; + +export interface LoginResponse { + user?: User; + token?: string; + permissions?: Array; + available_permissions?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/Playlist.ts b/src/api-types/models/Playlist.ts new file mode 100644 index 0000000..7741f41 --- /dev/null +++ b/src/api-types/models/Playlist.ts @@ -0,0 +1,16 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface Playlist { + name: string; + uids: Array; + id: string; + thumbnailURL: string; + type: FileType; + registered: number; + duration: number; + user_uid?: string; +} \ No newline at end of file diff --git a/src/api-types/models/RegisterRequest.ts b/src/api-types/models/RegisterRequest.ts new file mode 100644 index 0000000..87b7f0f --- /dev/null +++ b/src/api-types/models/RegisterRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface RegisterRequest { + userid: string; + username: string; + password: string; +} \ No newline at end of file diff --git a/src/api-types/models/RegisterResponse.ts b/src/api-types/models/RegisterResponse.ts new file mode 100644 index 0000000..5aaa76a --- /dev/null +++ b/src/api-types/models/RegisterResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { User } from './User'; + +export interface RegisterResponse { + user?: User; +} \ No newline at end of file diff --git a/src/api-types/models/RestoreDBBackupRequest.ts b/src/api-types/models/RestoreDBBackupRequest.ts new file mode 100644 index 0000000..b5fde8a --- /dev/null +++ b/src/api-types/models/RestoreDBBackupRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface RestoreDBBackupRequest { + file_name: string; +} \ No newline at end of file diff --git a/src/api-types/models/Schedule.ts b/src/api-types/models/Schedule.ts new file mode 100644 index 0000000..452202d --- /dev/null +++ b/src/api-types/models/Schedule.ts @@ -0,0 +1,24 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Schedule { + type: Schedule.type; + data: { +dayOfWeek?: Array, +hour?: number, +minute?: number, +timestamp?: number, +}; +} + +export namespace Schedule { + + export enum type { + TIMESTAMP = 'timestamp', + RECURRING = 'recurring', + } + + +} \ No newline at end of file diff --git a/src/api-types/models/SetConfigRequest.ts b/src/api-types/models/SetConfigRequest.ts new file mode 100644 index 0000000..f307009 --- /dev/null +++ b/src/api-types/models/SetConfigRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Config } from './Config'; + +export interface SetConfigRequest { + new_config_file: Config; +} \ No newline at end of file diff --git a/src/api-types/models/SharingToggle.ts b/src/api-types/models/SharingToggle.ts new file mode 100644 index 0000000..5acba30 --- /dev/null +++ b/src/api-types/models/SharingToggle.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface SharingToggle { + uid: string; + is_playlist?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/SubscribeRequest.ts b/src/api-types/models/SubscribeRequest.ts new file mode 100644 index 0000000..2cca0df --- /dev/null +++ b/src/api-types/models/SubscribeRequest.ts @@ -0,0 +1,14 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface SubscribeRequest { + name: string; + url: string; + timerange?: string; + audioOnly?: boolean; + customArgs?: string; + customFileOutput?: string; + maxQuality?: string; +} \ No newline at end of file diff --git a/src/api-types/models/SubscribeResponse.ts b/src/api-types/models/SubscribeResponse.ts new file mode 100644 index 0000000..a1f1331 --- /dev/null +++ b/src/api-types/models/SubscribeResponse.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; + +export interface SubscribeResponse { + new_sub: Subscription; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/Subscription.ts b/src/api-types/models/Subscription.ts new file mode 100644 index 0000000..1184827 --- /dev/null +++ b/src/api-types/models/Subscription.ts @@ -0,0 +1,20 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface Subscription { + name: string; + url: string; + id: string; + type: FileType; + user_uid: string | null; + streamingOnly: boolean; + isPlaylist: boolean; + archive?: string; + timerange?: string; + custom_args?: string; + custom_output?: string; + videos: Array; +} \ No newline at end of file diff --git a/src/api-types/models/SubscriptionRequestData.ts b/src/api-types/models/SubscriptionRequestData.ts new file mode 100644 index 0000000..056ff28 --- /dev/null +++ b/src/api-types/models/SubscriptionRequestData.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { FileType } from './FileType'; + +export interface SubscriptionRequestData { + name: string; + id: string; + type?: FileType; + isPlaylist?: boolean; + archive?: string; +} \ No newline at end of file diff --git a/src/api-types/models/SuccessObject.ts b/src/api-types/models/SuccessObject.ts new file mode 100644 index 0000000..f59e3fa --- /dev/null +++ b/src/api-types/models/SuccessObject.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface SuccessObject { + success: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/TableInfo.ts b/src/api-types/models/TableInfo.ts new file mode 100644 index 0000000..244c1a9 --- /dev/null +++ b/src/api-types/models/TableInfo.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TableInfo { + records_count?: number; +} \ No newline at end of file diff --git a/src/api-types/models/Task.ts b/src/api-types/models/Task.ts new file mode 100644 index 0000000..95c864a --- /dev/null +++ b/src/api-types/models/Task.ts @@ -0,0 +1,15 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Task { + key: string; + last_ran: number; + last_confirmed: number; + running: boolean; + confirming: boolean; + data: any; + error: string; + schedule: any; +} \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringRequest.ts b/src/api-types/models/TestConnectionStringRequest.ts new file mode 100644 index 0000000..156c01f --- /dev/null +++ b/src/api-types/models/TestConnectionStringRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TestConnectionStringRequest { + /** + * MongoDB connection string + */ + connection_string: string; +} \ No newline at end of file diff --git a/src/api-types/models/TestConnectionStringResponse.ts b/src/api-types/models/TestConnectionStringResponse.ts new file mode 100644 index 0000000..0cd0573 --- /dev/null +++ b/src/api-types/models/TestConnectionStringResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TestConnectionStringResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/TransferDBRequest.ts b/src/api-types/models/TransferDBRequest.ts new file mode 100644 index 0000000..fd14f56 --- /dev/null +++ b/src/api-types/models/TransferDBRequest.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TransferDBRequest { + /** + * True if transfering DB from Local to MongoDB, false if transferring DB from MongoDB to Local + */ + local_to_remote: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/TransferDBResponse.ts b/src/api-types/models/TransferDBResponse.ts new file mode 100644 index 0000000..d8cc1c5 --- /dev/null +++ b/src/api-types/models/TransferDBResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TransferDBResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/TwitchChatMessage.ts b/src/api-types/models/TwitchChatMessage.ts new file mode 100644 index 0000000..76da85f --- /dev/null +++ b/src/api-types/models/TwitchChatMessage.ts @@ -0,0 +1,18 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface TwitchChatMessage { + created_at?: string; + content_offset_seconds?: number; + commenter?: { +name?: string, +_id?: string, +created_at?: string, +}; + message?: { +body?: string, +user_color?: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeRequest.ts b/src/api-types/models/UnsubscribeRequest.ts new file mode 100644 index 0000000..1ee72e3 --- /dev/null +++ b/src/api-types/models/UnsubscribeRequest.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { SubscriptionRequestData } from './SubscriptionRequestData'; + +export interface UnsubscribeRequest { + sub: SubscriptionRequestData; + /** + * Defaults to false + */ + deleteMode?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/UnsubscribeResponse.ts b/src/api-types/models/UnsubscribeResponse.ts new file mode 100644 index 0000000..1d43b7b --- /dev/null +++ b/src/api-types/models/UnsubscribeResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UnsubscribeResponse { + success: boolean; + error?: string; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoriesRequest.ts b/src/api-types/models/UpdateCategoriesRequest.ts new file mode 100644 index 0000000..cbb3436 --- /dev/null +++ b/src/api-types/models/UpdateCategoriesRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface UpdateCategoriesRequest { + categories: Array; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateCategoryRequest.ts b/src/api-types/models/UpdateCategoryRequest.ts new file mode 100644 index 0000000..273bde1 --- /dev/null +++ b/src/api-types/models/UpdateCategoryRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Category } from './Category'; + +export interface UpdateCategoryRequest { + category: Category; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamRequest.ts b/src/api-types/models/UpdateConcurrentStreamRequest.ts new file mode 100644 index 0000000..2a8f9e4 --- /dev/null +++ b/src/api-types/models/UpdateConcurrentStreamRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface UpdateConcurrentStreamRequest extends ConcurrentStream { + /** + * Concurrent stream UID + */ + uid: string; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateConcurrentStreamResponse.ts b/src/api-types/models/UpdateConcurrentStreamResponse.ts new file mode 100644 index 0000000..b1d32e8 --- /dev/null +++ b/src/api-types/models/UpdateConcurrentStreamResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { ConcurrentStream } from './ConcurrentStream'; + +export interface UpdateConcurrentStreamResponse { + stream: ConcurrentStream; +} \ No newline at end of file diff --git a/src/api-types/models/UpdatePlaylistRequest.ts b/src/api-types/models/UpdatePlaylistRequest.ts new file mode 100644 index 0000000..38f98ac --- /dev/null +++ b/src/api-types/models/UpdatePlaylistRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Playlist } from './Playlist'; + +export interface UpdatePlaylistRequest { + playlist: Playlist; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateServerRequest.ts b/src/api-types/models/UpdateServerRequest.ts new file mode 100644 index 0000000..8c616f6 --- /dev/null +++ b/src/api-types/models/UpdateServerRequest.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateServerRequest { + tag: string; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskDataRequest.ts b/src/api-types/models/UpdateTaskDataRequest.ts new file mode 100644 index 0000000..7768eaa --- /dev/null +++ b/src/api-types/models/UpdateTaskDataRequest.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateTaskDataRequest { + task_key: string; + new_data: any; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateTaskScheduleRequest.ts b/src/api-types/models/UpdateTaskScheduleRequest.ts new file mode 100644 index 0000000..b9e61d6 --- /dev/null +++ b/src/api-types/models/UpdateTaskScheduleRequest.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Schedule } from './Schedule'; + +export interface UpdateTaskScheduleRequest { + task_key: string; + new_schedule: Schedule; +} \ No newline at end of file diff --git a/src/api-types/models/UpdateUserRequest.ts b/src/api-types/models/UpdateUserRequest.ts new file mode 100644 index 0000000..19e32c8 --- /dev/null +++ b/src/api-types/models/UpdateUserRequest.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdateUserRequest { + change_object: { +uid: string, +name?: string, +role?: string, +}; +} \ No newline at end of file diff --git a/src/api-types/models/UpdaterStatus.ts b/src/api-types/models/UpdaterStatus.ts new file mode 100644 index 0000000..8db6a17 --- /dev/null +++ b/src/api-types/models/UpdaterStatus.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface UpdaterStatus { + updating: boolean; + details: string; + error?: boolean; +} \ No newline at end of file diff --git a/src/api-types/models/User.ts b/src/api-types/models/User.ts new file mode 100644 index 0000000..0568e06 --- /dev/null +++ b/src/api-types/models/User.ts @@ -0,0 +1,25 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Subscription } from './Subscription'; +import { UserPermission } from './UserPermission'; + +export interface User { + uid?: string; + name?: string; + passhash?: string; + files?: { +audio?: Array, +video?: Array, +}; + playlists?: { +audio?: Array, +video?: Array, +}; + subscriptions?: Array; + created?: number; + role?: string; + permissions?: Array; + permission_overrides?: Array; +} \ No newline at end of file diff --git a/src/api-types/models/UserPermission.ts b/src/api-types/models/UserPermission.ts new file mode 100644 index 0000000..b22ef87 --- /dev/null +++ b/src/api-types/models/UserPermission.ts @@ -0,0 +1,13 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum UserPermission { + FILEMANAGER = 'filemanager', + SETTINGS = 'settings', + SUBSCRIPTIONS = 'subscriptions', + SHARING = 'sharing', + ADVANCED_DOWNLOAD = 'advanced_download', + DOWNLOADS_MANAGER = 'downloads_manager', +} \ No newline at end of file diff --git a/src/api-types/models/Version.ts b/src/api-types/models/Version.ts new file mode 100644 index 0000000..5049571 --- /dev/null +++ b/src/api-types/models/Version.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface Version { + type?: string; + tag?: string; + commit?: string; + date?: string; +} \ No newline at end of file diff --git a/src/api-types/models/VersionInfoResponse.ts b/src/api-types/models/VersionInfoResponse.ts new file mode 100644 index 0000000..369927b --- /dev/null +++ b/src/api-types/models/VersionInfoResponse.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import { Version } from './Version'; + +export interface VersionInfoResponse { + version_info: Version; +} \ No newline at end of file diff --git a/src/api-types/models/YesNo.ts b/src/api-types/models/YesNo.ts new file mode 100644 index 0000000..dbe9c62 --- /dev/null +++ b/src/api-types/models/YesNo.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export enum YesNo { + YES = 'yes', + NO = 'no', +} \ No newline at end of file diff --git a/src/api-types/models/body_19.ts b/src/api-types/models/body_19.ts new file mode 100644 index 0000000..c7f8fb8 --- /dev/null +++ b/src/api-types/models/body_19.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface body_19 { + input_pin: string; +} \ No newline at end of file diff --git a/src/api-types/models/body_20.ts b/src/api-types/models/body_20.ts new file mode 100644 index 0000000..559ea14 --- /dev/null +++ b/src/api-types/models/body_20.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface body_20 { + unhashed_pin: string; +} \ No newline at end of file diff --git a/src/api-types/models/inline_response_200_15.ts b/src/api-types/models/inline_response_200_15.ts new file mode 100644 index 0000000..7147a1e --- /dev/null +++ b/src/api-types/models/inline_response_200_15.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + + +export interface inline_response_200_15 { + is_set: boolean; +} \ No newline at end of file diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 8620fcb..ab9c609 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -8,6 +8,7 @@ import { PostsService } from './posts.services'; import { LoginComponent } from './components/login/login.component'; import { DownloadsComponent } from './components/downloads/downloads.component'; import { SettingsComponent } from './settings/settings.component'; +import { TasksComponent } from './components/tasks/tasks.component'; const routes: Routes = [ { path: 'home', component: MainComponent, canActivate: [PostsService] }, @@ -17,6 +18,7 @@ const routes: Routes = [ { path: 'settings', component: SettingsComponent, canActivate: [PostsService] }, { path: 'login', component: LoginComponent }, { path: 'downloads', component: DownloadsComponent, canActivate: [PostsService] }, + { path: 'tasks', component: TasksComponent, canActivate: [PostsService] }, { path: '', redirectTo: '/home', pathMatch: 'full' } ]; diff --git a/src/app/app.component.html b/src/app/app.component.html index df61ad2..278b8fe 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -44,13 +44,14 @@ Login Subscriptions Downloads + Tasks Settings - {{subscription.name}} + {{subscription.name}} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dcaa9ec..0e9bf59 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -28,13 +28,14 @@ import { MatTabsModule } from '@angular/material/tabs'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; +import { MatDatepickerModule } from '@angular/material/datepicker'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { ClipboardModule } from '@angular/cdk/clipboard'; +import { TextFieldModule } from '@angular/cdk/text-field'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { PostsService } from 'app/posts.services'; -import { FileCardComponent } from './file-card/file-card.component'; import { RouterModule } from '@angular/router'; import { AppRoutingModule } from './app-routing.module'; import { MainComponent } from './main/main.component'; @@ -44,10 +45,7 @@ import { VgBufferingModule } from '@videogular/ngx-videogular/buffering'; import { VgOverlayPlayModule } from '@videogular/ngx-videogular/overlay-play'; import { VgCoreModule } from '@videogular/ngx-videogular/core'; import { InputDialogComponent } from './input-dialog/input-dialog.component'; -import { LazyLoadImageModule, IsVisibleProps } from 'ng-lazyload-image'; -import { audioFilesMouseHovering, videoFilesMouseHovering, audioFilesOpened, videoFilesOpened } from './main/main.component'; import { CreatePlaylistComponent } from './create-playlist/create-playlist.component'; -import { DownloadItemComponent } from './download-item/download-item.component'; import { SubscriptionsComponent } from './subscriptions/subscriptions.component'; import { SubscribeDialogComponent } from './dialogs/subscribe-dialog/subscribe-dialog.component'; import { SubscriptionComponent } from './subscription//subscription/subscription.component'; @@ -56,7 +54,7 @@ import { SubscriptionInfoDialogComponent } from './dialogs/subscription-info-dia import { SettingsComponent } from './settings/settings.component'; import { MatChipsModule } from '@angular/material/chips'; import { NgxFileDropModule } from 'ngx-file-drop'; -import { AvatarModule } from 'ngx-avatar'; +import { AvatarModule } from 'ngx-avatars'; import { ContentLoaderModule } from '@ngneat/content-loader'; import es from '@angular/common/locales/es'; @@ -88,122 +86,116 @@ import { LinkifyPipe, SeeMoreComponent } from './components/see-more/see-more.co import { H401Interceptor } from './http.interceptor'; import { ConcurrentStreamComponent } from './components/concurrent-stream/concurrent-stream.component'; import { SkipAdButtonComponent } from './components/skip-ad-button/skip-ad-button.component'; +import { TasksComponent } from './components/tasks/tasks.component'; +import { UpdateTaskScheduleDialogComponent } from './dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; +import { RestoreDbDialogComponent } from './dialogs/restore-db-dialog/restore-db-dialog.component'; registerLocaleData(es, 'es'); -export function isVisible({ event, element, scrollContainer, offset }: IsVisibleProps) { - return (element.id === 'video' ? videoFilesMouseHovering || videoFilesOpened : audioFilesMouseHovering || audioFilesOpened); -} - @NgModule({ - declarations: [ - AppComponent, - FileCardComponent, - MainComponent, - PlayerComponent, - InputDialogComponent, - CreatePlaylistComponent, - DownloadItemComponent, - SubscriptionsComponent, - SubscribeDialogComponent, - SubscriptionComponent, - SubscriptionFileCardComponent, - SubscriptionInfoDialogComponent, - SettingsComponent, - AboutDialogComponent, - VideoInfoDialogComponent, - ArgModifierDialogComponent, - HighlightPipe, - LinkifyPipe, - UpdaterComponent, - UpdateProgressDialogComponent, - ShareMediaDialogComponent, - LoginComponent, - DownloadsComponent, - UserProfileDialogComponent, - SetDefaultAdminDialogComponent, - ModifyUsersComponent, - AddUserDialogComponent, - ManageUserComponent, - ManageRoleComponent, - CookiesUploaderDialogComponent, - LogsViewerComponent, - ModifyPlaylistComponent, - ConfirmDialogComponent, - UnifiedFileCardComponent, - RecentVideosComponent, - EditSubscriptionDialogComponent, - CustomPlaylistsComponent, - EditCategoryDialogComponent, - TwitchChatComponent, - SeeMoreComponent, - ConcurrentStreamComponent, - SkipAdButtonComponent - ], - imports: [ - CommonModule, - BrowserModule, - BrowserAnimationsModule, - MatNativeDateModule, - MatRadioModule, - FormsModule, - MatInputModule, - MatSelectModule, - ReactiveFormsModule, - HttpClientModule, - MatToolbarModule, - MatCardModule, - MatSnackBarModule, - MatButtonModule, - MatCheckboxModule, - MatSidenavModule, - MatIconModule, - MatListModule, - MatGridListModule, - MatExpansionModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatButtonToggleModule, - MatRippleModule, - MatMenuModule, - MatDialogModule, - MatSlideToggleModule, - MatAutocompleteModule, - MatTabsModule, - MatTooltipModule, - MatPaginatorModule, - MatSortModule, - MatTableModule, - MatChipsModule, - DragDropModule, - ClipboardModule, - NgxFileDropModule, - AvatarModule, - ContentLoaderModule, - VgCoreModule, - VgControlsModule, - VgOverlayPlayModule, - VgBufferingModule, - LazyLoadImageModule.forRoot({ isVisible }), - RouterModule, - AppRoutingModule, - ], - entryComponents: [ - InputDialogComponent, - CreatePlaylistComponent, - SubscribeDialogComponent, - SubscriptionInfoDialogComponent, - SettingsComponent - ], - providers: [ - PostsService, - { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true } - ], - exports: [ - HighlightPipe, - LinkifyPipe - ], - bootstrap: [AppComponent] + declarations: [ + AppComponent, + MainComponent, + PlayerComponent, + InputDialogComponent, + CreatePlaylistComponent, + SubscriptionsComponent, + SubscribeDialogComponent, + SubscriptionComponent, + SubscriptionFileCardComponent, + SubscriptionInfoDialogComponent, + SettingsComponent, + AboutDialogComponent, + VideoInfoDialogComponent, + ArgModifierDialogComponent, + HighlightPipe, + LinkifyPipe, + UpdaterComponent, + UpdateProgressDialogComponent, + ShareMediaDialogComponent, + LoginComponent, + DownloadsComponent, + UserProfileDialogComponent, + SetDefaultAdminDialogComponent, + ModifyUsersComponent, + AddUserDialogComponent, + ManageUserComponent, + ManageRoleComponent, + CookiesUploaderDialogComponent, + LogsViewerComponent, + ModifyPlaylistComponent, + ConfirmDialogComponent, + UnifiedFileCardComponent, + RecentVideosComponent, + EditSubscriptionDialogComponent, + CustomPlaylistsComponent, + EditCategoryDialogComponent, + TwitchChatComponent, + SeeMoreComponent, + ConcurrentStreamComponent, + SkipAdButtonComponent, + TasksComponent, + UpdateTaskScheduleDialogComponent, + RestoreDbDialogComponent + ], + imports: [ + CommonModule, + BrowserModule, + BrowserAnimationsModule, + MatNativeDateModule, + MatRadioModule, + FormsModule, + MatInputModule, + MatSelectModule, + ReactiveFormsModule, + HttpClientModule, + MatToolbarModule, + MatCardModule, + MatSnackBarModule, + MatButtonModule, + MatCheckboxModule, + MatSidenavModule, + MatIconModule, + MatListModule, + MatGridListModule, + MatExpansionModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatButtonToggleModule, + MatRippleModule, + MatMenuModule, + MatDialogModule, + MatSlideToggleModule, + MatAutocompleteModule, + MatTabsModule, + MatTooltipModule, + MatPaginatorModule, + MatSortModule, + MatTableModule, + MatDatepickerModule, + MatChipsModule, + DragDropModule, + ClipboardModule, + TextFieldModule, + NgxFileDropModule, + AvatarModule, + ContentLoaderModule, + VgCoreModule, + VgControlsModule, + VgOverlayPlayModule, + VgBufferingModule, + RouterModule, + AppRoutingModule, + ], + providers: [ + PostsService, + { provide: HTTP_INTERCEPTORS, useClass: H401Interceptor, multi: true } + ], + exports: [ + HighlightPipe, + LinkifyPipe + ], + bootstrap: [AppComponent] }) export class AppModule { } diff --git a/src/app/components/concurrent-stream/concurrent-stream.component.ts b/src/app/components/concurrent-stream/concurrent-stream.component.ts index 6c2cc67..e99108b 100644 --- a/src/app/components/concurrent-stream/concurrent-stream.component.ts +++ b/src/app/components/concurrent-stream/concurrent-stream.component.ts @@ -42,6 +42,11 @@ export class ConcurrentStreamComponent implements OnInit { } + ngOnDestroy(): void { + if (this.check_timeout) { clearInterval(this.check_timeout); } + if (this.update_timeout) { clearInterval(this.update_timeout); } + } + startServer() { this.started = true; this.server_started = true; diff --git a/src/app/components/custom-playlists/custom-playlists.component.ts b/src/app/components/custom-playlists/custom-playlists.component.ts index 7193123..9654013 100644 --- a/src/app/components/custom-playlists/custom-playlists.component.ts +++ b/src/app/components/custom-playlists/custom-playlists.component.ts @@ -98,7 +98,7 @@ export class CustomPlaylistsComponent implements OnInit { this.getAllPlaylists(); }); } - + editPlaylistDialog(args) { const playlist = args.playlist; const index = args.index; diff --git a/src/app/components/recent-videos/recent-videos.component.html b/src/app/components/recent-videos/recent-videos.component.html index 14511d8..fa2ba2a 100644 --- a/src/app/components/recent-videos/recent-videos.component.html +++ b/src/app/components/recent-videos/recent-videos.component.html @@ -32,7 +32,7 @@
- +
No videos found. @@ -47,7 +47,7 @@
-
+
File type @@ -62,4 +62,4 @@ [pageSizeOptions]="[5, 10, 25, 100, this.paged_data && this.paged_data.length > 100 ? this.paged_data.length : 250]">
-
\ No newline at end of file +
diff --git a/src/app/components/recent-videos/recent-videos.component.ts b/src/app/components/recent-videos/recent-videos.component.ts index 2645424..76e297f 100644 --- a/src/app/components/recent-videos/recent-videos.component.ts +++ b/src/app/components/recent-videos/recent-videos.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit, ViewChild } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { Router } from '@angular/router'; +import { FileType } from '../../../api-types'; import { MatPaginator } from '@angular/material/paginator'; import { Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; @@ -227,7 +228,7 @@ export class RecentVideosComponent implements OnInit { } downloadSubscriptionFile(file) { - const type = file.isAudio ? 'audio' : 'video'; + const type = (file.isAudio ? 'audio' : 'video') as FileType; const ext = type === 'audio' ? '.mp3' : '.mp4' const sub = this.postsService.getSubscriptionByID(file.sub_id); this.postsService.downloadFileFromServer(file.uid).subscribe(res => { @@ -239,7 +240,7 @@ export class RecentVideosComponent implements OnInit { } downloadNormalFile(file) { - const type = file.isAudio ? 'audio' : 'video'; + const type = (file.isAudio ? 'audio' : 'video') as FileType; const ext = type === 'audio' ? '.mp3' : '.mp4' const name = file.id; this.downloading_content[type][name] = true; diff --git a/src/app/components/see-more/see-more.component.html b/src/app/components/see-more/see-more.component.html index 297d820..724b05c 100644 --- a/src/app/components/see-more/see-more.component.html +++ b/src/app/components/see-more/see-more.component.html @@ -1,6 +1,6 @@ - + See more. diff --git a/src/app/components/skip-ad-button/skip-ad-button.component.ts b/src/app/components/skip-ad-button/skip-ad-button.component.ts index 9f8cd74..6a98811 100644 --- a/src/app/components/skip-ad-button/skip-ad-button.component.ts +++ b/src/app/components/skip-ad-button/skip-ad-button.component.ts @@ -62,7 +62,7 @@ export class SkipAdButtonComponent implements OnInit { getVideoIDHashFromURL(video_id) { if (!video_id) return null; - return CryptoJS.SHA256(video_id).toString(CryptoJS.enc.Hex);; + return CryptoJS.SHA256(video_id).toString(CryptoJS.enc.Hex); } getVideoIDFromURL(url) { diff --git a/src/app/components/tasks/tasks.component.html b/src/app/components/tasks/tasks.component.html new file mode 100644 index 0000000..662e3be --- /dev/null +++ b/src/app/components/tasks/tasks.component.html @@ -0,0 +1,95 @@ +
+
+ + + + Title + + + {{element.title}} + + + + + + + Last ran + + {{element.last_ran*1000 | date: 'short'}} + N/A + + + + + + Last confirmed + + {{element.last_confirmed*1000 | date: 'short'}} + N/A + + + + + + Status + + + + Scheduled for  + {{element.next_invocation | date: 'short'}}repeat + + + Not scheduled + + + + + + + Actions + +
+
+
+ + + +
+
+ +
+
+ +
+
+
+
+
+ + + +
+ + + +
+ + + +
+ +
+

No tasks available!

+
\ No newline at end of file diff --git a/src/app/components/tasks/tasks.component.scss b/src/app/components/tasks/tasks.component.scss new file mode 100644 index 0000000..ed84df9 --- /dev/null +++ b/src/app/components/tasks/tasks.component.scss @@ -0,0 +1,32 @@ +mat-header-cell, mat-cell { + justify-content: center; +} + +.one-line { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.icon-button-spinner { + position: absolute; + top: 7px; + left: 6px; +} + +.downloads-action-button-div { + margin-top: 10px; + margin-left: 5px; +} + +.rounded-top { + border-radius: 16px 16px 0px 0px !important; +} + +.rounded-bottom { + border-radius: 0px 0px 16px 16px !important; +} + +.rounded { + border-radius: 16px 16px 16px 16px !important; +} \ No newline at end of file diff --git a/src/app/components/tasks/tasks.component.spec.ts b/src/app/components/tasks/tasks.component.spec.ts new file mode 100644 index 0000000..d4ab7a5 --- /dev/null +++ b/src/app/components/tasks/tasks.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TasksComponent } from './tasks.component'; + +describe('TasksComponent', () => { + let component: TasksComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ TasksComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TasksComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/tasks/tasks.component.ts b/src/app/components/tasks/tasks.component.ts new file mode 100644 index 0000000..8fec372 --- /dev/null +++ b/src/app/components/tasks/tasks.component.ts @@ -0,0 +1,164 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { MatTableDataSource } from '@angular/material/table'; +import { ConfirmDialogComponent } from 'app/dialogs/confirm-dialog/confirm-dialog.component'; +import { RestoreDbDialogComponent } from 'app/dialogs/restore-db-dialog/restore-db-dialog.component'; +import { UpdateTaskScheduleDialogComponent } from 'app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-tasks', + templateUrl: './tasks.component.html', + styleUrls: ['./tasks.component.scss'] +}) +export class TasksComponent implements OnInit { + + interval_id = null; + tasks_check_interval = 1500; + tasks = null; + tasks_retrieved = false; + + displayedColumns: string[] = ['title', 'last_ran', 'last_confirmed', 'status', 'actions']; + dataSource = null; + + db_backups = []; + + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + constructor(private postsService: PostsService, private dialog: MatDialog) { } + + ngOnInit(): void { + if (this.postsService.initialized) { + this.getTasksRecurring(); + } else { + this.postsService.service_initialized.subscribe(init => { + if (init) { + this.getTasksRecurring(); + } + }); + } + } + + ngOnDestroy(): void { + if (this.interval_id) { clearInterval(this.interval_id) } + } + + getTasksRecurring(): void { + this.getTasks(); + this.interval_id = setInterval(() => { + this.getTasks(); + }, this.tasks_check_interval); + } + + getTasks(): void { + this.postsService.getTasks().subscribe(res => { + if (this.tasks) { + if (JSON.stringify(this.tasks) === JSON.stringify(res['tasks'])) return; + for (const task of res['tasks']) { + const task_index = this.tasks.map(t => t.key).indexOf(task['key']); + this.tasks[task_index] = task; + } + this.dataSource = new MatTableDataSource(this.tasks); + } else { + this.tasks = res['tasks']; + this.dataSource = new MatTableDataSource(this.tasks); + this.dataSource.paginator = this.paginator; + this.dataSource.sort = this.sort; + } + }); + } + + runTask(task_key: string): void { + this.postsService.runTask(task_key).subscribe(res => { + this.getTasks(); + this.getDBBackups(); + if (res['success']) this.postsService.openSnackBar($localize`Successfully ran task!`); + else this.postsService.openSnackBar($localize`Failed to run task!`); + }, err => { + this.postsService.openSnackBar($localize`Failed to run task!`); + console.error(err); + }); + } + + confirmTask(task_key: string): void { + this.postsService.confirmTask(task_key).subscribe(res => { + this.getTasks(); + if (res['success']) this.postsService.openSnackBar($localize`Successfully confirmed task!`); + else this.postsService.openSnackBar($localize`Failed to confirm task!`); + }, err => { + this.postsService.openSnackBar($localize`Failed to confirm task!`); + console.error(err); + }); + } + + scheduleTask(task: any): void { + // open dialog + const dialogRef = this.dialog.open(UpdateTaskScheduleDialogComponent, { + data: { + task: task + } + }); + dialogRef.afterClosed().subscribe(schedule => { + if (schedule || schedule === null) { + this.postsService.updateTaskSchedule(task['key'], schedule).subscribe(res => { + this.getTasks(); + console.log(res); + }); + } + }); + } + + getDBBackups(): void { + this.postsService.getDBBackups().subscribe(res => { + this.db_backups = res['db_backups']; + }); + } + + openRestoreDBBackupDialog(): void { + this.dialog.open(RestoreDbDialogComponent, { + data: { + db_backups: this.db_backups + }, + width: '80vw' + }) + } + + resetTasks(): void { + const dialogRef = this.dialog.open(ConfirmDialogComponent, { + data: { + dialogTitle: $localize`Reset tasks`, + dialogText: $localize`Would you like to reset your tasks? All your schedules will be removed as well.`, + submitText: $localize`Reset`, + warnSubmitColor: true + } + }); + dialogRef.afterClosed().subscribe(confirmed => { + if (confirmed) { + this.postsService.resetTasks().subscribe(res => { + if (res['success']) { + this.postsService.openSnackBar($localize`Tasks successfully reset!`); + } else { + this.postsService.openSnackBar($localize`Failed to reset tasks!`); + } + }, err => { + this.postsService.openSnackBar($localize`Failed to reset tasks!`); + console.error(err); + }); + } + }); + } + +} + +export interface Task { + key: string; + title: string; + last_ran: number; + last_confirmed: number; + running: boolean; + confirming: boolean; + data: unknown; +} \ No newline at end of file diff --git a/src/app/components/twitch-chat/twitch-chat.component.ts b/src/app/components/twitch-chat/twitch-chat.component.ts index d2e0aa0..bbeb7de 100644 --- a/src/app/components/twitch-chat/twitch-chat.component.ts +++ b/src/app/components/twitch-chat/twitch-chat.component.ts @@ -1,4 +1,4 @@ -import { AfterViewInit, Component, ElementRef, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { PostsService } from 'app/posts.services'; @Component({ @@ -6,7 +6,7 @@ import { PostsService } from 'app/posts.services'; templateUrl: './twitch-chat.component.html', styleUrls: ['./twitch-chat.component.scss'] }) -export class TwitchChatComponent implements OnInit, AfterViewInit { +export class TwitchChatComponent implements OnInit, OnDestroy { full_chat = null; visible_chat = null; @@ -33,7 +33,8 @@ export class TwitchChatComponent implements OnInit, AfterViewInit { this.getFullChat(); } - ngAfterViewInit() { + ngOnDestroy(): void { + if (this.chat_check_interval_obj) { clearInterval(this.chat_check_interval_obj); } } private isUserNearBottom(): boolean { diff --git a/src/app/components/unified-file-card/unified-file-card.component.ts b/src/app/components/unified-file-card/unified-file-card.component.ts index 5338cab..9b0e424 100644 --- a/src/app/components/unified-file-card/unified-file-card.component.ts +++ b/src/app/components/unified-file-card/unified-file-card.component.ts @@ -75,7 +75,7 @@ export class UnifiedFileCardComponent implements OnInit { } if (this.file_obj && this.file_obj.thumbnailPath) { - this.thumbnailBlobURL = `${this.baseStreamPath}thumbnail/${encodeURIComponent(this.file_obj.thumbnailPath)}${this.jwtString}`; + this.thumbnailBlobURL = `${this.baseStreamPath}thumbnail/${encodeURIComponent(this.file_obj.thumbnailPath)}?jwt=${this.jwtString}`; /*const mime = getMimeByFilename(this.file_obj.thumbnailPath); const blob = new Blob([new Uint8Array(this.file_obj.thumbnailBlob.data)], {type: mime}); const bloburl = URL.createObjectURL(blob); @@ -134,9 +134,8 @@ export class UnifiedFileCardComponent implements OnInit { } generateStreamURL() { - let baseLocation = 'stream/'; + const baseLocation = 'stream/'; let fullLocation = this.baseStreamPath + baseLocation + `?test=test&uid=${this.file_obj['uid']}`; - if (this.jwtString) { fullLocation += `&jwt=${this.jwtString}`; } diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html new file mode 100644 index 0000000..abcb1e7 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html @@ -0,0 +1,29 @@ +

Restore DB from backup

+ + + + +
+
+
+ {{db_backup.timestamp*1000 | date: 'short'}} +
+
+ {{(db_backup.size/1000).toFixed(2)}} kB +
+
+ {{db_backup.source}} +
+
+
+
+
+
+ + + + +
+ +
+
\ No newline at end of file diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.scss b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts new file mode 100644 index 0000000..422e482 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RestoreDbDialogComponent } from './restore-db-dialog.component'; + +describe('RestoreDbDialogComponent', () => { + let component: RestoreDbDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RestoreDbDialogComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RestoreDbDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts new file mode 100644 index 0000000..204a8c1 --- /dev/null +++ b/src/app/dialogs/restore-db-dialog/restore-db-dialog.component.ts @@ -0,0 +1,51 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-restore-db-dialog', + templateUrl: './restore-db-dialog.component.html', + styleUrls: ['./restore-db-dialog.component.scss'] +}) +export class RestoreDbDialogComponent implements OnInit { + + db_backups = []; + selected_backup = null; + restoring = false; + + constructor(@Inject(MAT_DIALOG_DATA) public data: any, private dialogRef: MatDialogRef, private postsService: PostsService) { + if (this.data?.db_backups) { + this.db_backups = this.data.db_backups; + } + + this.getDBBackups(); + } + + ngOnInit(): void { + } + + getDBBackups(): void { + this.postsService.getDBBackups().subscribe(res => { + this.db_backups = res['db_backups']; + }); + } + + restoreClicked(): void { + this.restoring = true; + if (this.selected_backup.length !== 1) return; + this.postsService.restoreDBBackup(this.selected_backup[0]).subscribe(res => { + this.restoring = false; + if (res['success']) { + this.postsService.openSnackBar('Database successfully restored!'); + this.dialogRef.close(); + } else { + this.postsService.openSnackBar('Failed to restore database! See logs for more info.'); + } + }, err => { + this.restoring = false; + this.postsService.openSnackBar('Failed to restore database! See browser console for more info.'); + console.error(err); + }); + } + +} diff --git a/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts b/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts index 0d3ab68..916b5f9 100644 --- a/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts +++ b/src/app/dialogs/subscribe-dialog/subscribe-dialog.component.ts @@ -90,7 +90,7 @@ export class SubscribeDialogComponent implements OnInit { if (!this.download_all) { timerange = 'now-' + this.timerange_amount.toString() + this.timerange_unit; } - this.postsService.createSubscription(this.url, this.name, timerange, this.streamingOnlyMode, this.maxQuality, + this.postsService.createSubscription(this.url, this.name, timerange, this.maxQuality, this.audioOnlyMode, this.customArgs, this.customFileOutput).subscribe(res => { this.subscribing = false; if (res['new_sub']) { diff --git a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts index fe1fbf4..4862839 100644 --- a/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts +++ b/src/app/dialogs/update-progress-dialog/update-progress-dialog.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { MatSnackBar } from '@angular/material/snack-bar'; +import { UpdaterStatus } from '../../../api-types'; @Component({ selector: 'app-update-progress-dialog', @@ -9,7 +10,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; }) export class UpdateProgressDialogComponent implements OnInit { - updateStatus = null; + updateStatus: UpdaterStatus = null; updateInterval = 250; errored = false; diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html new file mode 100644 index 0000000..7782e15 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html @@ -0,0 +1,53 @@ +

Update task schedule

+ + +
+
+
+ Enabled +
+
+ Recurring +
+
+ + + Weekly + Daily + + +
+
+ + Choose a date + + + + +
+
+ + + M + T + W + T + F + S + S + +
+
+ + Time + + +
+
+
+
+ + + + + \ No newline at end of file diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.scss b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts new file mode 100644 index 0000000..fe52670 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UpdateTaskScheduleDialogComponent } from './update-task-schedule-dialog.component'; + +describe('UpdateTaskScheduleDialogComponent', () => { + let component: UpdateTaskScheduleDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ UpdateTaskScheduleDialogComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(UpdateTaskScheduleDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts new file mode 100644 index 0000000..2d31782 --- /dev/null +++ b/src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.ts @@ -0,0 +1,86 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Schedule, Task } from 'api-types'; +import { PostsService } from 'app/posts.services'; + +@Component({ + selector: 'app-update-task-schedule-dialog', + templateUrl: './update-task-schedule-dialog.component.html', + styleUrls: ['./update-task-schedule-dialog.component.scss'] +}) +export class UpdateTaskScheduleDialogComponent implements OnInit { + + enabled = true; + recurring = false; + days_of_week = []; + interval = 'daily'; + time = null; + date = null; + today = new Date(); + + constructor(@Inject(MAT_DIALOG_DATA) public data: {task: Task}, private dialogRef: MatDialogRef, private postsService: PostsService) { + this.processTask(this.data.task); + this.postsService.getTask(this.data.task.key).subscribe(res => { + this.processTask(res['task']); + }); + } + + ngOnInit(): void { + } + + processTask(task: Task): void { + if (!task['schedule']) { + this.enabled = false; + return; + } + + const schedule: Schedule = task['schedule']; + + this.recurring = schedule['type'] === Schedule.type.RECURRING; + + if (this.recurring) { + const hour = schedule['data']['hour']; + const minute = schedule['data']['minute']; + + // add padding 0s if necessary to hours and minutes + this.time = (hour < 10 ? '0' : '') + hour + ':' + (minute < 10 ? '0' : '') + minute; + + if (schedule['data']['dayOfWeek']) { + this.days_of_week = schedule['data']['dayOfWeek']; + this.interval = 'weekly'; + } else { + this.interval = 'daily'; + } + } else { + const schedule_date = new Date(schedule['data']['timestamp']); + this.time = `${schedule_date.getHours()}:${schedule_date.getMinutes()}` + this.date = schedule_date; + } + } + + updateTaskSchedule(): void { + if (!this.enabled) { + this.dialogRef.close(null); + return; + } + + if (!this.time) { + // needs time! + } + + const hours = parseInt(this.time.split(':')[0]); + const minutes = parseInt(this.time.split(':')[1]); + + const schedule: Schedule = {type: this.recurring ? Schedule.type.RECURRING : Schedule.type.TIMESTAMP, data: null}; + if (this.recurring) { + schedule['data'] = {hour: hours, minute: minutes}; + if (this.interval === 'weekly') { + schedule['data']['dayOfWeek'] = this.days_of_week; + } + } else { + this.date.setHours(hours, minutes); + schedule['data'] = {timestamp: this.date.getTime()}; + } + this.dialogRef.close(schedule); + } +} diff --git a/src/app/download-item/download-item.component.html b/src/app/download-item/download-item.component.html deleted file mode 100644 index 07d4310..0000000 --- a/src/app/download-item/download-item.component.html +++ /dev/null @@ -1,41 +0,0 @@ -
- - -
ID: {{url_id ? url_id : download.uid}}
-
- - - done - error - - - - -
- - -
- Details -
-
-
- {{download.timestamp_start | date:'medium'}} -
-
-
-
- An error has occurred: -
- {{download.error}} -
-
- Download start: {{download.timestamp_start | date:'medium'}} -
-
- Download end: {{download.timestamp_end | date:'medium'}} -
-
- File path(s): {{download.fileNames.join(', ')}} -
-
-
\ No newline at end of file diff --git a/src/app/download-item/download-item.component.scss b/src/app/download-item/download-item.component.scss deleted file mode 100644 index f28a49f..0000000 --- a/src/app/download-item/download-item.component.scss +++ /dev/null @@ -1,16 +0,0 @@ -.shorten { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; -} - -.mat-expansion-panel:not([class*='mat-elevation-z']) { - box-shadow: none; -} - -.ignore-margin { - margin-left: -15px; - margin-right: -15px; - margin-bottom: -15px; -} diff --git a/src/app/download-item/download-item.component.spec.ts b/src/app/download-item/download-item.component.spec.ts deleted file mode 100644 index 7baea1e..0000000 --- a/src/app/download-item/download-item.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { DownloadItemComponent } from './download-item.component'; - -describe('DownloadItemComponent', () => { - let component: DownloadItemComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ DownloadItemComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DownloadItemComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/download-item/download-item.component.ts b/src/app/download-item/download-item.component.ts deleted file mode 100644 index 5803afd..0000000 --- a/src/app/download-item/download-item.component.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core'; -import { Download } from 'app/main/main.component'; - - -@Component({ - selector: 'app-download-item', - templateUrl: './download-item.component.html', - styleUrls: ['./download-item.component.scss'] -}) -export class DownloadItemComponent implements OnInit { - - @Input() download: Download = { - uid: null, - type: 'audio', - percent_complete: 0, - complete: false, - url: 'http://youtube.com/watch?v=17848rufj', - downloading: true, - timestamp_start: null, - timestamp_end: null, - is_playlist: false, - error: false - }; - @Output() cancelDownload = new EventEmitter(); - - @Input() queueNumber = null; - - url_id = null; - - constructor() { } - - ngOnInit() { - if (this.download && this.download.url && this.download.url.includes('youtu')) { - const string_id = (this.download.is_playlist ? '?list=' : '?v=') - const index_offset = (this.download.is_playlist ? 6 : 3); - const end_index = this.download.url.indexOf(string_id) + index_offset; - this.url_id = this.download.url.substring(end_index, this.download.url.length); - } - } - - cancelTheDownload() { - this.cancelDownload.emit(this.download); - } - -} diff --git a/src/app/file-card/file-card.component.css b/src/app/file-card/file-card.component.css deleted file mode 100644 index a581bca..0000000 --- a/src/app/file-card/file-card.component.css +++ /dev/null @@ -1,68 +0,0 @@ -.example-card { - width: 150px; - height: 125px; - padding: 0px; -} - -.deleteButton { - top:-5px; - right:-5px; - position:absolute; -} - -/* Coerce the icon container away from display:inline */ -.mat-icon-button .mat-button-wrapper { - display: flex; - justify-content: center; -} - -.image { - width: 100%; -} - -.example-full-width-height { - width: 100%; - height: 100% -} - -.centered { - margin: 0 auto; - top: 50%; - left: 50%; -} - -.img-div { - height: 60px; - padding: 0px; - margin: 8px 0px 0px -5px; - width: calc(100% + 5px + 5px); - overflow: hidden; - border-radius: 0px 0px 4px 4px; -} - -.max-two-lines { - display: -webkit-box; - display: -moz-box; - max-height: 2.4em; - line-height: 1.2em; - overflow: hidden; - text-overflow: ellipsis; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.file-link { - width: 80%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; -} - -@media (max-width: 576px){ - - .example-card { - width: 125px !important; - } - -} \ No newline at end of file diff --git a/src/app/file-card/file-card.component.html b/src/app/file-card/file-card.component.html deleted file mode 100644 index f3c7ffe..0000000 --- a/src/app/file-card/file-card.component.html +++ /dev/null @@ -1,29 +0,0 @@ - -
-
- - ID: {{name}} -
Count: {{count}}
-
-
- Thumbnail - - - -
-
- - - - - - - - - - - - - diff --git a/src/app/file-card/file-card.component.spec.ts b/src/app/file-card/file-card.component.spec.ts deleted file mode 100644 index 0e940d9..0000000 --- a/src/app/file-card/file-card.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { FileCardComponent } from './file-card.component'; - -describe('FileCardComponent', () => { - let component: FileCardComponent; - let fixture: ComponentFixture; - - beforeEach(waitForAsync(() => { - TestBed.configureTestingModule({ - declarations: [ FileCardComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FileCardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/file-card/file-card.component.ts b/src/app/file-card/file-card.component.ts deleted file mode 100644 index 5596eec..0000000 --- a/src/app/file-card/file-card.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Component, OnInit, Input, Output } from '@angular/core'; -import {PostsService} from '../posts.services'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import {EventEmitter} from '@angular/core'; -import { MainComponent } from 'app/main/main.component'; -import { Subject, Observable } from 'rxjs'; -import 'rxjs/add/observable/merge'; -import { MatDialog } from '@angular/material/dialog'; -import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; -import { ModifyPlaylistComponent } from '../dialogs/modify-playlist/modify-playlist.component'; - -@Component({ - selector: 'app-file-card', - templateUrl: './file-card.component.html', - styleUrls: ['./file-card.component.css'] -}) -export class FileCardComponent implements OnInit { - @Input() file: any; - @Input() title: string; - @Input() length: string; - @Input() name: string; - @Input() uid: string; - @Input() thumbnailURL: string; - @Input() isAudio = true; - @Output() removeFile: EventEmitter = new EventEmitter(); - @Input() playlist = null; - @Input() count = null; - @Input() use_youtubedl_archive = false; - type; - image_loaded = false; - image_errored = false; - - scrollSubject; - scrollAndLoad; - - constructor(private postsService: PostsService, public snackBar: MatSnackBar, public mainComponent: MainComponent, - private dialog: MatDialog) { - - this.scrollSubject = new Subject(); - this.scrollAndLoad = Observable.merge( - Observable.fromEvent(window, 'scroll'), - this.scrollSubject - ); - } - - ngOnInit() { - this.type = this.isAudio ? 'audio' : 'video'; - - if (this.file && this.file.url && this.file.url.includes('youtu')) { - const string_id = (this.playlist ? '?list=' : '?v=') - const index_offset = (this.playlist ? 6 : 3); - const end_index = this.file.url.indexOf(string_id) + index_offset; - this.name = this.file.url.substring(end_index, this.file.url.length); - } - } - - deleteFile(blacklistMode = false) { - if (!this.playlist) { - this.postsService.deleteFile(this.uid, blacklistMode).subscribe(result => { - if (result) { - this.openSnackBar('Delete success!', 'OK.'); - this.removeFile.emit(this.name); - } else { - this.openSnackBar('Delete failed!', 'OK.'); - } - }, err => { - this.openSnackBar('Delete failed!', 'OK.'); - }); - } else { - this.removeFile.emit(this.name); - } - - } - - openVideoInfoDialog() { - const dialogRef = this.dialog.open(VideoInfoDialogComponent, { - data: { - file: this.file, - }, - minWidth: '50vw' - }); - } - - editPlaylistDialog() { - const dialogRef = this.dialog.open(ModifyPlaylistComponent, { - data: { - playlist_id: this.playlist.id, - width: '65vw' - } - }); - - dialogRef.afterClosed().subscribe(res => { - // updates playlist in file manager if it changed - if (dialogRef.componentInstance.playlist_updated) { - this.playlist = dialogRef.componentInstance.original_playlist; - this.title = this.playlist.name; - this.count = this.playlist.fileNames.length; - } - }); - } - - onImgError(event) { - this.image_errored = true; - } - - onHoverResponse() { - this.scrollSubject.next(); - } - - imageLoaded(loaded) { - this.image_loaded = true; - } - - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - -} diff --git a/src/app/main/main.component.css b/src/app/main/main.component.css index e2325f2..0242439 100644 --- a/src/app/main/main.component.css +++ b/src/app/main/main.component.css @@ -129,7 +129,9 @@ mat-form-field.mat-form-field { } .edit-button { - margin-left: 10px; + margin-left: 5px; + margin-top: -6px; + margin-bottom: -5px; top: -5px; } @@ -149,4 +151,13 @@ mat-form-field.mat-form-field { .download-progress-bar { width: 125px; } +} + +.url-input { + padding-right: 25px; + overflow-y: hidden; +} + +.url-input::-webkit-scrollbar { + display: none; } \ No newline at end of file diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index 3bfdc23..e8d14a8 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -8,9 +8,9 @@
- + - +
@@ -19,7 +19,7 @@ Quality - + Max @@ -65,7 +65,7 @@ Only Audio - + Autoplay @@ -111,8 +111,13 @@ + + + Replace args + + - + No need to include URL, just everything after. Args are delimited using two commas like so: ,, @@ -127,7 +132,7 @@ - + Documentation. Path is relative to the config download path. Don't include extension. @@ -140,13 +145,13 @@ Use authentication - - + +
- - + +
@@ -155,13 +160,13 @@ Crop file - - + +
- - + +
diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 996d819..69e5eb7 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,7 +1,6 @@ import { Component, OnInit, ElementRef, ViewChild, ViewChildren, QueryList } from '@angular/core'; import {PostsService} from '../posts.services'; -import {FileCardComponent} from '../file-card/file-card.component'; -import { Observable } from 'rxjs'; +import { Observable, Subject } from 'rxjs'; import {FormControl, Validators} from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -9,29 +8,15 @@ import { saveAs } from 'file-saver'; import { YoutubeSearchService, Result } from '../youtube-search.service'; import { Router, ActivatedRoute } from '@angular/router'; import { Platform } from '@angular/cdk/platform'; -import { v4 as uuid } from 'uuid'; import { ArgModifierDialogComponent } from 'app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component'; import { RecentVideosComponent } from 'app/components/recent-videos/recent-videos.component'; +import { Download, FileType } from 'api-types'; export let audioFilesMouseHovering = false; export let videoFilesMouseHovering = false; export let audioFilesOpened = false; export let videoFilesOpened = false; -export interface Download { - uid: string; - type: string; - url: string; - percent_complete: number; - downloading: boolean; - is_playlist: boolean; - error: boolean | string; - fileNames?: string[]; - complete?: boolean; - timestamp_start?: number; - timestamp_end?: number; -} - @Component({ selector: 'app-root', templateUrl: './main.component.html', @@ -50,6 +35,7 @@ export class MainComponent implements OnInit { customArgsEnabled = false; customArgs = null; customOutputEnabled = false; + replaceArgs = false; customOutput = null; youtubeAuthEnabled = false; youtubeUsername = null; @@ -58,7 +44,7 @@ export class MainComponent implements OnInit { cropFileStart = null; cropFileEnd = null; urlError = false; - path = ''; + path: string | string[] = ''; url = ''; exists = ''; percentDownloaded: number; @@ -90,7 +76,6 @@ export class MainComponent implements OnInit { mp3s: any[] = []; mp4s: any[] = []; - files_cols = null; playlists = {'audio': [], 'video': []}; playlist_thumbnails = {}; downloading_content = {'audio': {}, 'video': {}}; @@ -197,21 +182,10 @@ export class MainComponent implements OnInit { @ViewChild('urlinput', { read: ElementRef }) urlInput: ElementRef; @ViewChild('recentVideos') recentVideos: RecentVideosComponent; - @ViewChildren('audiofilecard') audioFileCards: QueryList; - @ViewChildren('videofilecard') videoFileCards: QueryList; last_valid_url = ''; last_url_check = 0; - test_download: Download = { - uid: null, - type: 'audio', - percent_complete: 0, - url: 'http://youtube.com/watch?v=17848rufj', - downloading: true, - is_playlist: false, - error: false - }; - + argsChangedSubject: Subject = new Subject(); simulatedOutput = ''; constructor(public postsService: PostsService, private youtubeSearch: YoutubeSearchService, public snackBar: MatSnackBar, @@ -219,16 +193,14 @@ export class MainComponent implements OnInit { this.audioOnly = false; } - async configLoad() { + async configLoad(): Promise { await this.loadConfig(); if (this.autoStartDownload) { this.downloadClicked(); } - - setInterval(() => this.getSimulatedOutput(), 1000); } - async loadConfig() { + async loadConfig(): Promise { // loading config this.fileManagerEnabled = this.postsService.config['Extra']['file_manager_enabled'] && this.postsService.hasPermission('filemanager'); @@ -261,6 +233,10 @@ export class MainComponent implements OnInit { this.customOutputEnabled = localStorage.getItem('customOutputEnabled') === 'true'; } + if (localStorage.getItem('replaceArgs') !== null) { + this.replaceArgs = localStorage.getItem('replaceArgs') === 'true'; + } + if (localStorage.getItem('youtubeAuthEnabled') !== null) { this.youtubeAuthEnabled = localStorage.getItem('youtubeAuthEnabled') === 'true'; } @@ -286,7 +262,7 @@ export class MainComponent implements OnInit { } // app initialization. - ngOnInit() { + ngOnInit(): void { if (this.postsService.initialized) { this.configLoad(); } else { @@ -323,61 +299,22 @@ export class MainComponent implements OnInit { this.autoStartDownload = true; } - this.setCols(); + this.argsChangedSubject + .debounceTime(500) + .subscribe((should_simulate) => { + if (should_simulate) this.getSimulatedOutput(); + }); } - ngAfterViewInit() { + ngAfterViewInit(): void { if (this.youtubeSearchEnabled && this.youtubeAPIKey) { this.youtubeSearch.initializeAPI(this.youtubeAPIKey); this.attachToInput(); } } - public setCols() { - if (window.innerWidth <= 350) { - this.files_cols = 1; - } else if (window.innerWidth <= 500) { - this.files_cols = 2; - } else if (window.innerWidth <= 750) { - this.files_cols = 3 - } else { - this.files_cols = 4; - } - } - - public goToFile(container, isAudio, uid) { - this.downloadHelper(container, isAudio ? 'audio' : 'video', false, false, true); - } - - public goToPlaylist(playlistID, type) { - const playlist = this.getPlaylistObjectByID(playlistID, type); - if (playlist) { - if (this.downloadOnlyMode) { - this.downloading_content[type][playlistID] = true; - this.downloadPlaylist(playlist); - } else { - localStorage.setItem('player_navigator', this.router.url); - const fileNames = playlist.fileNames; - this.router.navigate(['/player', {fileNames: fileNames.join('|nvr|'), type: type, id: playlistID, uid: playlistID}]); - } - } else { - // playlist not found - console.error(`Playlist with ID ${playlistID} not found!`); - } - } - - getPlaylistObjectByID(playlistID, type) { - for (let i = 0; i < this.playlists[type].length; i++) { - const playlist = this.playlists[type][i]; - if (playlist.id === playlistID) { - return playlist; - } - } - return null; - } - // download helpers - downloadHelper(container, type, is_playlist = false, force_view = false, navigate_mode = false) { + downloadHelper(container, type: string, is_playlist = false, force_view = false, navigate_mode = false): void { this.downloadingfile = false; if (!this.autoplay && !this.downloadOnlyMode && !navigate_mode) { // do nothing @@ -403,7 +340,7 @@ export class MainComponent implements OnInit { } // download click handler - downloadClicked() { + downloadClicked(): void { if (!this.ValidURL(this.url)) { this.urlError = true; return; @@ -412,7 +349,8 @@ export class MainComponent implements OnInit { this.urlError = false; // get common args - const customArgs = (this.customArgsEnabled ? this.customArgs : null); + const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); + const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); const customOutput = (this.customOutputEnabled ? this.customOutput : null); const youtubeUsername = (this.youtubeAuthEnabled && this.youtubeUsername ? this.youtubeUsername : null); const youtubePassword = (this.youtubeAuthEnabled && this.youtubePassword ? this.youtubePassword : null); @@ -443,65 +381,70 @@ export class MainComponent implements OnInit { } } + const selected_quality = this.selectedQuality; + this.selectedQuality = ''; this.downloadingfile = true; - this.postsService.downloadFile(this.url, type, (this.selectedQuality === '' ? null : this.selectedQuality), - customQualityConfiguration, customArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { - this.current_download = res['download']; - this.downloads.push(res['download']); - this.download_uids.push(res['download']['uid']); - }, error => { // can't access server - this.downloadingfile = false; - this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); - }); - if (!this.autoplay) { - const download_queued_message = $localize`Download for ${this.url}:url: has been queued!`; - this.postsService.openSnackBar(download_queued_message); - this.url = ''; + const urls = this.getURLArray(this.url); + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; + this.postsService.downloadFile(url, type as FileType, (selected_quality === '' ? null : selected_quality), + customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { + this.current_download = res['download']; + this.downloads.push(res['download']); + this.download_uids.push(res['download']['uid']); + }, () => { // can't access server this.downloadingfile = false; + this.current_download = null; + this.postsService.openSnackBar('Download failed!', 'OK.'); + }); + + if (!this.autoplay && urls.length === 1) { + const download_queued_message = $localize`Download for ${url}:url: has been queued!`; + this.postsService.openSnackBar(download_queued_message); + this.url = ''; + this.downloadingfile = false; + } } } // download canceled handler - cancelDownload(download_to_cancel = null) { + cancelDownload(download_to_cancel = null): void { // if one is provided, cancel that one. otherwise, remove the current one if (download_to_cancel) { this.removeDownloadFromCurrentDownloads(download_to_cancel) return; } this.downloadingfile = false; - this.current_download.downloading = false; this.current_download = null; } - getSelectedAudioFormat() { + getSelectedAudioFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormatsExists = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormatsExists) { - const audio_formats = this.cachedAvailableFormats[this.url]['formats']['audio']; return this.selectedQuality['format_id']; } else { return null; } } - getSelectedVideoFormat() { + getSelectedVideoFormat(): string { if (this.selectedQuality === '') { return null; } const cachedFormats = this.cachedAvailableFormats[this.url] && this.cachedAvailableFormats[this.url]['formats']; if (cachedFormats) { - const video_formats = cachedFormats['video']; if (this.selectedQuality) { let selected_video_format = this.selectedQuality['format_id']; // add in audio format if necessary - if (!this.selectedQuality['acodec'] && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; + const audio_missing = !this.selectedQuality['acodec'] || this.selectedQuality['acodec'] === 'none'; + if (audio_missing && cachedFormats['best_audio_format']) selected_video_format += `+${cachedFormats['best_audio_format']}`; return selected_video_format; } } return null; } - getDownloadByUID(uid) { + getDownloadByUID(uid: string) { const index = this.downloads.findIndex(download => download.uid === uid); if (index !== -1) { return this.downloads[index]; @@ -510,7 +453,7 @@ export class MainComponent implements OnInit { } } - removeDownloadFromCurrentDownloads(download_to_remove) { + removeDownloadFromCurrentDownloads(download_to_remove): boolean { if (this.current_download === download_to_remove) { this.current_download = null; } @@ -523,7 +466,7 @@ export class MainComponent implements OnInit { } } - downloadFileFromServer(file, type) { + downloadFileFromServer(file, type: string): void { const ext = type === 'audio' ? 'mp3' : 'mp4' this.downloading_content[type][file.id] = true; this.postsService.downloadFileFromServer(file.uid).subscribe(res => { @@ -533,13 +476,12 @@ export class MainComponent implements OnInit { if (!this.fileManagerEnabled) { // tell server to delete the file once downloaded - this.postsService.deleteFile(file.uid).subscribe(delRes => { - }); + this.postsService.deleteFile(file.uid).subscribe(() => {}); } }); } - downloadPlaylist(playlist) { + downloadPlaylist(playlist): void { this.postsService.downloadPlaylistFromServer(playlist.id).subscribe(res => { if (playlist.id) { this.downloading_content[playlist.type][playlist.id] = false }; const blob: Blob = res; @@ -548,25 +490,25 @@ export class MainComponent implements OnInit { } - clearInput() { + clearInput(): void { this.url = ''; this.results_showing = false; } - onInputBlur() { + onInputBlur(): void { this.results_showing = false; } - visitURL(url) { + visitURL(url: string): void { window.open(url); } - useURL(url) { + useURL(url: string): void { this.results_showing = false; this.url = url; } - inputChanged(new_val) { + inputChanged(new_val: string): void { if (new_val === '' || !new_val) { this.results_showing = false; } else { @@ -577,7 +519,14 @@ export class MainComponent implements OnInit { } // checks if url is a valid URL - ValidURL(str) { + ValidURL(str: string): boolean { + // mark multiple urls as valid but don't get additional info + const urls = this.getURLArray(str); + if (urls.length > 1) { + this.autoplay = false; + return true; + } + // tslint:disable-next-line: max-line-length const strRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/; const re = new RegExp(strRegex); @@ -593,20 +542,14 @@ export class MainComponent implements OnInit { if (str !== this.last_valid_url && this.allowQualitySelect) { // get info this.getURLInfo(str); + this.argsChanged(); } this.last_valid_url = str; } return valid; } - // snackbar helper - public openSnackBar(message: string, action: string) { - this.snackBar.open(message, action, { - duration: 2000, - }); - } - - getURLInfo(url) { + getURLInfo(url: string): void { // if url is a youtube playlist, skip getting url info if (url.includes('playlist')) { return; @@ -624,93 +567,57 @@ export class MainComponent implements OnInit { return; } this.cachedAvailableFormats[url]['formats'] = this.getAudioAndVideoFormats(infos.formats); - }, err => { + }, () => { this.errorFormats(url); }); } } - getSimulatedOutput() { - const customArgsExists = this.customArgsEnabled && this.customArgs; - const globalArgsExists = this.globalCustomArgs && this.globalCustomArgs !== ''; + getSimulatedOutput(): void { + const urls = this.getURLArray(this.url); + if (urls.length > 1) return; - let full_string_array: string[] = []; - const base_string_array = ['youtube-dl', this.url]; + // this function should be very similar to downloadClicked() + const customArgs = (this.customArgsEnabled && this.replaceArgs ? this.customArgs : null); + const additionalArgs = (this.customArgsEnabled && !this.replaceArgs ? this.customArgs : null); + const customOutput = (this.customOutputEnabled ? this.customOutput : null); + const youtubeUsername = (this.youtubeAuthEnabled && this.youtubeUsername ? this.youtubeUsername : null); + const youtubePassword = (this.youtubeAuthEnabled && this.youtubePassword ? this.youtubePassword : null); - if (customArgsExists) { - this.simulatedOutput = base_string_array.join(' ') + ' ' + this.customArgs.split(',,').join(' '); - return this.simulatedOutput; - } + const type = this.audioOnly ? 'audio' : 'video'; - full_string_array.push(...base_string_array); + const customQualityConfiguration = type === 'audio' ? this.getSelectedAudioFormat() : this.getSelectedVideoFormat(); - const base_path = this.audioOnly ? this.audioFolderPath : this.videoFolderPath; - const ext = this.audioOnly ? '.mp3' : '.mp4'; - // gets output - let output_string_array = ['-o', base_path + '%(title)s' + ext]; - if (this.customOutputEnabled && this.customOutput) { - output_string_array = ['-o', base_path + this.customOutput + ext]; - } - // before pushing output, should check if using an external downloader - if (!this.useDefaultDownloadingAgent && this.customDownloadingAgent === 'aria2c') { - full_string_array.push('--external-downloader', 'aria2c'); - } - // pushes output - full_string_array.push(...output_string_array); + let cropFileSettings = null; - // logic splits into audio and video modes - if (this.audioOnly) { - // adds base audio string - const format_array = []; - const audio_format = this.getSelectedAudioFormat(); - if (audio_format) { - format_array.push('-f', audio_format); - } else if (this.selectedQuality) { - format_array.push('--audio-quality', this.selectedQuality['format_id']); + if (this.cropFile) { + cropFileSettings = { + cropFileStart: this.cropFileStart, + cropFileEnd: this.cropFileEnd } - - // pushes formats - full_string_array.splice(2, 0, ...format_array); - - const additional_params = ['-x', '--audio-format', 'mp3', '--write-info-json', '--print-json']; - - full_string_array.push(...additional_params); - } else { - // adds base video string - let format_array = ['-f', 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4']; - const video_format = this.getSelectedVideoFormat(); - if (video_format) { - format_array = ['-f', video_format]; - } else if (this.selectedQuality) { - format_array = [`bestvideo[height=${this.selectedQuality['format_id']}]+bestaudio/best[height=${this.selectedQuality}]`]; - } - - // pushes formats - full_string_array.splice(2, 0, ...format_array); - - const additional_params = ['--write-info-json', '--print-json']; - - full_string_array.push(...additional_params); } - if (this.use_youtubedl_archive) { - full_string_array.push('--download-archive', 'archive.txt'); - } - - if (globalArgsExists) { - full_string_array = full_string_array.concat(this.globalCustomArgs.split(',,')); - } - - this.simulatedOutput = full_string_array.join(' '); - return this.simulatedOutput; + this.postsService.generateArgs(this.url, type as FileType, (this.selectedQuality === '' ? null : this.selectedQuality), + customQualityConfiguration, customArgs, additionalArgs, customOutput, youtubeUsername, youtubePassword, cropFileSettings).subscribe(res => { + const simulated_args = res['args']; + if (simulated_args) { + // hide password if needed + const passwordIndex = simulated_args.indexOf('--password'); + console.log(passwordIndex); + if (passwordIndex !== -1 && passwordIndex !== simulated_args.length - 1) { + simulated_args[passwordIndex + 1] = simulated_args[passwordIndex + 1].replace(/./g, '*'); + } + this.simulatedOutput = `youtube-dl ${this.url} ${simulated_args.join(' ')}`; + } + }); } - errorFormats(url) { + errorFormats(url: string): void { this.cachedAvailableFormats[url]['formats_loading'] = false; console.error('Could not load formats for url ' + url); } - attachToInput() { + attachToInput(): void { Observable.fromEvent(this.urlInput.nativeElement, 'keyup') .map((e: any) => e.target.value) // extract the value of input .filter((text: string) => text.length > 1) // filter out if empty @@ -739,47 +646,41 @@ export class MainComponent implements OnInit { ); } - onResize(event) { - this.setCols(); + argsChanged(): void { + this.argsChangedSubject.next(true); } - videoModeChanged(new_val) { + videoModeChanged(new_val): void { this.selectedQuality = ''; localStorage.setItem('audioOnly', new_val.checked.toString()); + this.argsChanged(); } - autoplayChanged(new_val) { + autoplayChanged(new_val): void { localStorage.setItem('autoplay', new_val.checked.toString()); } - customArgsEnabledChanged(new_val) { + customArgsEnabledChanged(new_val): void { localStorage.setItem('customArgsEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customOutputEnabled) { - this.customOutputEnabled = false; - localStorage.setItem('customOutputEnabled', 'false'); - - this.youtubeAuthEnabled = false; - localStorage.setItem('youtubeAuthEnabled', 'false'); - } + this.argsChanged(); } - customOutputEnabledChanged(new_val) { + replaceArgsChanged(new_val): void { + localStorage.setItem('replaceArgs', new_val.checked.toString()); + this.argsChanged(); + } + + customOutputEnabledChanged(new_val): void { localStorage.setItem('customOutputEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customArgsEnabled) { - this.customArgsEnabled = false; - localStorage.setItem('customArgsEnabled', 'false'); - } + this.argsChanged(); } - youtubeAuthEnabledChanged(new_val) { + youtubeAuthEnabledChanged(new_val): void { localStorage.setItem('youtubeAuthEnabled', new_val.checked.toString()); - if (new_val.checked === true && this.customArgsEnabled) { - this.customArgsEnabled = false; - localStorage.setItem('customArgsEnabled', 'false'); - } + this.argsChanged(); } - getAudioAndVideoFormats(formats) { + getAudioAndVideoFormats(formats): void { const audio_formats: any = {}; const video_formats: any = {}; @@ -838,7 +739,7 @@ export class MainComponent implements OnInit { return parsed_formats; } - getBestAudioFormatForMp4(audio_formats) { + getBestAudioFormatForMp4(audio_formats): void { let best_audio_format_for_mp4 = null; let best_audio_format_bitrate = 0; const available_audio_format_keys = Object.keys(audio_formats); @@ -854,46 +755,8 @@ export class MainComponent implements OnInit { return best_audio_format_for_mp4; } - accordionEntered(type) { - if (type === 'audio') { - audioFilesMouseHovering = true; - this.audioFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } else if (type === 'video') { - videoFilesMouseHovering = true; - this.videoFileCards.forEach(filecard => { - filecard.onHoverResponse(); - }); - } - } - - accordionLeft(type) { - if (type === 'audio') { - audioFilesMouseHovering = false; - } else if (type === 'video') { - videoFilesMouseHovering = false; - } - } - - accordionOpened(type) { - if (type === 'audio') { - audioFilesOpened = true; - } else if (type === 'video') { - videoFilesOpened = true; - } - } - - accordionClosed(type) { - if (type === 'audio') { - audioFilesOpened = false; - } else if (type === 'video') { - videoFilesOpened = false; - } - } - // modify custom args - openArgsModifierDialog() { + openArgsModifierDialog(): void { const dialogRef = this.dialog.open(ArgModifierDialogComponent, { data: { initial_args: this.customArgs @@ -906,7 +769,7 @@ export class MainComponent implements OnInit { }); } - getCurrentDownload() { + getCurrentDownload(): void { if (!this.current_download) { return; } @@ -923,7 +786,7 @@ export class MainComponent implements OnInit { } else if (this.current_download['finished'] && this.current_download['error']) { this.downloadingfile = false; this.current_download = null; - this.openSnackBar('Download failed!', 'OK.'); + this.postsService.openSnackBar('Download failed!', 'OK.'); } } else { // console.log('failed to get new download'); @@ -931,7 +794,13 @@ export class MainComponent implements OnInit { }); } - reloadRecentVideos() { + reloadRecentVideos(): void { this.postsService.files_changed.next(true); } + + getURLArray(url_str: string): Array { + let lines = url_str.split('\n'); + lines = lines.filter(line => line); + return lines; + } } diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index 04b907b..0bf510f 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -33,7 +33,7 @@
- + diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index 9be73f8..9c82d1a 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -6,6 +6,7 @@ import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { ShareMediaDialogComponent } from '../dialogs/share-media-dialog/share-media-dialog.component'; +import { FileType } from '../../api-types'; import { TwitchChatComponent } from 'app/components/twitch-chat/twitch-chat.component'; import { VideoInfoDialogComponent } from 'app/dialogs/video-info-dialog/video-info-dialog.component'; @@ -37,7 +38,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { // params uids: string[]; - type: string; + type: FileType; playlist_id = null; // used for playlists (not subscription) uid = null; // used for non-subscription files (audio, video, playlist) subscription = null; @@ -111,7 +112,6 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { public snackBar: MatSnackBar, private cdr: ChangeDetectorRef) { } - processConfig() { this.baseStreamPath = this.postsService.path; this.audioFolderPath = this.postsService.config['Downloader']['path-audio']; @@ -156,7 +156,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { }); // regular video/audio file (not playlist) this.uids = [this.db_file['uid']]; - this.type = this.db_file['isAudio'] ? 'audio' : 'video'; + this.type = this.db_file['isAudio'] ? 'audio' as FileType : 'video' as FileType; this.parseFileNames(); }); } @@ -315,7 +315,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { const filename = this.playlist[0].title; const ext = (this.playlist[0].type === 'audio/mp3') ? '.mp3' : '.mp4'; this.downloading = true; - this.postsService.downloadFileFromServer(this.uid, this.uuid, this.sub_id).subscribe(res => { + this.postsService.downloadFileFromServer(this.uid, this.uuid).subscribe(res => { this.downloading = false; const blob: Blob = res; saveAs(blob, filename + ext); diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 22faa70..3fc5c2c 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -1,16 +1,101 @@ import {Injectable, isDevMode, Inject} from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import 'rxjs/add/operator/map'; -import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; import 'rxjs/add/observable/throw'; import { THEMES_CONFIG } from '../themes'; import { Router, CanActivate } from '@angular/router'; import { DOCUMENT } from '@angular/common'; import { BehaviorSubject } from 'rxjs'; -import { v4 as uuid } from 'uuid'; import { MatSnackBar } from '@angular/material/snack-bar'; import * as Fingerprint2 from 'fingerprintjs2'; +import { + ChangeRolePermissionsRequest, + ChangeUserPermissionsRequest, + ConfigResponse, + CreatePlaylistRequest, + CreatePlaylistResponse, + CropFileSettings, + DeleteMp3Mp4Request, + DeletePlaylistRequest, + DeleteSubscriptionFileRequest, + DeleteUserRequest, + DownloadArchiveRequest, + DownloadFileRequest, + FileType, + GenerateNewApiKeyResponse, + GetAllDownloadsResponse, + GetAllFilesResponse, + GetAllSubscriptionsResponse, + GetDownloadResponse, + GetDownloadRequest, + GetFileRequest, + GetFileResponse, + GetMp3sResponse, + GetMp4sResponse, + GetPlaylistRequest, + GetPlaylistResponse, + GetRolesResponse, + GetSubscriptionRequest, + GetSubscriptionResponse, + GetUsersResponse, + LoginRequest, + LoginResponse, + DownloadRequest, + DownloadResponse, + Playlist, + RegisterRequest, + RegisterResponse, + SetConfigRequest, + SharingToggle, + SubscribeRequest, + SubscribeResponse, + SubscriptionRequestData, + SuccessObject, + UpdaterStatus, + UnsubscribeRequest, + UnsubscribeResponse, + UpdatePlaylistRequest, + UpdateServerRequest, + UpdateUserRequest, + UserPermission, + YesNo, + GenerateArgsResponse, + GetPlaylistsRequest, + UpdateCategoryRequest, + UpdateCategoriesRequest, + DeleteCategoryRequest, + CreateCategoryRequest, + CreateCategoryResponse, + GetAllCategoriesResponse, + AddFileToPlaylistRequest, + IncrementViewCountRequest, + GetLogsRequest, + GetLogsResponse, + UpdateConcurrentStreamResponse, + UpdateConcurrentStreamRequest, + CheckConcurrentStreamRequest, + CheckConcurrentStreamResponse, + DownloadTwitchChatByVODIDRequest, + DownloadTwitchChatByVODIDResponse, + GetFullTwitchChatRequest, + GetFullTwitchChatResponse, + GetAllDownloadsRequest, + TestConnectionStringRequest, + TestConnectionStringResponse, + TransferDBRequest, + TransferDBResponse, + VersionInfoResponse, + DBInfoResponse, + GetFileFormatsRequest, + GetFileFormatsResponse, + GetTaskRequest, + GetTaskResponse, + UpdateTaskScheduleRequest, + UpdateTaskDataRequest, + RestoreDBBackupRequest, + Schedule, +} from '../api-types'; import { isoLangs } from './settings/locales_list'; import { Title } from '@angular/platform-browser'; @@ -27,7 +112,9 @@ export class PostsService implements CanActivate { // auth auth_token = '4241b401-7236-493e-92b5-b72696b9d853'; session_id = null; - httpOptions = null; + httpOptions: { + params: HttpParams + }; http_params: string = null; unauthorized = false; @@ -175,43 +262,62 @@ export class PostsService implements CanActivate { } // tslint:disable-next-line: max-line-length - downloadFile(url: string, type: string, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { - return this.http.post(this.path + 'downloadFile', {url: url, - selectedHeight: selectedQuality, - customQualityConfiguration: customQualityConfiguration, - customArgs: customArgs, - customOutput: customOutput, - youtubeUsername: youtubeUsername, - youtubePassword: youtubePassword, - type: type, - cropFileSettings: cropFileSettings}, this.httpOptions); + // tslint:disable-next-line: max-line-length + downloadFile(url: string, type: FileType, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings: CropFileSettings = null) { + const body: DownloadRequest = {url: url, + selectedHeight: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + additionalArgs: additionalArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + type: type, + cropFileSettings: cropFileSettings} + return this.http.post(this.path + 'downloadFile', body, this.httpOptions); + } + + generateArgs(url: string, type: FileType, selectedQuality: string, customQualityConfiguration: string, customArgs: string = null, additionalArgs: string = null, customOutput: string = null, youtubeUsername: string = null, youtubePassword: string = null, cropFileSettings = null) { + const body: DownloadRequest = {url: url, + selectedHeight: selectedQuality, + customQualityConfiguration: customQualityConfiguration, + customArgs: customArgs, + additionalArgs: additionalArgs, + customOutput: customOutput, + youtubeUsername: youtubeUsername, + youtubePassword: youtubePassword, + type: type, + cropFileSettings: cropFileSettings} + return this.http.post(this.path + 'generateArgs', body, this.httpOptions); } getDBInfo() { - return this.http.post(this.path + 'getDBInfo', {}, this.httpOptions); + return this.http.get(this.path + 'getDBInfo', this.httpOptions); } transferDB(local_to_remote) { - return this.http.post(this.path + 'transferDB', {local_to_remote: local_to_remote}, this.httpOptions); + const body: TransferDBRequest = {local_to_remote: local_to_remote}; + return this.http.post(this.path + 'transferDB', body, this.httpOptions); } - testConnectionString(connection_string) { - return this.http.post(this.path + 'testConnectionString', {connection_string: connection_string}, this.httpOptions); + testConnectionString(connection_string: string) { + const body: TestConnectionStringRequest = {connection_string: connection_string}; + return this.http.post(this.path + 'testConnectionString', body, this.httpOptions); } killAllDownloads() { - return this.http.post(this.path + 'killAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'killAllDownloads', {}, this.httpOptions); } restartServer() { - return this.http.post(this.path + 'restartServer', {}, this.httpOptions); + return this.http.post(this.path + 'restartServer', {}, this.httpOptions); } loadNavItems() { if (isDevMode()) { return this.http.get('./assets/default.json'); } else { - return this.http.get(this.path + 'config', this.httpOptions); + return this.http.get(this.path + 'config', this.httpOptions); } } @@ -219,162 +325,184 @@ export class PostsService implements CanActivate { return this.http.get(`./assets/${name}`); } + getSupportedLocales() { + return this.http.get('./assets/i18n/supported_locales.json'); + } + setConfig(config) { - return this.http.post(this.path + 'setConfig', {new_config_file: config}, this.httpOptions); + const body: SetConfigRequest = {new_config_file: config}; + return this.http.post(this.path + 'setConfig', body, this.httpOptions); } deleteFile(uid: string, blacklistMode = false) { - return this.http.post(this.path + 'deleteFile', {uid: uid, blacklistMode: blacklistMode}, this.httpOptions); + const body: DeleteMp3Mp4Request = {uid: uid, blacklistMode: blacklistMode} + return this.http.post(this.path + 'deleteFile', body, this.httpOptions); } getMp3s() { - return this.http.get(this.path + 'getMp3s', this.httpOptions); + return this.http.get(this.path + 'getMp3s', this.httpOptions); } getMp4s() { - return this.http.get(this.path + 'getMp4s', this.httpOptions); + return this.http.get(this.path + 'getMp4s', this.httpOptions); } - getFile(uid, type, uuid = null) { - return this.http.post(this.path + 'getFile', {uid: uid, type: type, uuid: uuid}, this.httpOptions); + getFile(uid: string, type: FileType, uuid: string = null) { + const body: GetFileRequest = {uid: uid, type: type, uuid: uuid}; + return this.http.post(this.path + 'getFile', body, this.httpOptions); } getAllFiles(sort, range, text_search, file_type_filter) { - return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); + return this.http.post(this.path + 'getAllFiles', {sort: sort, range: range, text_search: text_search, file_type_filter: file_type_filter}, this.httpOptions); + } + + downloadFileFromServer(uid: string, uuid: string = null) { + const body: DownloadFileRequest = { + uid: uid, + uuid: uuid + }; + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); } getFullTwitchChat(id, type, uuid = null, sub = null) { - return this.http.post(this.path + 'getFullTwitchChat', {id: id, type: type, uuid: uuid, sub: sub}, this.httpOptions); + const body: GetFullTwitchChatRequest = {id: id, type: type, uuid: uuid, sub: sub}; + return this.http.post(this.path + 'getFullTwitchChat', body, this.httpOptions); } downloadTwitchChat(id, type, vodId, uuid = null, sub = null) { - return this.http.post(this.path + 'downloadTwitchChatByVODID', {id: id, type: type, vodId: vodId, uuid: uuid, sub: sub}, this.httpOptions); - } - - downloadFileFromServer(uid, uuid = null, sub_id = null, is_playlist = null) { - return this.http.post(this.path + 'downloadFileFromServer', { - uid: uid, - uuid: uuid, - sub_id: sub_id, - is_playlist: is_playlist - }, - {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadTwitchChatByVODIDRequest = {id: id, type: type, vodId: vodId, uuid: uuid, sub: sub}; + return this.http.post(this.path + 'downloadTwitchChatByVODID', body, this.httpOptions); } downloadPlaylistFromServer(playlist_id, uuid = null) { - return this.http.post(this.path + 'downloadFileFromServer', { - uuid: uuid, - playlist_id: playlist_id - }, - {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadFileRequest = {uuid: uuid, playlist_id: playlist_id}; + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); } downloadSubFromServer(sub_id, uuid = null) { - return this.http.post(this.path + 'downloadFileFromServer', { - uuid: uuid, - sub_id: sub_id - }, - {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadFileRequest = {uuid: uuid, sub_id: sub_id}; + return this.http.post(this.path + 'downloadFileFromServer', body, {responseType: 'blob', params: this.httpOptions.params}); + } checkConcurrentStream(uid) { - return this.http.post(this.path + 'checkConcurrentStream', {uid: uid}, this.httpOptions); + const body: CheckConcurrentStreamRequest = {uid: uid}; + return this.http.post(this.path + 'checkConcurrentStream', body, this.httpOptions); } updateConcurrentStream(uid, playback_timestamp, unix_timestamp, playing) { - return this.http.post(this.path + 'updateConcurrentStream', {uid: uid, - playback_timestamp: playback_timestamp, - unix_timestamp: unix_timestamp, - playing: playing}, this.httpOptions); + const body: UpdateConcurrentStreamRequest = {uid: uid, + playback_timestamp: playback_timestamp, + unix_timestamp: unix_timestamp, + playing: playing}; + return this.http.post(this.path + 'updateConcurrentStream', body, this.httpOptions); } uploadCookiesFile(fileFormData) { - return this.http.post(this.path + 'uploadCookies', fileFormData, this.httpOptions); + return this.http.post(this.path + 'uploadCookies', fileFormData, this.httpOptions); } downloadArchive(sub) { - return this.http.post(this.path + 'downloadArchive', {sub: sub}, {responseType: 'blob', params: this.httpOptions.params}); + const body: DownloadArchiveRequest = {sub: sub}; + return this.http.post(this.path + 'downloadArchive', body, {responseType: 'blob', params: this.httpOptions.params}); } getFileFormats(url) { - return this.http.post(this.path + 'getFileFormats', {url: url}, this.httpOptions); + const body: GetFileFormatsRequest = {url: url}; + return this.http.post(this.path + 'getFileFormats', body, this.httpOptions); } getLogs(lines = 50) { - return this.http.post(this.path + 'logs', {lines: lines}, this.httpOptions); + const body: GetLogsRequest = {lines: lines}; + return this.http.post(this.path + 'logs', body, this.httpOptions); } clearAllLogs() { - return this.http.post(this.path + 'clearAllLogs', {}, this.httpOptions); + return this.http.post(this.path + 'clearAllLogs', {}, this.httpOptions); } generateNewAPIKey() { - return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); + return this.http.post(this.path + 'generateNewAPIKey', {}, this.httpOptions); } - enableSharing(uid, is_playlist) { - return this.http.post(this.path + 'enableSharing', {uid: uid, is_playlist: is_playlist}, this.httpOptions); + enableSharing(uid: string, is_playlist: boolean) { + const body: SharingToggle = {uid: uid, is_playlist: is_playlist}; + return this.http.post(this.path + 'enableSharing', body, this.httpOptions); } - disableSharing(uid, is_playlist) { - return this.http.post(this.path + 'disableSharing', {uid: uid, is_playlist: is_playlist}, this.httpOptions); + disableSharing(uid: string, is_playlist: boolean) { + const body: SharingToggle = {uid: uid, is_playlist: is_playlist}; + return this.http.post(this.path + 'disableSharing', body, this.httpOptions); + } + + createPlaylist(playlistName: string, uids: string[], type: FileType, thumbnailURL: string) { + const body: CreatePlaylistRequest = {playlistName: playlistName, + uids: uids, + type: type, + thumbnailURL: thumbnailURL}; + return this.http.post(this.path + 'createPlaylist', body, this.httpOptions); + } + + getPlaylist(playlist_id: string, uuid: string = null, include_file_metadata: boolean = false) { + const body: GetPlaylistRequest = {playlist_id: playlist_id, + include_file_metadata: include_file_metadata, uuid: uuid}; + return this.http.post(this.path + 'getPlaylist', body, this.httpOptions); } incrementViewCount(file_uid, sub_id, uuid) { - return this.http.post(this.path + 'incrementViewCount', {file_uid: file_uid, sub_id: sub_id, uuid: uuid}, this.httpOptions); - } - - createPlaylist(playlistName, uids, type, thumbnailURL) { - return this.http.post(this.path + 'createPlaylist', {playlistName: playlistName, - uids: uids, - type: type, - thumbnailURL: thumbnailURL}, this.httpOptions); - } - - getPlaylist(playlist_id, uuid = null, include_file_metadata = false) { - return this.http.post(this.path + 'getPlaylist', {playlist_id: playlist_id, - uuid: uuid, - include_file_metadata: include_file_metadata}, this.httpOptions); + const body: IncrementViewCountRequest = {file_uid: file_uid, sub_id: sub_id, uuid: uuid}; + return this.http.post(this.path + 'incrementViewCount', body, this.httpOptions); } getPlaylists() { - return this.http.post(this.path + 'getPlaylists', {}, this.httpOptions); + return this.http.post(this.path + 'getPlaylists', {}, this.httpOptions); } - updatePlaylist(playlist) { - return this.http.post(this.path + 'updatePlaylist', {playlist: playlist}, this.httpOptions); + updatePlaylist(playlist: Playlist) { + const body: UpdatePlaylistRequest = {playlist: playlist}; + return this.http.post(this.path + 'updatePlaylist', body, this.httpOptions); } + removePlaylist(playlist_id: string, type: FileType) { + const body: DeletePlaylistRequest = {playlist_id: playlist_id, type: type}; + return this.http.post(this.path + 'deletePlaylist', body, this.httpOptions); + } + + createSubscription(url, name, timerange = null, maxQuality = 'best', audioOnly = false, customArgs: string = null, customFileOutput: string = null) { + const body: SubscribeRequest = {url: url, name: name, timerange: timerange, maxQuality: maxQuality, + audioOnly: audioOnly, customArgs: customArgs, customFileOutput: customFileOutput}; + return this.http.post(this.path + 'subscribe', body, this.httpOptions); + } + addFileToPlaylist(playlist_id, file_uid) { - return this.http.post(this.path + 'addFileToPlaylist', {playlist_id: playlist_id, - file_uid: file_uid}, - this.httpOptions); - } - - removePlaylist(playlist_id, type) { - return this.http.post(this.path + 'deletePlaylist', {playlist_id: playlist_id, type: type}, this.httpOptions); + const body: AddFileToPlaylistRequest = {playlist_id: playlist_id, file_uid: file_uid} + return this.http.post(this.path + 'addFileToPlaylist', body, this.httpOptions); } // categories getAllCategories() { - return this.http.post(this.path + 'getAllCategories', {}, this.httpOptions); + return this.http.post(this.path + 'getAllCategories', {}, this.httpOptions); } createCategory(name) { - return this.http.post(this.path + 'createCategory', {name: name}, this.httpOptions); + const body: CreateCategoryRequest = {name: name}; + return this.http.post(this.path + 'createCategory', body, this.httpOptions); } deleteCategory(category_uid) { - return this.http.post(this.path + 'deleteCategory', {category_uid: category_uid}, this.httpOptions); + const body: DeleteCategoryRequest = {category_uid: category_uid}; + return this.http.post(this.path + 'deleteCategory', body, this.httpOptions); } updateCategory(category) { - return this.http.post(this.path + 'updateCategory', {category: category}, this.httpOptions); + const body: UpdateCategoryRequest = {category: category}; + return this.http.post(this.path + 'updateCategory', body, this.httpOptions); } updateCategories(categories) { - return this.http.post(this.path + 'updateCategories', {categories: categories}, this.httpOptions); + const body: UpdateCategoriesRequest = {categories: categories}; + return this.http.post(this.path + 'updateCategories', body, this.httpOptions); } reloadCategories() { @@ -383,87 +511,131 @@ export class PostsService implements CanActivate { }); } - createSubscription(url, name, timerange = null, streamingOnly = false, maxQuality = 'best', audioOnly = false, - customArgs = null, customFileOutput = null) { - return this.http.post(this.path + 'subscribe', {url: url, name: name, timerange: timerange, maxQuality: maxQuality, - streamingOnly: streamingOnly, audioOnly: audioOnly, customArgs: customArgs, - customFileOutput: customFileOutput}, this.httpOptions); - } - updateSubscription(subscription) { delete subscription['videos']; - return this.http.post(this.path + 'updateSubscription', {subscription: subscription}, this.httpOptions); + return this.http.post(this.path + 'updateSubscription', {subscription: subscription}, this.httpOptions); } - unsubscribe(sub, deleteMode = false) { - delete sub['videos']; - return this.http.post(this.path + 'unsubscribe', {sub: sub, deleteMode: deleteMode}, this.httpOptions) + unsubscribe(sub: SubscriptionRequestData, deleteMode = false) { + const body: UnsubscribeRequest = {sub: sub, deleteMode: deleteMode}; + return this.http.post(this.path + 'unsubscribe', body, this.httpOptions) } - deleteSubscriptionFile(sub, file, deleteForever, file_uid) { - delete sub['videos']; - return this.http.post(this.path + 'deleteSubscriptionFile', {sub: sub, file: file, deleteForever: deleteForever, - file_uid: file_uid}, this.httpOptions) + deleteSubscriptionFile(sub: SubscriptionRequestData, file: string, deleteForever: boolean, file_uid: string) { + const body: DeleteSubscriptionFileRequest = {sub: sub, file: file, deleteForever: deleteForever, + file_uid: file_uid}; + return this.http.post(this.path + 'deleteSubscriptionFile', body, this.httpOptions) } - getSubscription(id, name = null) { - return this.http.post(this.path + 'getSubscription', {id: id, name: name}, this.httpOptions); + getSubscription(id: string, name: string = null) { + const body: GetSubscriptionRequest = {id: id, name: name}; + return this.http.post(this.path + 'getSubscription', body, this.httpOptions); } getAllSubscriptions() { - return this.http.post(this.path + 'getSubscriptions', {}, this.httpOptions); + return this.http.post(this.path + 'getSubscriptions', {}, this.httpOptions); } - getCurrentDownloads(uids = null) { - return this.http.post(this.path + 'downloads', {uids: uids}, this.httpOptions); + getCurrentDownloads(uids: Array = null) { + const body: GetAllDownloadsRequest = {uids: uids}; + return this.http.post(this.path + 'downloads', body, this.httpOptions); } - getCurrentDownload(download_uid) { - return this.http.post(this.path + 'download', {download_uid: download_uid}, this.httpOptions); + getCurrentDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'download', body, this.httpOptions); } - pauseDownload(download_uid) { - return this.http.post(this.path + 'pauseDownload', {download_uid: download_uid}, this.httpOptions); + pauseDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'pauseDownload', body, this.httpOptions); } pauseAllDownloads() { - return this.http.post(this.path + 'pauseAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'pauseAllDownloads', {}, this.httpOptions); } - resumeDownload(download_uid) { - return this.http.post(this.path + 'resumeDownload', {download_uid: download_uid}, this.httpOptions); + resumeDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'resumeDownload', body, this.httpOptions); } resumeAllDownloads() { - return this.http.post(this.path + 'resumeAllDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'resumeAllDownloads', {}, this.httpOptions); } - restartDownload(download_uid) { - return this.http.post(this.path + 'restartDownload', {download_uid: download_uid}, this.httpOptions); + restartDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'restartDownload', body, this.httpOptions); } - cancelDownload(download_uid) { - return this.http.post(this.path + 'cancelDownload', {download_uid: download_uid}, this.httpOptions); + cancelDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'cancelDownload', body, this.httpOptions); } - clearDownload(download_uid) { - return this.http.post(this.path + 'clearDownload', {download_uid: download_uid}, this.httpOptions); + clearDownload(download_uid: string) { + const body: GetDownloadRequest = {download_uid: download_uid}; + return this.http.post(this.path + 'clearDownload', body, this.httpOptions); } clearFinishedDownloads() { - return this.http.post(this.path + 'clearFinishedDownloads', {}, this.httpOptions); + return this.http.post(this.path + 'clearFinishedDownloads', {}, this.httpOptions); + } + + getTasks() { + return this.http.post(this.path + 'getTasks', {}, this.httpOptions); + } + + resetTasks() { + return this.http.post(this.path + 'resetTasks', {}, this.httpOptions); + } + + getTask(task_key: string) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'getTask', body, this.httpOptions); + } + + runTask(task_key: string) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'runTask', body, this.httpOptions); + } + + confirmTask(task_key: string) { + const body: GetTaskRequest = {task_key: task_key}; + return this.http.post(this.path + 'confirmTask', body, this.httpOptions); + } + + updateTaskSchedule(task_key: string, schedule: Schedule) { + const body: UpdateTaskScheduleRequest = {task_key: task_key, new_schedule: schedule}; + return this.http.post(this.path + 'updateTaskSchedule', body, this.httpOptions); + } + + updateTaskData(task_key: string, data: any) { + const body: UpdateTaskDataRequest = {task_key: task_key, new_data: data}; + return this.http.post(this.path + 'updateTaskData', body, this.httpOptions); + } + + getDBBackups() { + return this.http.post(this.path + 'getDBBackups', {}, this.httpOptions); + } + + restoreDBBackup(file_name: string) { + const body: RestoreDBBackupRequest = {file_name: file_name}; + return this.http.post(this.path + 'restoreDBBackup', body, this.httpOptions); } getVersionInfo() { - return this.http.get(this.path + 'versionInfo', this.httpOptions); + return this.http.get(this.path + 'versionInfo', this.httpOptions); } - updateServer(tag) { - return this.http.post(this.path + 'updateServer', {tag: tag}, this.httpOptions); + updateServer(tag: string) { + const body: UpdateServerRequest = {tag: tag}; + return this.http.post(this.path + 'updateServer', body, this.httpOptions); } getUpdaterStatus() { - return this.http.get(this.path + 'updaterStatus', this.httpOptions); + return this.http.get(this.path + 'updaterStatus', this.httpOptions); } // gets tag of the latest version of youtubedl-material @@ -495,9 +667,9 @@ export class PostsService implements CanActivate { } // user methods - login(username, password) { - const call = this.http.post(this.path + 'auth/login', {username: username, password: password}, this.httpOptions); - return call; + login(username: string, password: string) { + const body: LoginRequest = {username: username, password: password}; + return this.http.post(this.path + 'auth/login', body, this.httpOptions); } // user methods @@ -538,10 +710,11 @@ export class PostsService implements CanActivate { } // user methods - register(username, password) { - const call = this.http.post(this.path + 'auth/register', {userid: username, - username: username, - password: password}, this.httpOptions); + register(username: string, password: string) { + const body: RegisterRequest = {userid: username, + username: username, + password: password} + const call = this.http.post(this.path + 'auth/register', body, this.httpOptions); return call; } @@ -586,10 +759,11 @@ export class PostsService implements CanActivate { return this.http.post(this.path + 'auth/adminExists', {}, this.httpOptions); } - createAdminAccount(password) { - return this.http.post(this.path + 'auth/register', {userid: 'admin', - username: 'admin', - password: password}, this.httpOptions); + createAdminAccount(password: string) { + const body: RegisterRequest = {userid: 'admin', + username: 'admin', + password: password}; + return this.http.post(this.path + 'auth/register', body, this.httpOptions); } checkAdminCreationStatus(force_show = false) { @@ -604,12 +778,14 @@ export class PostsService implements CanActivate { }); } - changeUser(change_obj) { - return this.http.post(this.path + 'updateUser', {change_object: change_obj}, this.httpOptions); + changeUser(change_obj: UpdateUserRequest['change_object']) { + const body: UpdateUserRequest = {change_object: change_obj}; + return this.http.post(this.path + 'updateUser', body, this.httpOptions); } - deleteUser(uid) { - return this.http.post(this.path + 'deleteUser', {uid: uid}, this.httpOptions); + deleteUser(uid: string) { + const body: DeleteUserRequest = {uid: uid}; + return this.http.post(this.path + 'deleteUser', body, this.httpOptions); } changeUserPassword(user_uid, new_password) { @@ -617,20 +793,22 @@ export class PostsService implements CanActivate { } getUsers() { - return this.http.post(this.path + 'getUsers', {}, this.httpOptions); + return this.http.post(this.path + 'getUsers', {}, this.httpOptions); } getRoles() { - return this.http.post(this.path + 'getRoles', {}, this.httpOptions); + return this.http.post(this.path + 'getRoles', {}, this.httpOptions); } - setUserPermission(user_uid, permission, new_value) { - return this.http.post(this.path + 'changeUserPermissions', {user_uid: user_uid, permission: permission, new_value: new_value}, + setUserPermission(user_uid: string, permission: UserPermission, new_value: YesNo) { + const body: ChangeUserPermissionsRequest = {user_uid: user_uid, permission: permission, new_value: new_value}; + return this.http.post(this.path + 'changeUserPermissions', body, this.httpOptions); } - setRolePermission(role_name, permission, new_value) { - return this.http.post(this.path + 'changeRolePermissions', {role: role_name, permission: permission, new_value: new_value}, + setRolePermission(role_name: string, permission: UserPermission, new_value: YesNo) { + const body: ChangeRolePermissionsRequest = {role: role_name, permission: permission, new_value: new_value}; + return this.http.post(this.path + 'changeRolePermissions', body, this.httpOptions); } diff --git a/src/app/settings/locales_list.ts b/src/app/settings/locales_list.ts index 9235937..7d5687a 100644 --- a/src/app/settings/locales_list.ts +++ b/src/app/settings/locales_list.ts @@ -445,7 +445,7 @@ export const isoLangs = { 'name': 'Navajo, Navaho', 'nativeName': 'Diné bizaad, Dinékʼehǰí' }, - 'nb': { + 'nb-NO': { 'name': 'Norwegian Bokmål', 'nativeName': 'Norsk bokmål', 'ngID': 'nb' diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index e7e0223..aa453a4 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -1,12 +1,5 @@

Settings

- - - - - + @@ -88,7 +81,9 @@ Language - {{all_locales[locale]['nativeName']}} + + {{all_locales[locale]['nativeName']}} + @@ -130,7 +125,7 @@
- Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,,
@@ -272,9 +267,12 @@ Also known as a Client ID. Generating a key is easy!
-
+
Use SponsorBlock API
+
+ Generate NFO files +
@@ -423,52 +421,59 @@ - -
-
- Allow user registration + + +
+ Users
- - - - - Internal - - - LDAP - - - -
+ + +
- - - + Allow user registration
-
- - - -
-
- - - -
-
- - - -
-
- - - + + + + + Internal + + + LDAP + + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
- -
- + +
diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index 483c4db..81854c9 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -12,6 +12,7 @@ import { ConfirmDialogComponent } from 'app/dialogs/confirm-dialog/confirm-dialo import { moveItemInArray, CdkDragDrop } from '@angular/cdk/drag-drop'; import { InputDialogComponent } from 'app/input-dialog/input-dialog.component'; import { EditCategoryDialogComponent } from 'app/dialogs/edit-category-dialog/edit-category-dialog.component'; +import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'app-settings', @@ -20,7 +21,7 @@ import { EditCategoryDialogComponent } from 'app/dialogs/edit-category-dialog/ed }) export class SettingsComponent implements OnInit { all_locales = isoLangs; - supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'id', 'en-GB']; + supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'ko', 'id', 'en-GB']; initialLocale = localStorage.getItem('locale'); initial_config = null; @@ -38,17 +39,28 @@ export class SettingsComponent implements OnInit { latestGithubRelease = null; CURRENT_VERSION = CURRENT_VERSION - get settingsAreTheSame() { + tabs = ['main', 'downloader', 'extra', 'database', 'advanced', 'users', 'logs']; + tabIndex = 0; + + INDEX_TO_TAB = Object.assign({}, this.tabs); + TAB_TO_INDEX = {}; + + usersTabDisabledTooltip = $localize`You must enable multi-user mode to access this tab.`; + + get settingsAreTheSame(): boolean { this._settingsSame = this.settingsSame() return this._settingsSame; } - set settingsAreTheSame(val) { + set settingsAreTheSame(val: boolean) { this._settingsSame = val; } constructor(public postsService: PostsService, private snackBar: MatSnackBar, private sanitizer: DomSanitizer, - private dialog: MatDialog) { } + private dialog: MatDialog, private router: Router, private route: ActivatedRoute) { + // invert index to tab + Object.keys(this.INDEX_TO_TAB).forEach(key => { this.TAB_TO_INDEX[this.INDEX_TO_TAB[key]] = key; }); + } ngOnInit() { if (this.postsService.initialized) { @@ -66,6 +78,16 @@ export class SettingsComponent implements OnInit { this.generated_bookmarklet_code = this.sanitizer.bypassSecurityTrustUrl(this.generateBookmarkletCode()); this.getLatestGithubRelease(); + + const tab = this.route.snapshot.paramMap.get('tab'); + this.tabIndex = tab && this.TAB_TO_INDEX[tab] ? this.TAB_TO_INDEX[tab] : 0; + + this.postsService.getSupportedLocales().subscribe(res => { + if (res && res['supported_locales']) { + this.supported_locales = ['en', 'en-GB']; // required + this.supported_locales = this.supported_locales.concat(res['supported_locales']); + } + }); } getConfig() { @@ -98,6 +120,11 @@ export class SettingsComponent implements OnInit { this.new_config = JSON.parse(JSON.stringify(this.initial_config)); } + tabChanged(event) { + const index = event['index']; + this.router.navigate(['/settings', {tab: this.INDEX_TO_TAB[index]}]); + } + dropCategory(event: CdkDragDrop) { moveItemInArray(this.postsService.categories, event.previousIndex, event.currentIndex); this.postsService.updateCategories(this.postsService.categories).subscribe(res => { diff --git a/src/app/subscription/subscription/subscription.component.ts b/src/app/subscription/subscription/subscription.component.ts index e86789f..967b5bd 100644 --- a/src/app/subscription/subscription/subscription.component.ts +++ b/src/app/subscription/subscription/subscription.component.ts @@ -49,8 +49,10 @@ export class SubscriptionComponent implements OnInit, OnDestroy { constructor(private postsService: PostsService, private route: ActivatedRoute, private router: Router, private dialog: MatDialog) { } ngOnInit() { - if (this.route.snapshot.paramMap.get('id')) { - this.id = this.route.snapshot.paramMap.get('id'); + this.route.params.subscribe(params => { + this.id = params['id']; + + if (this.sub_interval) { clearInterval(this.sub_interval); } this.postsService.service_initialized.subscribe(init => { if (init) { @@ -59,7 +61,7 @@ export class SubscriptionComponent implements OnInit, OnDestroy { this.sub_interval = setInterval(() => this.getSubscription(true), 1000); } }); - } + }); // set filter property to cached const cached_filter_property = localStorage.getItem('filter_property'); diff --git a/src/assets/default.json b/src/assets/default.json index a0640fd..c479d6e 100644 --- a/src/assets/default.json +++ b/src/assets/default.json @@ -11,7 +11,10 @@ "custom_args": "", "safe_download_override": false, "include_thumbnail": false, - "include_metadata": true + "include_metadata": true, + "default_file_output": "", + "max_concurrent_downloads": 5, + "download_rate_limit": "" }, "Extra": { "title_top": "YoutubeDL-Material", @@ -21,7 +24,8 @@ "allow_multi_download_mode": true, "settings_pin_required": false, "enable_downloads_manager": true, - "allow_playlist_categorization": true + "allow_playlist_categorization": true, + "allow_autoplay": true }, "API": { "use_API_key": false, @@ -30,7 +34,9 @@ "youtube_API_key": "", "use_twitch_API": false, "twitch_API_key": "", - "twitch_auto_download_chat": true + "twitch_auto_download_chat": true, + "use_sponsorblock_API": false, + "generate_NFO_files": false }, "Themes": { "default_theme": "default", @@ -40,7 +46,8 @@ "allow_subscriptions": true, "subscriptions_base_path": "subscriptions/", "subscriptions_check_interval": "86400", - "subscriptions_use_youtubedl_archive": true + "subscriptions_use_youtubedl_archive": true, + "redownload_fresh_uploads": false }, "Users": { "base_path": "users/", @@ -69,4 +76,4 @@ "default_downloader": "youtube-dl" } } -} +} \ No newline at end of file diff --git a/src/assets/i18n/messages.ca.json b/src/assets/i18n/messages.ca.json deleted file mode 100644 index 72e473c..0000000 --- a/src/assets/i18n/messages.ca.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Quant a", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Fosc", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Paràmetres", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Inici", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Inicia la sessió", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Subscripcions", - "822fab38216f64e8166d368b59fe756ca39d301b": "Baixades", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Només àudio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Baixa", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualitat", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utilitza un URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Visualitza", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Mode de baixades múltiples", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancel·la", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avançat", - "4e4c721129466be9c3862294dc40241b64045998": "Utilitza arguments personalitzats", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arguments personalitzats", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "No cal incloure l’URL, només tot el que hi ha després. Separeu els arguments amb dues comes: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Utilitza una sortida personalitzada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Sortida personalitzada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentació", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "El camí és relatiu al camí de baixada de la configuració. No hi inclogueu l’extensió.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Ordre simulada:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Utilitza autenticació", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nom d’usuari", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Contrasenya", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una llista de reproducció", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nom", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipus", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Àudio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Fitxers d’àudio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vídeos", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Subscriviu-vos a la llista o al canal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "L’URL de la llista o el canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nom personalitzat", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Baixa totes les pujades", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualitat màxima", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Mode només d’àudio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Mode només de transmissió", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Aquestes s’afegeixen després dels arguments estàndards.", - "98b6ec9ec138186d663e64770267b67334353d63": "Sortida de fitxer personalitzada", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancel·la", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Subscriviu-vos", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Baixeu els vídeos penjats a la darrera", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipus:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "Id.:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Tanca", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exporta l’arxiu", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Cancel·la la subscripció", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(En pausa)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arxiu:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nom:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Carregador:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Mida del fitxer:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Camí:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data de pujada:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifica arguments del youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Arguments nous simulats", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Afegeix un argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cerca per categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Utilitza el valor de l’argument", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Afegeix un argument", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifica", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor de l’argument", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Actualitzador", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registra un usuari", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nom d’usuari", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registra", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Puja galetes noves", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Tingueu en compte també que les galetes són de tota la instància i no per usuari.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrossegar i deixar anar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifica la llista de reproducció", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Afegeix contingut", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Desa", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordre normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordre invers", - "d02888c485d3aeab6de628508f4a00312a722894": "Els meus vídeos", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cerca", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "No s’ha trobat cap vídeo.", - "3697f8583ea42868aa269489ad366103d94aece7": "Editant", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausat", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editant la categoria", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regles", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Afegeix una regla nova", - "792dc6a57f28a1066db283f2e736484f066005fd": "Baixa el xat del Twitch", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Edita", - "826b25211922a1b46436589233cb6f1a163d89b7": "Suprimeix", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informació", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Recompte:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Suprimeix i afegeix a la llista negra", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualitzacions", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Desa els canvis", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "La descàrrega ha estat correcta", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "S'ha produït un error", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalls", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "S’ha produït un error:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inici de la baixada:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Final de la baixada:", - "ad127117f9471612f47d01eae09709da444a36a4": "Camins de fitxers:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Les vostres subscripcions", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canals", - "47546e45bbb476baaaad38244db444c427ddc502": "Llistes de reproducció", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "El nom no està disponible. S’està recuperant el canal.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "No tens cap subscripció al canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "El nom no està disponible. Recuperant la llista de reproducció.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "No tens cap subscripció a la llista de reproducció.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Descarregador", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avançat", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuaris", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registres", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL des d’on s’accedirà a aquesta aplicació, sense el port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "El port desitjat. Per defecte és 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Mode multiusuari", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Ruta base dels usuaris", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Ruta base per als usuaris i els seus vídeos descarregats.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permet les subscripcions", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Ruta base de subscripcions", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Ruta base per als vídeos dels vostres canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval de comprovació", - "0f56a7449b77630c114615395bbda4cab398efd8": "La unitat és de segons, només inclou números.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "De vegades, es descarreguen vídeos nous abans de processar-los completament. Aquesta configuració fa que, pels vídeos nous, es comprovi si hi ha una versió de més qualitat l'endemà.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Torneu a descarregar les càrregues noves", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Per defecte", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permet canviar el tema", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Camí a la carpeta d’àudio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Ruta de descàrregues de només d'àudio. És relatiu a la carpeta arrel de YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Ruta de la carpeta de vídeo", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Ruta de descàrregues de vídeo. És relatiu a la carpeta arrel de YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Sortida de fitxer per defecte", - "1148fd45287ff09955b938756bc302042bcb29c7": "La ruta és relativa a les rutes de descàrrega anteriors. No inclogueu l'extensió.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Arguments personalitzats globals", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Arguments personalitzats globals per a descàrregues a la pàgina inicial. Els arguments es delimiten amb dues comes, així: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categories", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Utilitzeu l'arxiu youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inclou la miniatura", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inclou-hi metadades", - "fb35145bfb84521e21b6385363d59221f436a573": "Mata totes les descàrregues", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Títol superior", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Gestor de fitxers habilitat", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Gestor de descàrregues habilitat", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permet seleccionar la qualitat", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Mode de només baixades", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permet el mode de descàrrega múltiple", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilita l'API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clau API pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Mostra la documentació", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Això suprimirà la vostra clau de l’API anterior!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genera", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utilitza l’API del YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clau de l’API del YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "És senzill generar una clau!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Utilitza l’API del Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clau de l’API del Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "També coneguda com a identificador de client.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Baixa automàticament el xat del Twitch", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Feu clic aquí", - "7f09776373995003161235c0c8d02b7f91dbc4df": "per a baixar manualment l’extensió YouTubeDL-Material per al Chrome.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Heu de carregar manualment l'extensió i modificar la seva configuració per configurar l'URL de la interfície.", - "9a2ec6da48771128384887525bdcac992632c863": "per instal·lar l'extensió oficial de YoutubeDL-Material per a Firefox directament des de la pàgina d'extensions de Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruccions detallades de configuració.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "No cal gaire cosa, a part de canviar la configuració de l'extensió per establir l'URL de la interfície.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arrossegueu l’enllaç següent als vostres adreces d'interès i ja podreu començar! Només cal que aneu al vídeo de YouTube que vulgueu baixar i feu clic al marcador.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genereu el marcador 'només àudio'", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleccioneu un baixador", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Utilitzeu l'agent de descàrrega predeterminat", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleccioneu un agent de descàrrega", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nivell de registre", - "db6c192032f4cab809aad35215f0aa4765761897": "Caducitat de l'inici de sessió", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permet la descàrrega avançada", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Utilitza les galetes", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Defineix les galetes", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permetre el registre d’usuari", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Mètode d’autenticació", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "DN de vinculació", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Credencials de vinculació", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Base de Cerca", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtre de cerca", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Quant al YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "és un descarregador de YouTube de codi obert construït segons les especificacions de Material Design de Google. Podeu descarregar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per estar al dia amb els nous vídeos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "té algunes funcions increïbles incloses. Una àmplia API, assistència de Docker i suport de localització (traducció). Feu clic a la icona de GitHub de més amunt per llegir totes les funcions compatibles.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versió instal·lada:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Heu trobat un error o teniu un suggeriment?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "per crear un report de problema!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "S’està comprovant si hi ha actualitzacions…", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Hi ha una actualització disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Podeu actualitzar des del menú de paràmetres.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleccioneu una versió:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Activa la compartició", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usa la marca de temps", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segons", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copia al porta-retalls", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Comparteix la llista", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Comparteix el vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Comparteix l’àudio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Id. de la sessió:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Neteja totes les baixades", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "No hi ha cap descàrrega disponible!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "El teu perfil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Tancar sessió", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creat:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "No heu iniciat la sessió.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crea un compte d'administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "No s'ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d'un compte d'administrador amb el nom d'usuari 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Crea", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Afegeix usuaris", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Edita el rol", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nom d’usuari", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rol", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Accions", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gestiona l'usuari", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Suprimeix l'usuari", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Edita l'usuari", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID d'usuari:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nova contrasenya", - "6498fa1b8f563988f769654a75411bb8060134b9": "Establir una contrasenya nova", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Utilitzeu el rol per defecte", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sí", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestiona el rol", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Línies:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Esborra els registres", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Generat automàticament", - "ccf5ea825526ac490974336cb5c24352886abc07": "Obrir fitxer", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Obre el fitxer en una pestanya nova", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Anar a la subscripció", - "94e01842dcee90531caa52e4147f70679bac87fe": "Suprimeix i torna a descarregar", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Esborra per sempre", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Veure més.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Veure menys.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Llargada:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.ca.xlf b/src/assets/i18n/messages.ca.xlf index 874cdec..0093b91 100644 --- a/src/assets/i18n/messages.ca.xlf +++ b/src/assets/i18n/messages.ca.xlf @@ -1,4 +1,4 @@ - + @@ -35,7 +35,7 @@ Settings - Paràmetres + Configuració src/app/app.component.html 28 @@ -57,7 +57,7 @@ Login - Inicia la sessió + Iniciar sessió src/app/app.component.html 44 @@ -83,7 +83,7 @@ Downloads - Baixades + Descàrregues src/app/app.component.html 46 @@ -101,7 +101,7 @@ Download - Baixa + Descarregar src/app/main/main.component.html 74,75 @@ -119,7 +119,7 @@ Use URL - Utilitza un URL + Utilitzar l'URL src/app/main/main.component.html 46 @@ -128,7 +128,7 @@ View - Visualitza + Veure src/app/main/main.component.html 50,51 @@ -146,7 +146,7 @@ Cancel - Cancel·la + Cancel·lar src/app/main/main.component.html 79,80 @@ -164,7 +164,7 @@ Use custom args - Utilitza arguments personalitzats + Utilitzar arguments personalitzats src/app/main/main.component.html 105,106 @@ -190,7 +190,7 @@ No need to include URL, just everything after. Args are delimited using two commas like so: ,, - No cal incloure l’URL, només tot el que hi ha després. Separeu els arguments amb dues comes: ,, + No cal incloure l’URL, només tot el que hi ha després. Separa els arguments amb dues comes: ,, src/app/main/main.component.html 113,114 @@ -199,7 +199,7 @@ Use custom output - Utilitza una sortida personalitzada + Utilitzar una sortida personalitzada src/app/main/main.component.html 121,122 @@ -242,7 +242,7 @@ Path is relative to the config download path. Don't include extension. - El camí és relatiu al camí de baixada de la configuració. No hi inclogueu l’extensió. + El camí és relatiu al camí de descàrrega de la configuració. No incloure l’extensió. src/app/main/main.component.html 128 @@ -272,7 +272,7 @@ Use authentication - Utilitza autenticació + Utilitzar l'autenticació src/app/main/main.component.html 135,136 @@ -307,7 +307,7 @@ Create a playlist - Crea una llista de reproducció + Crear una llista de reproducció src/app/create-playlist/create-playlist.component.html 1 @@ -382,7 +382,7 @@ Subscribe to playlist or channel - Subscriviu-vos a la llista o al canal + Subscriu-te a la llista de reproducció o al canal src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 1 @@ -404,7 +404,7 @@ The playlist or channel URL - L’URL de la llista o el canal + URL de la llista de reproducció o del canal src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 9 @@ -422,7 +422,7 @@ Download all uploads - Baixa totes les pujades + Descarregar tots els vídeos penjats src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 23 @@ -448,7 +448,7 @@ Audio-only mode - Mode només d’àudio + Mode de només àudio src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 47 @@ -461,7 +461,7 @@ Streaming-only mode - Mode només de transmissió + Mode de només transmissió src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 52 @@ -474,7 +474,7 @@ These are added after the standard args. - Aquestes s’afegeixen després dels arguments estàndards. + Aquests s’afegeixen després dels arguments estàndards. src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 60 @@ -487,7 +487,7 @@ Custom file output - Sortida de fitxer personalitzada + Sortida de fitxer personalitzat src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 66 @@ -504,7 +504,7 @@ Cancel - Cancel·la + Cancel·lar src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 79 @@ -529,7 +529,7 @@ Subscribe - Subscriviu-vos + Subscriu-te src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 81 @@ -538,7 +538,7 @@ Download videos uploaded in the last - Baixeu els vídeos penjats a la darrera + Descarregar els vídeos penjats en els darrers src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html 26 @@ -573,7 +573,7 @@ ID: - Id.: + ID: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 13 @@ -590,7 +590,7 @@ Close - Tanca + Tancar src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 23 @@ -635,7 +635,7 @@ Export Archive - Exporta l’arxiu + Exportar el fitxer src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 24 @@ -644,7 +644,7 @@ Unsubscribe - Cancel·la la subscripció + Cancel·lar la subscripció src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 26 @@ -678,7 +678,7 @@ Archive: - Arxiu: + Fitxer: src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html 17 @@ -745,7 +745,7 @@ Modify youtube-dl args - Modifica arguments del youtube-dl + Modificar els arguments de descàrrega src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 1 @@ -754,7 +754,7 @@ Simulated new args - Arguments nous simulats + Arguments simulats nous src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 8 @@ -763,7 +763,7 @@ Add an arg - Afegeix un argument + Afegir un argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 34 @@ -772,7 +772,7 @@ Search by category - Cerca per categoria + Cercar per categoria src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 60 @@ -781,7 +781,7 @@ Use arg value - Utilitza el valor de l’argument + Utilitzar el valor de l’argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 64 @@ -790,7 +790,7 @@ Add arg - Afegeix un argument + Afegir un argument src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 73 @@ -799,7 +799,7 @@ Modify - Modifica + Modificar src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 85 @@ -826,7 +826,7 @@ Register a user - Registra un usuari + Registrar un usuari src/app/dialogs/add-user-dialog/add-user-dialog.component.html 1 @@ -844,7 +844,7 @@ Register - Registra + Registrar-se src/app/dialogs/add-user-dialog/add-user-dialog.component.html 17 @@ -857,7 +857,7 @@ Upload new cookies - Puja galetes noves + Pujar galetes noves src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -866,7 +866,7 @@ NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. - NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Tingueu en compte també que les galetes són de tota la instància i no per usuari. + NOTA: La càrrega de galetes noves anul·larà les galetes anteriors. Les galetes són per a tota la instància, no per usuari. src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 20 @@ -884,7 +884,7 @@ Modify playlist - Modifica la llista de reproducció + Modificar la llista de reproducció src/app/dialogs/modify-playlist/modify-playlist.component.html 1 @@ -893,7 +893,7 @@ Add content - Afegeix contingut + Afegir contingut src/app/dialogs/modify-playlist/modify-playlist.component.html 19 @@ -902,7 +902,7 @@ Save - Desa + Desar src/app/dialogs/modify-playlist/modify-playlist.component.html 37 @@ -954,7 +954,7 @@ Search - Cerca + Cercar src/app/components/recent-videos/recent-videos.component.html 24 @@ -989,7 +989,7 @@ Paused - Pausat + En pausa src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 7 @@ -998,7 +998,7 @@ Editing category - Editant la categoria + Modificació de la categoria src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 1 @@ -1016,7 +1016,7 @@ Add new rule - Afegeix una regla nova + Afegir una regla nova src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 39 @@ -1025,7 +1025,7 @@ Download Twitch Chat - Baixa el xat del Twitch + Descarregar el xat de Twitch src/app/components/twitch-chat/twitch-chat.component.html 10 @@ -1034,7 +1034,7 @@ Edit - Edita + Editar src/app/file-card/file-card.component.html 19 @@ -1047,7 +1047,7 @@ Delete - Suprimeix + Eliminar src/app/file-card/file-card.component.html 20 @@ -1094,7 +1094,7 @@ Delete and blacklist - Suprimeix i afegeix a la llista negra + Eliminar i posar a la llista negra src/app/file-card/file-card.component.html 26 @@ -1125,7 +1125,7 @@ The download was successful - La descàrrega ha estat correcta + Descàrrega correcta src/app/download-item/download-item.component.html 8 @@ -1138,7 +1138,7 @@ An error has occurred - S'ha produït un error + S’ha produït un error src/app/download-item/download-item.component.html 9 @@ -1169,7 +1169,7 @@ Download start: - Inici de la baixada: + Inici de la descàrrega: src/app/download-item/download-item.component.html 32 @@ -1178,7 +1178,7 @@ Download end: - Final de la baixada: + Final de la descàrrega: src/app/download-item/download-item.component.html 35 @@ -1196,7 +1196,7 @@ Your subscriptions - Les vostres subscripcions + Les teves subscripcions src/app/subscriptions/subscriptions.component.html 3 @@ -1223,7 +1223,7 @@ Name not available. Channel retrieval in progress. - El nom no està disponible. S’està recuperant el canal. + El nom no està disponible. S'estan recuperant els canals. src/app/subscriptions/subscriptions.component.html 14 @@ -1232,7 +1232,7 @@ You have no channel subscriptions. - No tens cap subscripció al canal. + No teniu cap subscripció a canals. src/app/subscriptions/subscriptions.component.html 24 @@ -1250,7 +1250,7 @@ You have no playlist subscriptions. - No tens cap subscripció a la llista de reproducció. + No tens cap subscripció a llistes de reproducció. src/app/subscriptions/subscriptions.component.html 43 @@ -1348,7 +1348,7 @@ The desired port. Default is 17442. - El port desitjat. Per defecte és 17442. + Port desitjat. Per defecte 17442. src/app/settings/settings.component.html 25 @@ -1366,7 +1366,7 @@ Users base path - Ruta base dels usuaris + Camí base d'usuaris src/app/settings/settings.component.html 38 @@ -1375,7 +1375,7 @@ Base path for users and their downloaded videos. - Ruta base per als usuaris i els seus vídeos descarregats. + Camí base per als usuaris i els seus vídeos descarregats. src/app/settings/settings.component.html 39 @@ -1384,7 +1384,7 @@ Allow subscriptions - Permet les subscripcions + Permetre subscripcions src/app/settings/settings.component.html 48 @@ -1392,8 +1392,8 @@ Allow subscriptions setting - Subscriptions base path - Ruta base de subscripcions + Base bath for subscriptions + Camí base de subscripcions src/app/settings/settings.component.html 52 @@ -1402,7 +1402,7 @@ Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. - Ruta base per als vídeos dels vostres canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material. + Camí base per als vídeos dels teus canals i llistes de reproducció subscrits. És relatiu a la carpeta arrel de YTDL-Material. src/app/settings/settings.component.html 53 @@ -1420,7 +1420,7 @@ Unit is seconds, only include numbers. - La unitat és de segons, només inclou números. + La unitat és de segons, posa només números. src/app/settings/settings.component.html 59 @@ -1438,7 +1438,7 @@ Redownload fresh uploads - Torneu a descarregar les càrregues noves + Tornar a descarregar les pujades noves src/app/settings/settings.component.html 63 @@ -1465,7 +1465,7 @@ Allow theme change - Permet canviar el tema + Permetre canviar el tema src/app/settings/settings.component.html 80 @@ -1492,7 +1492,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. - Ruta de descàrregues de només d'àudio. És relatiu a la carpeta arrel de YTDL-Material. + Camí de descàrregues de només àudio. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 110 @@ -1501,7 +1501,7 @@ Video folder path - Ruta de la carpeta de vídeo + Camí de la carpeta de vídeo src/app/settings/settings.component.html 116 @@ -1510,7 +1510,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. - Ruta de descàrregues de vídeo. És relatiu a la carpeta arrel de YTDL-Material. + Camí de descàrregues de vídeo. És relatiu a la carpeta arrel del YTDL-Material. src/app/settings/settings.component.html 117 @@ -1519,7 +1519,7 @@ Default file output - Sortida de fitxer per defecte + Sortida de fitxer predeterminada src/app/settings/settings.component.html 123 @@ -1528,7 +1528,7 @@ Path is relative to the above download paths. Don't include extension. - La ruta és relativa a les rutes de descàrrega anteriors. No inclogueu l'extensió. + El camí és relatiu als camins de descàrrega anteriors. No incloguis l'extensió. src/app/settings/settings.component.html 126 @@ -1564,7 +1564,7 @@ Use youtube-dl archive - Utilitzeu l'arxiu youtube-dl + Utilitzar el fitxer youtube-dl src/app/settings/settings.component.html 163 @@ -1573,7 +1573,7 @@ Include thumbnail - Inclou la miniatura + Incloure la miniatura src/app/settings/settings.component.html 167 @@ -1582,7 +1582,7 @@ Include metadata - Inclou-hi metadades + Incloure metadades src/app/settings/settings.component.html 171 @@ -1591,7 +1591,7 @@ Kill all downloads - Mata totes les descàrregues + Finalitzar totes les descàrregues src/app/settings/settings.component.html 175 @@ -1609,7 +1609,7 @@ File manager enabled - Gestor de fitxers habilitat + Gestor de fitxers activat src/app/settings/settings.component.html 193 @@ -1618,7 +1618,7 @@ Downloads manager enabled - Gestor de descàrregues habilitat + Gestor de descàrregues activat src/app/settings/settings.component.html 196 @@ -1627,7 +1627,7 @@ Allow quality select - Permet seleccionar la qualitat + Permetre seleccionar la qualitat src/app/settings/settings.component.html 199 @@ -1636,7 +1636,7 @@ Download only mode - Mode de només baixades + Mode de només descàrrega src/app/settings/settings.component.html 202 @@ -1654,7 +1654,7 @@ Enable Public API - Habilita l'API pública + Activar API pública src/app/settings/settings.component.html 213 @@ -1672,7 +1672,7 @@ View documentation - Mostra la documentació + Veure la documentació src/app/settings/settings.component.html 219 @@ -1681,7 +1681,7 @@ This will delete your old API key! - Això suprimirà la vostra clau de l’API anterior! + Això eliminarà la teva clau API anterior! src/app/settings/settings.component.html 223 @@ -1690,7 +1690,7 @@ Generate - Genera + Generar src/app/settings/settings.component.html 223 @@ -1699,7 +1699,7 @@ Use YouTube API - Utilitza l’API del YouTube + Utilitzar l’API de YouTube src/app/settings/settings.component.html 232 @@ -1708,7 +1708,7 @@ Youtube API Key - Clau de l’API del YouTube + Clau API de YouTube src/app/settings/settings.component.html 236 @@ -1730,7 +1730,7 @@ Use Twitch API - Utilitza l’API del Twitch + Utilitzar l’API de Twitch src/app/settings/settings.component.html 241 @@ -1739,7 +1739,7 @@ Twitch API Key - Clau de l’API del Twitch + Clau API de Twitch src/app/settings/settings.component.html 248 @@ -1748,7 +1748,7 @@ Also known as a Client ID. - També coneguda com a identificador de client. + També coneguda com a ID de client. src/app/settings/settings.component.html 249 @@ -1757,7 +1757,7 @@ Auto-download Twitch Chat - Baixa automàticament el xat del Twitch + Descarregar automàticament el xat de Twitch src/app/settings/settings.component.html 244 @@ -1766,7 +1766,7 @@ Click here - Feu clic aquí + Fes clic aquí src/app/settings/settings.component.html 259 @@ -1783,7 +1783,7 @@ to download the official YoutubeDL-Material Chrome extension manually. - per a baixar manualment l’extensió YouTubeDL-Material per al Chrome. + per a descarregar manualment l’extensió YouTubeDL-Material per a Chrome. src/app/settings/settings.component.html 259 @@ -1792,7 +1792,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. - Heu de carregar manualment l'extensió i modificar la seva configuració per configurar l'URL de la interfície. + Has de carregar manualment l'extensió i modificar-ne la configuració per a definir l'URL de la interfície. src/app/settings/settings.component.html 260 @@ -1801,7 +1801,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. - per instal·lar l'extensió oficial de YoutubeDL-Material per a Firefox directament des de la pàgina d'extensions de Firefox. + per a instal·lar l'extensió YoutubeDL-Material per a Firefox, directament des de la pàgina d'extensions de Firefox. src/app/settings/settings.component.html 265 @@ -1819,7 +1819,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - No cal gaire cosa, a part de canviar la configuració de l'extensió per establir l'URL de la interfície. + No cal gran cosa, només canviar la configuració de l'extensió per a establir l'URL de la interfície. src/app/settings/settings.component.html 266 @@ -1828,7 +1828,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. - Arrossegueu l’enllaç següent als vostres adreces d'interès i ja podreu començar! Només cal que aneu al vídeo de YouTube que vulgueu baixar i feu clic al marcador. + Arrossega l’enllaç següent als teus marcadors i ja pots començar! Ara ves al vídeo de YouTube a descarregar i fes clic al marcador. src/app/settings/settings.component.html 271 @@ -1837,7 +1837,7 @@ Generate 'audio only' bookmarklet - Genereu el marcador 'només àudio' + Generar un marcador «només àudio» src/app/settings/settings.component.html 272 @@ -1846,7 +1846,7 @@ Select a downloader - Seleccioneu un baixador + Seleccionar un descarregador src/app/settings/settings.component.html 287 @@ -1855,7 +1855,7 @@ Use default downloading agent - Utilitzeu l'agent de descàrrega predeterminat + Utilitzar el descarregador predeterminat src/app/settings/settings.component.html 295 @@ -1864,7 +1864,7 @@ Select a download agent - Seleccioneu un agent de descàrrega + Seleccionar un descarregador src/app/settings/settings.component.html 299 @@ -1891,7 +1891,7 @@ Allow advanced download - Permet la descàrrega avançada + Permetre la descàrrega avançada src/app/settings/settings.component.html 336 @@ -1900,7 +1900,7 @@ Use Cookies - Utilitza les galetes + Utilitzar les galetes src/app/settings/settings.component.html 344 @@ -1909,7 +1909,7 @@ Set Cookies - Defineix les galetes + Configurar les galetes src/app/settings/settings.component.html 345 @@ -1918,7 +1918,7 @@ Allow user registration - Permetre el registre d’usuari + Permetre el registre d’usuaris src/app/settings/settings.component.html 359 @@ -1963,7 +1963,7 @@ Bind DN - DN de vinculació + DN d'enllaç src/app/settings/settings.component.html 380 @@ -1972,7 +1972,7 @@ Bind Credentials - Credencials de vinculació + Credencials d'enllaç src/app/settings/settings.component.html 385 @@ -1981,7 +1981,7 @@ Search Base - Base de Cerca + Base de cerques src/app/settings/settings.component.html 390 @@ -1990,7 +1990,7 @@ Search Filter - Filtre de cerca + Filtre de cerques src/app/settings/settings.component.html 395 @@ -2008,7 +2008,7 @@ is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. - és un descarregador de YouTube de codi obert construït segons les especificacions de Material Design de Google. Podeu descarregar sense problemes els vostres vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure-us als vostres canals i llistes de reproducció preferits per estar al dia amb els nous vídeos. + és un descarregador de YouTube de codi obert construït segons les especificacions Material Design de Google. Pots descarregar sense problemes els vídeos preferits com a fitxers de vídeo o àudio i, fins i tot, subscriure't als canals i llistes de reproducció preferits per a estar al dia amb les novetats. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -2017,7 +2017,7 @@ has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. - té algunes funcions increïbles incloses. Una àmplia API, assistència de Docker i suport de localització (traducció). Feu clic a la icona de GitHub de més amunt per llegir totes les funcions compatibles. + té algunes funcions increïbles incloses. Una API àmplia, assistència de Docker i suport de localització (traducció). Fes clic a la icona de GitHub de més amunt per a llegir totes les funcions compatibles. src/app/dialogs/about-dialog/about-dialog.component.html 15 @@ -2035,7 +2035,7 @@ Found a bug or have a suggestion? - Heu trobat un error o teniu un suggeriment? + Has trobat un error o tens un suggeriment? src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2044,7 +2044,7 @@ to create an issue! - per crear un report de problema! + per a crear un informe d’error! src/app/dialogs/about-dialog/about-dialog.component.html 25 @@ -2053,7 +2053,7 @@ Checking for updates... - S’està comprovant si hi ha actualitzacions… + Comprovant actualitzacions… src/app/dialogs/about-dialog/about-dialog.component.html 20 @@ -2062,7 +2062,7 @@ Update available - Hi ha una actualització disponible + Actualització disponible src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2071,7 +2071,7 @@ You can update from the settings menu. - Podeu actualitzar des del menú de paràmetres. + Pots actualitzar des del menú configuració. src/app/dialogs/about-dialog/about-dialog.component.html 21 @@ -2080,7 +2080,7 @@ Select a version: - Seleccioneu una versió: + Seleccionar una versió: src/app/updater/updater.component.html 3 @@ -2089,7 +2089,7 @@ Enable sharing - Activa la compartició + Activar la compartició src/app/dialogs/share-media-dialog/share-media-dialog.component.html 10 @@ -2098,7 +2098,7 @@ Use timestamp - Usa la marca de temps + Utilitzar la marca horària src/app/dialogs/share-media-dialog/share-media-dialog.component.html 13 @@ -2116,7 +2116,7 @@ Copy to clipboard - Copia al porta-retalls + Copiar al porta-retalls src/app/dialogs/share-media-dialog/share-media-dialog.component.html 24 @@ -2125,7 +2125,7 @@ Share playlist - Comparteix la llista + Compartir la llista de reproducció src/app/dialogs/share-media-dialog/share-media-dialog.component.html 2 @@ -2197,7 +2197,7 @@ Logout - Tancar sessió + Finalitzar la sessió src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 28 @@ -2224,7 +2224,7 @@ You are not logged in. - No heu iniciat la sessió. + No has iniciat la sessió. src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 @@ -2233,7 +2233,7 @@ Create admin account - Crea un compte d'administrador + Crear un compte d'administrador src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 1 @@ -2242,7 +2242,7 @@ No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. - No s'ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d'un compte d'administrador amb el nom d'usuari 'admin'. + No s’ha detectat cap compte d'administrador predeterminat. Això crearà i definirà la contrasenya d’un compte d'administrador amb el nom d’usuari «admin». src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2251,7 +2251,7 @@ Create - Crea + Crear src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 17 @@ -2260,7 +2260,7 @@ Add Users - Afegeix usuaris + Afegir usuaris src/app/components/modify-users/modify-users.component.html 90 @@ -2269,7 +2269,7 @@ Edit Role - Edita el rol + Modificar el rol src/app/components/modify-users/modify-users.component.html 95 @@ -2305,7 +2305,7 @@ Manage user - Gestiona l'usuari + Gestionar usuari src/app/components/modify-users/modify-users.component.html 70 @@ -2318,7 +2318,7 @@ Delete user - Suprimeix l'usuari + Eliminar usuari src/app/components/modify-users/modify-users.component.html 73 @@ -2327,7 +2327,7 @@ Edit user - Edita l'usuari + Modificar usuari src/app/components/modify-users/modify-users.component.html 66 @@ -2336,7 +2336,7 @@ User UID: - UID d'usuari: + UID d’usuari: src/app/components/manage-user/manage-user.component.html 4 @@ -2345,7 +2345,7 @@ New password - Nova contrasenya + Contrasenya nova src/app/components/manage-user/manage-user.component.html 8 @@ -2354,7 +2354,7 @@ Set new password - Establir una contrasenya nova + Definir una contrasenya nova src/app/components/manage-user/manage-user.component.html 10 @@ -2363,7 +2363,7 @@ Use role default - Utilitzeu el rol per defecte + Utilitzar el rol predeterminat src/app/components/manage-user/manage-user.component.html 19 @@ -2398,7 +2398,7 @@ Manage role - Gestiona el rol + Gestionar rol src/app/components/manage-role/manage-role.component.html 1 @@ -2416,7 +2416,7 @@ Clear logs - Esborra els registres + Eliminar registres src/app/components/logs-viewer/logs-viewer.component.html 34 @@ -2443,7 +2443,7 @@ Open file in new tab - Obre el fitxer en una pestanya nova + Obrir fitxer en una pestanya nova src/app/components/unified-file-card/unified-file-card.component.html 19 @@ -2461,7 +2461,7 @@ Delete and redownload - Suprimeix i torna a descarregar + Eliminar i tornar a descarregar src/app/components/unified-file-card/unified-file-card.component.html 28 @@ -2474,7 +2474,7 @@ Delete forever - Esborra per sempre + Eliminar permanentment src/app/components/unified-file-card/unified-file-card.component.html 31 @@ -2505,13 +2505,605 @@ Length: - Llargada: + Durada: src/app/subscription/subscription-file-card/subscription-file-card.component.html 3 Video duration label + + Transfer DB to + Transferir la BD a + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Provar la cadena de connexió + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + MongoDB Connection String + Cadena de connexió MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Amb aquesta opció activada, si un vídeo coincideix amb alguna categoria, tota la llista de reproducció es classificarà a la mateixa. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database information could not be retrieved. Check the server logs for more information. + No s’ha pogut recuperar la informació de la base de dades. Comprova els registres del servidor per a més detalls. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Randomize order when playing + Reproduir aleatòriament + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Restart server + Reiniciar el servidor + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Example: + Exemple: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Records per table + Registres per taula + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Ubicació de la base de dades: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Permetre la categorització de les llistes de reproducció + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Database + Base de dades + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Share file + Compartir fitxer + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Crop to (seconds) + Escapçar fins a (segons) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Escapçar des de (segons) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Escapçar el fitxer + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Autoplay + Reproducció automàtica + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Substituir els arguments + + src/app/main/main.component.html + 116,117 + + Replace args + + + Both + Tots dos + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Audio only + Només àudio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + You must enable multi-user mode to access this tab. + Cal activar el mode multiusuari per a accedir a aquesta pestanya. + + src/app/settings/settings.component.ts + 48 + + + + Max concurrent downloads + Màxim de descàrregues simultànies + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Download rate limit + Límit de velocitat de descàrrega + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Generate NFO files + Generar fitxers NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Allow autoplay + Permetre la reproducció automàtica + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enables a button to skip ads when viewing supported videos. + Activar el botó per a saltar els anuncis quan es visualitzen vídeos compatibles. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Generates NFO files with every download, primarily used by Kodi. + Generar fitxers NFO amb cada descàrrega, utilitzats principalment per Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Docker tag: + Etiqueta Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Complete + Completat + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear + Netejar + + src/app/components/downloads/downloads.component.ts + 131 + + + + Copy to clipboard + Copiar al porta-retalls + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + Tancar + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + Copiat al porta-retalls! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Title + Títol + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + Subcripció + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Etapa + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Progrés + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Accions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Netejar + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pausa + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Watch content + Veure el contingut + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Mostrar error + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Reiniciar + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Commit hash: + Aplicar hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Creating download + Creant la descàrrega + + src/app/components/downloads/downloads.component.ts + 58 + + + + Build date: + Data de compilació: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Getting info + Obtenint informació + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Descarregant fitxer + + src/app/components/downloads/downloads.component.ts + 60 + + + + Clear finished downloads + Netejar les descàrregues finalitzades + + src/app/components/downloads/downloads.component.ts + 129 + + + + Resume + Reprendre + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause all downloads + Posar en pausa totes les descàrregues + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Clear finished downloads + Eliminar les descàrregues finalitzades + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Afegir a la llista de reproducció + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Saltar anunci + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Download for has been queued! + La descàrrega de s'ha posat a la cua! + + src/app/main/main.component.ts + 469 + + + + File type + Tipus de fitxer + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Només vídeo + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitar la quantitat de descàrregues que es poden fer simultàniament. Utilitzar -1 per a il·limitades. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Rate limits your downloads to the specified amount. Ex: 200K + Establir la velocitat màxima de descàrrega. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Use SponsorBlock API + Utilitzar API de SponsorBlock + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Installation type: + Tipus d'intal·lació: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Error for + Error a + + src/app/components/downloads/downloads.component.ts + 238 + + + + Date + Data + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Resume all downloads + Reprendre totes les descàrregues + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Would you like to clear your finished downloads? + Vols eliminar les descàrregues finalitzades? + + src/app/components/downloads/downloads.component.ts + 130 + + diff --git a/src/assets/i18n/messages.cs.json b/src/assets/i18n/messages.cs.json deleted file mode 100644 index f3a2ab1..0000000 --- a/src/assets/i18n/messages.cs.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "O aplikaci", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Účet", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Tmavý vzhled", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Nastavení", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Domů", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Přihlásit se", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Odběry", - "822fab38216f64e8166d368b59fe756ca39d301b": "Stažené", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Pouze Zvuk", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Stáhnout", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalita", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Použijte URL adresu", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Zobrazit", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Stahovat více zároveň", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Zrušit", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Pokročilé nastavení", - "4e4c721129466be9c3862294dc40241b64045998": "Použít vlastní argumenty", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Vlastní argumenty", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Není třeba vkládat URL adresu, jen to co je za ní. Argumenty se oddělují pomocí dvou čárek za sebou takto: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Použít vlastní výstup", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Vlastní výstup", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentace", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Cesta je relativní ke nakonfigurované cestě pro stahování. Nezahrnujte koncovky souborů.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulovaný příkaz:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Použit autentifikaci", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Uživatelské jméno", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Heslo", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Vytvořit playlist", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Název", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Typ", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audio soubory", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videa", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Odebírat playlist nebo kanál", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL adresa", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL adresa playlistu nebo kanálu", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Vlastní název", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Stáhnout všechny nahrávky", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Nejvyšší kvalita", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Stahovat pouze audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Režim pouze pro streamování", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Toto je přidáno za standartní argumenty.", - "98b6ec9ec138186d663e64770267b67334353d63": "Vlastní výstup souboru", - "d7b35c384aecd25a516200d6921836374613dfe7": "Zrušit odběr", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Odebírat", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Stahovat videa nahraná naposled v", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Typ:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Zavřít", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportovat Archiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Zrušit odběr", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pozastaveno)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archiv:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Název:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Autor:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Velikost souboru:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Cesta:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Datum Nahrání:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategorie:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Upravid youtube-dl argumenty", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Nové simulované argumenty", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Přidat argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Hledat podle kategorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Použít hodnotu argumentu", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Přidat argument", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Upravit", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Hodnota argumentu", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aktualizace", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrovat uživatele", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Uživatelské jméno", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrovat", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Nahrání nových cookies", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "POZNÁMKA: Nahráním nových cookies přepíšete vaše předchozí cookie. Vezměte na vědomí, že cookies jsou společné pro celou instanci, nikoliv rozdělené podle uživatelů.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Přetáhněte sem", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Upravit playlist", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Přidat obsah", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Uložit", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normální řazení", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Opačné řazení", - "d02888c485d3aeab6de628508f4a00312a722894": "Moje videa", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Vyhledávání", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nebyla nalezena žádná videa.", - "3697f8583ea42868aa269489ad366103d94aece7": "Úprava", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pozastaveno", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Úprava kategorie", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Pravidla", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Přidat nové pravidlo", - "792dc6a57f28a1066db283f2e736484f066005fd": "Stáhnout Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Upravit", - "826b25211922a1b46436589233cb6f1a163d89b7": "Odstranit", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informace", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Počet:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Odstranit a zablokovat", - "dad95154dcef3509b8cc705046061fd24994bbb7": "zhlédnutí", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Uložit změny", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Stažení proběhlo úspěšně", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Došlo k chybě", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Podrobnosti", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Došlo k chybě:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Zahájení stahování:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Konec stahování:", - "ad127117f9471612f47d01eae09709da444a36a4": "Cesta k souboru:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Vaše odběry", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanály", - "47546e45bbb476baaaad38244db444c427ddc502": "Playlisty", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Název není dostupný. Probíhá vyhledávání kanálu.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Nemáte žádné odběry.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Název není dostupný. Probíhá vyhledávání playlistu.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Nemáte žádné odběry playlistů.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Obecné", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Stahování", - "d5f69691f9f05711633128b5a3db696783266b58": "Ostatní", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Pokročilé", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Uživatelé", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Záznamy", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Zavřít} false {Zrušit} other {Ostatní}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL adresa této aplikace, bez čísla portu.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Číslo portu", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Momentálně nastavený port. Výchozí je 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Režim více uživatelů", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Cesta pro uživatele", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Základní cesta pro uživatele a jejich stažená videa.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Povolit odběry", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Základní cesta pro odběry", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Základní cesta k videím z odebíraných kanálů a playlistů. Cesta je relativní k hlavní složce YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval kontroly", - "0f56a7449b77630c114615395bbda4cab398efd8": "Hodnota ve vteřinách, použijte pouze číslice.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Někdy jsou nová videa stažena dříve než mohou být plně zpracována. Toto nastavení znamená, že nová videa budou zkontrolována následující den pro zjištění, zda existují verze ve vyšší kvalitě.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Znovu stáhnout čersvé nahrávky", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Vzhled", - "ff7cee38a2259526c519f878e71b964f41db4348": "Výchozí", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Povolit změnu vzhledu", - "fe46ccaae902ce974e2441abe752399288298619": "Jazyk", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Cesta pro složku s audio soubory", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Cesta pro složku se zvukovými soubory. Cesta je relativní k hlavní složce YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Cesta pro složku s video soubory", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Cesta pro složku s video soubory. Cesta je relativní k hlavní složce YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Výchozí výstup souboru", - "1148fd45287ff09955b938756bc302042bcb29c7": "Cesta je relativní k cestám pro stažení výše. Nezahrnujte koncovky souborů.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Globální vlastní argumenty", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Globální vlastní argumenty pro stahování na hlavní stránce. Argumenty se oddělují pomocí dvou čárek za sebou takto: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategorie", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Použít archiv youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Zahrnout náhledový obrázek", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Zahrnout metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Zrušit všechna stahování", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Hlavní název", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Povolit správce souborů", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Povolit správce stahování", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Povolit výběr kvality", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Režim pouze stahování", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Povolit režim více stahování zároveň", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Povolit Veřejné API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Veřejný API Klíč", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Zobrazit dokumentaci", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Tímto odstraníte svůj starý API klíč!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Vygenerovat", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Použít YouTube API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube API Klíč", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Vygenerovat klič je snadné!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Použít Twitch API", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch API Klíč", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Také známý jako ID Klienta.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Automaticky stahovat Twitch Chat", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikněte zde", - "7f09776373995003161235c0c8d02b7f91dbc4df": "pro ruční stažení oficiálního Chrome doplňku YoutubeDL-Material.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Musíte ručně nahrát rozšíření a upravit jeho nastavení tak, aby odkazovalo na URL adresu vaší domény.", - "9a2ec6da48771128384887525bdcac992632c863": "pro instalaci oficiálního doplňku YouTubeDL-Material přímo z obchodu Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Podrobné instrukce k nastavení.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Není toho potřeba mnoho, stačí v nastavení rozšíření změnit odkaz na URL adresu Vaší domény.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Přetáhněte odkaz níže do svých záložek a je to! Poté si najděte na YouTube video, které byste chtěli stáhnout a klikněte na uloženou záložku.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Vygenerovat záložku pro 'pouze zvuk'", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Vybrat službu pro stahování", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Použít výchozího agenta pro stahování", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Vybrat agenta pro stahování", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Úroveň Záznamů", - "db6c192032f4cab809aad35215f0aa4765761897": "Vypršení přihlášení", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Povolit pokročilé nastavení stahování", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Použít Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Nastavit Cookies", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Povolit registraci uživatelů", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentifikační metoda", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interní", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL adresa LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Přihlašovací údaje pro Bind", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Vyhledávací Základna", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Vyhledávací Filtr", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "O YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "je open-source projekt pro stahování z YouTube postavený na specifikaci Material Designu od Google. Můžete pohodlně a bez problémů stahovat Vaše oblíbená videa jako video soubory nebo pouze zvukové soubory a dokonce odebírat Vaše oblíbené kanály a playlisty, aby Vám neunikla ta nejnovější videa.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "má spoustu skvělých funkcí! Rozšířitelné API, podporu Dockeru, překladů a lokalizace. Pro více informací o všech funkcích klikněte na GitHub ikonu výše.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Nainstalovaná verze:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Našli jste chybu nebo máte připomínku?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "pro vytvoření Problému na GitHubu!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Probíhá kontrola aktualizací...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Dostupná aktualizace", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Můžete aktualizovat pomocí menu nastavení.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Vyberte verzi:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Povolit sdílení", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Použít časové razítko", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Vteřin", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Zkopírovat do schránky", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Sdílet playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Sdílet video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Sdílet audio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID Relace:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Vymazat všechna stahování", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(momentální)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Nejsou dostupná žádná stahování!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Váš Profil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Odhlásit se", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Vytvořeno:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Nejste přihlášen.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Vytvořit administrátorský účet", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Nebyl zjištěn žádný administrátorský účet. Tímto se vytvoří administrátorský účet 'admin' a bude mu vytvořeno heslo.", - "70a67e04629f6d412db0a12d51820b480788d795": "Vytvořit", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Přidat Uživatele", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Upravit Roli", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Uživatelské jméno", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Role", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Akce", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Spravovat uživatele", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Odstranit uživatele", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Upravit uživatele", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID Uživatele:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nové heslo", - "6498fa1b8f563988f769654a75411bb8060134b9": "Nastavit nové heslo", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Použít výchozí nastavení role", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ano", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Ne", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Spravovat roli", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Řádky:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Vyčistit záznamy", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Vytvořeno automaticky", - "ccf5ea825526ac490974336cb5c24352886abc07": "Otevřít soubor", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Otevřít soubor na nové kartě", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Jít do odběrů", - "94e01842dcee90531caa52e4147f70679bac87fe": "Odstranit a stáhnout znovu", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Odstranit navždy", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Zobrazit více.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Zobrazit méně.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Délka:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.de.json b/src/assets/i18n/messages.de.json deleted file mode 100644 index fa321dd..0000000 --- a/src/assets/i18n/messages.de.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Wiedergabeliste erstellen", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Name", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audiodateien", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videos", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Youtube-dl Argumente ändern", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulierte neue Argumente", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Argument hinzufügen", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Nach Kategorie filtern", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Argument-Wert verwenden", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-Wert", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Argument hinzufügen", - "d7b35c384aecd25a516200d6921836374613dfe7": "Abbrechen", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Ändern", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "YouTube Downloader", - "6d2ec8898344c8955542b0542c942038ef28bb80": "Bitte geben Sie eine gültige URL ein.", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualität", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL verwenden", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Ansehen", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Nur Audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-Herunteraden-Modus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Herunterladen", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Abbrechen", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Erweitert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulierter Befehl:", - "4e4c721129466be9c3862294dc40241b64045998": "Benutzerdefinierte Argumente verwenden", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Benutzerdefinierte Argumente", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Die URL muss nicht angegeben werden, sondern nur der Teil danach. Argumente werden mit zwei Kommata getrennt: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Benutzerdefinierte Ausgabe verwenden", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Benutzerdefinierte Ausgabe", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentation", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Der Pfad ist relativ zum Konfigurations-Download-Pfad. Dateiendung auslassen.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Authentifizierung verwenden", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Benutzername", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passwort", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Ihre Audiodateien befinden sich hier", - "47546e45bbb476baaaad38244db444c427ddc502": "Wiedergabelisten", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "Keine Wiedergabelisten verfügbar. Erstellen Sie eine aus Ihren heruntergeladenen Audiodateien, indem Sie auf das blaue Pluszeichen klicken.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Video", - "960582a8b9d7942716866ecfb7718309728f2916": "Ihre Videodateien befinden sich hier", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "Keine Playlisten verfügbar. Erstellen Sie eine aus heruntergeladenen Audiodateien, indem Sie auf das blaue Pluszeichen klicken.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Name:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Kanal:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Dateigröße:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Pfad:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Hochgeladen am:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Schließen", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Anzahl:", - "321e4419a943044e674beb55b8039f42a9761ca5": "Infos", - "826b25211922a1b46436589233cb6f1a163d89b7": "Löschen", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Löschen und zur schwarzen Liste hinzufügen", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Einstellungen", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL, über die auf diese Applikation zugegriffen wird, ohne Port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Der gewünschte Port. Standard ist 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-User Modus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Benutzer Basispfad", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basispfad für Benutzer und deren heruntergeladene Videos.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Verschlüsselung verwenden", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Dateipfad zum Zertifikat", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Dateipfad zum Zertifikatsschlüssel", - "4e3120311801c4acd18de7146add2ee4a4417773": "Abonnements erlauben", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements Basispfad", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basispfad für Videos von abonnierten Kanälen und Wiedergabelisten. Dieser ist relativ zum Stammordner von YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Prüfintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "Einheit ist Sekunden, nur Zahlen sind erlaubt.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Youtube-DL Archiv verwenden", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Mit der Archivfunktion", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "werden Informationen über Videos, welche durch ein Abonnement heruntergeladen wurden, in einem Textdokument festgehalten. Diese befinden sich in dem Archiv Unterverzeichnis vom Abonnementsordner.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Dadurch können Videos permanent gelöscht werden, ohne das Abonnement beenden zu müssen. Außerdem kann dadurch aufgezeichnet werden, welche Videos heruntergeladen wurden. Z. B. im Falle eines Datenverlusts.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Design", - "ff7cee38a2259526c519f878e71b964f41db4348": "Standard", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Dunkel", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Designänderung erlauben", - "fe46ccaae902ce974e2441abe752399288298619": "Sprache", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Allgemein", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Audio Basispfad", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Dateipfad für Audio-Downloads. Dieser ist relativ zum Stammordner von YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Video Basispfad", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Dateipfad für Video-Downloads. Dieser ist relativ zum Stammordner von YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Globale benutzerdefinierte Argumente für Downloads auf der Startseite. Argumente werden durch zwei Kommata voneinander getrennt: ,,", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Herunterlader", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Titel der Kopfzeile", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Dateimanager aktivieren", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Download-Manager aktivieren", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Qualitätsauswahl erlauben", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Nur-Herunterladen-Modus", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Multi-Herunterladen-Modus erlauben", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Einstellungen durch PIN schützen", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Neuen PIN festlegen", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Öffentliche API aktivieren", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Öffentlicher API-Schlüssel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Dokumentation ansehen", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generieren", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "YouTube API verwenden", - "ce10d31febb3d9d60c160750570310f303a22c22": "Youtube API-Schlüssel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Schlüsselgeneration ist einfach!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Hier klicken", - "7f09776373995003161235c0c8d02b7f91dbc4df": "um die offizielle YoutubeDL-Material Chrome-Erweiterung manuell herunterzuladen.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Die Erweiterung muss manuell installiert werden und in den Einstellungen der Erweiterung muss die Frontend-URL eingetragen werden.", - "9a2ec6da48771128384887525bdcac992632c863": "um die offizielle YoutubeDL-Material Firefox-Erweiterung direkt aus dem Firefox-Addon-Store zu installieren.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaillierte Anleitung.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Die Frontend-URL muss in den Einstellungen der Erweiterung eingetragen werden.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Der untenstehende Link muss nur in die Lesezeichenleiste gezogen werden. Auf einer unterstützten Webseite können Sie danach einfach auf das Lesezeichen klicken, um das Video herunterzuladen.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "'Nur Audio' Lesezeichen generieren", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Standard Download-Agent verwenden", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Downloader auswählen", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Erweiterte Download-Optionen aktivieren", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Erweitert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Benutzerregistrierung zulassen", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Benutzer", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Speichern", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Schließen} false {Abbrechen} other {Andere}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Über YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "ist ein quelloffener YouTube-Downloader, der nach den Material-Design-Richtlinien von Google erstellt wurde. Sie können Ihre Lieblingsvideos reibungslos als Video- oder Audiodateien herunterladen und sogar Ihre Lieblingskanäle und Wiedergabelisten abonnieren, um auf dem Laufenden zu bleiben.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "beinhaltet viele tolle Funktionen! API, Docker und Lokalisierung werden unter anderem unterstützt. Informieren Sie sich über alle unterstützten Funktionen auf Github.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installierte Version:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Suche nach Aktualisierungen …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Aktualisierung verfügbar", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Sie können über das Einstellungsmenü aktualisieren.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Haben Sie einen Fehler gefunden oder einen Vorschlag?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "um ein Ticket zu öffnen!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Ihr Profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Erstellt:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Sie sind nicht angemeldet.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Anmelden", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Abmelden", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Admin-Konto erstellen", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Es wurde kein Standard-Administratorkonto erkannt. Ein Administratorkonto mit dem Benutzernamen \"admin\" wird erstellt und ein Passwort wird festgelegt.", - "70a67e04629f6d412db0a12d51820b480788d795": "Erstellen", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Über", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Startseite", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnements", - "822fab38216f64e8166d368b59fe756ca39d301b": "Heruntergeladene", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Wiedergabeliste teilen", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Video teilen", - "1d540dcd271b316545d070f9d182c372d923aadd": "Audio teilen", - "1f6d14a780a37a97899dc611881e6bc971268285": "Freigabe aktivieren", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Zeitstempel verwenden", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunden", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "In die Zwischenablage kopieren", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Änderungen speichern", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Details", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Ein Fehler ist aufgetreten:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Start des Herunterladen:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Ende des Herunterladen:", - "ad127117f9471612f47d01eae09709da444a36a4": "Dateipfad(e):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonnieren Sie eine Wiedergabeliste oder einen Kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL der Wiedergabeliste oder des Kanales", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Benutzerdefinierter Name", - "f3f62aa84d59f3a8b900cc9a7eec3ef279a7b4e7": "Dies ist optional", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Alle hochgeladene Videos herunterladen", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Videos herunterladen aus den letzten", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Nur-Streaming-Modus", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonnieren", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Typ:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Archiv exportieren", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Deabonnieren", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Ihre Abonnements", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanäle", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Name nicht verfügbar. Kanal wird abgerufen...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Sie haben keine Kanäle abonniert.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Name nicht verfügbar. Wiedergabeliste wird abgerufen.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Sie haben keine Wiedergabeliste abonniert.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Suchen", - "2054791b822475aeaea95c0119113de3200f5e1c": "Länge:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Löschen und erneut herunterladen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Permanent löschen", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aktualisierungsprogramm", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Wählen Sie eine Version:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrieren", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Sitzungs-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(aktuell)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Zurzeit sind keine Downloads verfügbar!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Nutzer registrieren", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Benutzername", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Benutzer verwalten", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Benutzer-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Neues Passwort", - "6498fa1b8f563988f769654a75411bb8060134b9": "Neues Passwort festlegen", - "40da072004086c9ec00d125165da91eaade7f541": "Standard verwenden", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nein", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Rolle verwalten", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Benutzername", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Aktionen", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Benutzer hinzufügen", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rolle bearbeiten", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Zeilen:", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "Logs erscheinen hier", - "98b6ec9ec138186d663e64770267b67334353d63": "Benutzerdefinierte Dateiausgabe", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Diese werden nach den Standardargumenten hinzugefügt.", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Nur-Audio-Modus", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Protokolle", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Cookies setzen", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Cookies verwenden", - "d01715b75228878a773ae6d059acc639d4898a03": "Safe download aufheben", - "85e0725c870b28458fd3bbba905397d890f00a69": "Beachte: Neu hochgeladene Cookies überschreiben die vorherigen. Cookies sind global und gelten nicht auf einer Pro-Benutzer-Basis.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Ziehen-und-Ablegen", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Neue Cookies hochladen", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Bearbeiten", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Wiedergabeliste bearbeiten", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Suchfilter", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "db6c192032f4cab809aad35215f0aa4765761897": "Ablauf der Anmeldung", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Protokollebene", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dadurch wird Ihr alter API-Schlüssel gelöscht!", - "fb35145bfb84521e21b6385363d59221f436a573": "Alle Herunterladen-Ereignisse abbrechen", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Metadaten einschließen", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Miniaturansicht einschließen", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "HINWEIS: Durch das Hochladen neuer Cookies werden Ihre vorherigen Cookies überschrieben. Beachten Sie auch, dass Cookies instanzweit und nicht pro Benutzer sind.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Weitere Inhalte hinzufügen", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Typ", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "d02888c485d3aeab6de628508f4a00312a722894": "Meine Videos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Zu den Abonnements gehen", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Datei in einer neuen Registerkarte öffnen", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Herunterladen-Liste leeren", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Rollenstandard verwenden", - "ccf5ea825526ac490974336cb5c24352886abc07": "Datei öffnen", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Protokolldatei löschen", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Benutzer löschen", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Benutzer bearbeiten", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Authentifizierungsmethode", - "3697f8583ea42868aa269489ad366103d94aece7": "Bearbeiten", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Ein Fehler ist aufgetreten", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Der Download war erfolgreich", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Twitch-Chat automatisch herunterladen", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Wird auch als Client-ID bezeichnet.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch-API-Schlüssel", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Twitch-API verwenden", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategorien", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Neue Uploads erneut herunterladen", - "792dc6a57f28a1066db283f2e736484f066005fd": "Twitch-Chat herunterladen", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Neue Regel hinzufügen", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regeln", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Kategorie bearbeiten", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausiert", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Keine Videos gefunden.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Umgekehrte Reihenfolge", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normale Reihenfolge", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Inhalt hinzufügen", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategorie:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausiert)", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Weniger sehen.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Mehr sehen.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Automatisch generiert", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Wähle einen Download-Agenten", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Globale benutzerdefinierte Argumente", - "1148fd45287ff09955b938756bc302042bcb29c7": "Der Pfad ist relativ zu den darüberliegenden Downloadpfaden. Erweiterung auslassen.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Standard-Dateiausgabe", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Manchmal werden neue Videos heruntergeladen bevor diese von der Videoplattform vollständig verarbeitet wurden. Diese Einstellung bewirkt, dass am Folgetag neue Videos auf eine höhere Auflösung überprüft werden.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "Aufrufe", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Maximale Qualität" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.de.xlf b/src/assets/i18n/messages.de.xlf index 70672a7..a008658 100644 --- a/src/assets/i18n/messages.de.xlf +++ b/src/assets/i18n/messages.de.xlf @@ -1,4 +1,4 @@ - + @@ -2140,7 +2140,7 @@ Go to subscription - Zu den Abonnements gehen + Zu den Abonnements app/components/unified-file-card/unified-file-card.component.html 20 @@ -2149,7 +2149,7 @@ Open file in new tab - Datei in einer neuen Registerkarte öffnen + Datei in neuem Tab öffnen app/components/unified-file-card/unified-file-card.component.html 14 @@ -2248,7 +2248,7 @@ Search Base - Search Base + Suchbasis app/settings/settings.component.html 333 @@ -2554,6 +2554,598 @@ Max quality placeholder + + Share file + Datei teilen + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Server neu starten + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Datenbankinformationen konnten nicht abgerufen werden. Sehe in den Server-Logs nach, um mehr Informationen zu erhalten. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transferiere Datenbank zu + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Verbindungstest-String + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Beispiel: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB Verbindungs-String + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Einträge pro Tabelle + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Datenbankstandort: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Erlaube Playlist-Kategorisierung + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Sofern diese Einstellung eingeschaltet ist, wird die gesamte Playlist einer Kategorie zugeordnet, sobald ein einzelnes Video mit der Kategorie übereinstimmt. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Datenbank + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Reihenfolge beim Abspielen randomisieren + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Zuschneiden bis (Sekunden) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Zuschneiden ab (Sekunden) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Datei zuschneiden + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Audio only + Nur Audio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Download for has been queued! + Download für in Warteschlange eingereiht! + + src/app/main/main.component.ts + 469 + + + + Autoplay + Automatisches abspielen + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Argumente ersetzen + + src/app/main/main.component.html + 116,117 + + Replace args + + + File type + Dateityp + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + Beide + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + Nur Video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + You must enable multi-user mode to access this tab. + Für den Zugriff auf diesen Reiter "Multi-User" Modus aktivieren. + + src/app/settings/settings.component.ts + 48 + + + + Max concurrent downloads + Maximale gleichzeitige Downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitiert die Anzahl simultaner Downloads. Nutze -1 für kein Limit. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + Downloadrate Limit + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + Legt die maximale Downloadrate fest. Z.B. 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Allow autoplay + Automatisches Abspielen erlauben + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Installation type: + Installationsart: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Title + Titel + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Complete + Vollständig + + src/app/components/downloads/downloads.component.ts + 61 + + + + Restart + Neustart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + Alle Downloads pausieren + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Close + Schließen + + src/app/components/downloads/downloads.component.ts + 241 + + + + Resume + Fortfahren + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + Inhalt ansehen + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Fehler anzeigen + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Enables a button to skip ads when viewing supported videos. + Fügt einen Knopf zum Überspringen von Werbung bei unterstützten Videos hinzu. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + SponsorBlock API benutzen + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + Erzeugt bei jedem Download NFO-Dateien, die hauptsächlich von Kodi verwendet werden. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + NFO-Dateien generieren + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Commit hash: + Commit-Hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Docker tag: + Docker-Tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Creating download + Erstelle Downloads + + src/app/components/downloads/downloads.component.ts + 58 + + + + Build date: + Builddatum: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Clear finished downloads + Fertige Downloads löschen + + src/app/components/downloads/downloads.component.ts + 129 + + + + Clear + Löschen + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Fehler für + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + In Zwischenablage kopieren + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + In Zwischenablage kopiert! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Datum + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Stufe + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Fortschritt + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Aktionen + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Leeren + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume all downloads + Alle Downloads fortsetzn + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Fertige Downloads löschen + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Getting info + Hole Infos + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Lade Datei herunter + + src/app/components/downloads/downloads.component.ts + 60 + + + + Would you like to clear your finished downloads? + Möchten Sie Ihre fertigen Downloads löschen? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Add to playlist + Zu Wiedergabeliste hinzufügen + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Werbung überspringen + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index 99e0f16..bab8d85 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -1,6 +1,6 @@ - - - + + + About @@ -26,22 +26,10 @@ src/app/settings/settings.component.html - 75 + 67 Dark mode toggle label - - Settings - - src/app/app.component.html - 28 - - - src/app/settings/settings.component.html - 1 - - Settings menu label - Home @@ -58,7 +46,7 @@ src/app/components/login/login.component.html - 15 + 34 src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html @@ -82,6 +70,25 @@ Navigation menu Downloads Page title + + Settings + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + + src/app/main/main.component.ts + 469 + + Only Audio @@ -122,13 +129,13 @@ YT search View button for searched video - - Multi-download Mode + + Autoplay src/app/main/main.component.html 70,71 - Multi-download Mode checkbox + Autoplay checkbox Cancel @@ -154,11 +161,19 @@ Use custom args checkbox + + Replace args + + src/app/main/main.component.html + 116,117 + + Replace args + Custom args src/app/main/main.component.html - 115 + 120 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -174,7 +189,7 @@ No need to include URL, just everything after. Args are delimited using two commas like so: ,, src/app/main/main.component.html - 118,119 + 123,124 Custom Args input hint @@ -182,7 +197,7 @@ Use custom output src/app/main/main.component.html - 126,127 + 131,132 Use custom output checkbox @@ -190,7 +205,7 @@ Custom output src/app/main/main.component.html - 130 + 135 Custom output placeholder @@ -198,7 +213,7 @@ Documentation src/app/main/main.component.html - 132 + 137 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -214,15 +229,15 @@ src/app/settings/settings.component.html - 125 + 117 Youtube-dl output template documentation link - Path is relative to the config download path. Don't include extension. + Path is relative to the config download path. Don't include extension. src/app/main/main.component.html - 133 + 138 src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html @@ -242,26 +257,10 @@ Crop file src/app/main/main.component.html - 155,156 + 160,161 Crop video checkbox - - Crop from (seconds) - - src/app/main/main.component.html - 159 - - Crop from placeholder - - - Crop to (seconds) - - src/app/main/main.component.html - 164 - - Crop to placeholder - Simulated command: @@ -274,7 +273,7 @@ Use authentication src/app/main/main.component.html - 140,141 + 145,146 Use authentication checkbox @@ -282,7 +281,7 @@ Username src/app/main/main.component.html - 144 + 149 YT Username placeholder @@ -290,7 +289,7 @@ Password src/app/main/main.component.html - 149 + 154 src/app/dialogs/add-user-dialog/add-user-dialog.component.html @@ -302,6 +301,22 @@ YT Password placeholder + + Crop from (seconds) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + + src/app/main/main.component.html + 169 + + Crop to placeholder + Create a playlist @@ -386,7 +401,7 @@ src/app/settings/settings.component.html - 18 + 10 Subscription URL input placeholder @@ -492,6 +507,10 @@ src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html 84 + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html 66 @@ -500,6 +519,18 @@ src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html 54 + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + src/app/components/modify-users/modify-users.component.html 61 @@ -586,7 +617,7 @@ src/app/dialogs/about-dialog/about-dialog.component.html - 59 + 70 src/app/dialogs/share-media-dialog/share-media-dialog.component.html @@ -638,7 +669,7 @@ src/app/subscriptions/subscriptions.component.html - 31 + 34 src/app/subscription/subscription/subscription.component.html @@ -802,7 +833,7 @@ src/app/components/login/login.component.html - 35 + 38 Register user button @@ -854,7 +885,7 @@ src/app/settings/settings.component.html - 464 + 487 src/app/components/modify-users/modify-users.component.html @@ -918,6 +949,38 @@ Files search placeholder + + File type + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + No videos found. @@ -982,7 +1045,7 @@ src/app/components/unified-file-card/unified-file-card.component.html - 37 + 43 Playlist edit button @@ -998,11 +1061,11 @@ src/app/components/unified-file-card/unified-file-card.component.html - 33 + 39 src/app/components/unified-file-card/unified-file-card.component.html - 39 + 45 Delete playlist @@ -1038,7 +1101,7 @@ src/app/components/unified-file-card/unified-file-card.component.html - 34 + 40 Delete and blacklist video button @@ -1046,7 +1109,7 @@ views src/app/player/player.component.html - 15 + 16 View count label @@ -1134,7 +1197,7 @@ Playlists src/app/subscriptions/subscriptions.component.html - 27 + 30 Subscriptions playlists title @@ -1150,7 +1213,7 @@ You have no channel subscriptions. src/app/subscriptions/subscriptions.component.html - 24 + 27 No channel subscriptions text @@ -1158,7 +1221,7 @@ Name not available. Playlist retrieval in progress. src/app/subscriptions/subscriptions.component.html - 33 + 36 Subscription playlist not available text @@ -1166,15 +1229,22 @@ You have no playlist subscriptions. src/app/subscriptions/subscriptions.component.html - 43 + 46 No playlist subscriptions text + + You must enable multi-user mode to access this tab. + + src/app/settings/settings.component.ts + 48 + + Main src/app/settings/settings.component.html - 12 + 4 Main settings label @@ -1182,7 +1252,7 @@ Downloader src/app/settings/settings.component.html - 102 + 94 Downloader settings label @@ -1190,7 +1260,7 @@ Extra src/app/settings/settings.component.html - 185 + 198 Extra settings label @@ -1198,7 +1268,7 @@ Database src/app/settings/settings.component.html - 284 + 303 Database settings label @@ -1206,47 +1276,27 @@ Advanced src/app/settings/settings.component.html - 320 + 339 Host settings label - - Users - - src/app/settings/settings.component.html - 403 - - - src/app/settings/settings.component.html - 403 - - Users settings label - Logs src/app/settings/settings.component.html - 451 + 476 src/app/settings/settings.component.html - 451 + 476 Logs settings label - - {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} - - src/app/settings/settings.component.html - 467 - - Settings cancel and close button - URL this app will be accessed from, without the port. src/app/settings/settings.component.html - 19 + 11 URL setting input hint @@ -1254,7 +1304,7 @@ Port src/app/settings/settings.component.html - 24 + 16 Port input placeholder @@ -1262,7 +1312,7 @@ The desired port. Default is 17442. src/app/settings/settings.component.html - 25 + 17 Port setting input hint @@ -1270,7 +1320,7 @@ Multi-user mode src/app/settings/settings.component.html - 34 + 26 Multi user mode setting @@ -1278,7 +1328,7 @@ Users base path src/app/settings/settings.component.html - 38 + 30 Users base path placeholder @@ -1286,7 +1336,7 @@ Base path for users and their downloaded videos. src/app/settings/settings.component.html - 39 + 31 Users base path hint @@ -1294,23 +1344,24 @@ Allow subscriptions src/app/settings/settings.component.html - 48 + 40 Allow subscriptions setting - Subscriptions base path + Base bath for subscriptions + Base bath for subscriptions src/app/settings/settings.component.html - 52 + 44 Subscriptions base path input setting placeholder - Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 53 + 45 Subscriptions base path setting input hint @@ -1318,7 +1369,7 @@ Check interval src/app/settings/settings.component.html - 58 + 50 Check interval input setting placeholder @@ -1326,7 +1377,7 @@ Unit is seconds, only include numbers. src/app/settings/settings.component.html - 59 + 51 Check interval setting input hint @@ -1334,7 +1385,7 @@ Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. src/app/settings/settings.component.html - 63 + 55 Redownload fresh uploads tooltip @@ -1342,7 +1393,7 @@ Redownload fresh uploads src/app/settings/settings.component.html - 63 + 55 Redownload fresh uploads @@ -1350,7 +1401,7 @@ Theme src/app/settings/settings.component.html - 72 + 64 Theme select label @@ -1358,7 +1409,7 @@ Default src/app/settings/settings.component.html - 74 + 66 Default theme label @@ -1366,7 +1417,7 @@ Allow theme change src/app/settings/settings.component.html - 80 + 72 Allow theme change setting @@ -1374,7 +1425,7 @@ Language src/app/settings/settings.component.html - 89 + 81 Language select label @@ -1382,15 +1433,15 @@ Audio folder path src/app/settings/settings.component.html - 109 + 101 Audio folder path input placeholder - Path for audio only downloads. It is relative to YTDL-Material's root folder. + Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 110 + 102 Aduio path setting input hint @@ -1398,15 +1449,15 @@ Video folder path src/app/settings/settings.component.html - 116 + 108 Video folder path input placeholder - Path for video downloads. It is relative to YTDL-Material's root folder. + Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 117 + 109 Video path setting input hint @@ -1414,15 +1465,15 @@ Default file output src/app/settings/settings.component.html - 123 + 115 Default file output placeholder - Path is relative to the above download paths. Don't include extension. + Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html - 126 + 118 Custom Output input hint @@ -1430,15 +1481,15 @@ Global custom args src/app/settings/settings.component.html - 133 + 125 Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, src/app/settings/settings.component.html - 134 + 126 Custom args setting input hint @@ -1446,7 +1497,7 @@ Categories src/app/settings/settings.component.html - 144 + 136 Categories @@ -1454,7 +1505,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. src/app/settings/settings.component.html - 158 + 150 Allow playlist categorization setting tooltip @@ -1462,7 +1513,7 @@ Allow playlist categorization src/app/settings/settings.component.html - 158 + 150 Allow playlist categorization setting label @@ -1470,7 +1521,7 @@ Use youtube-dl archive src/app/settings/settings.component.html - 166 + 158 Use youtubedl archive setting @@ -1478,7 +1529,7 @@ Include thumbnail src/app/settings/settings.component.html - 170 + 162 Include thumbnail setting @@ -1486,15 +1537,47 @@ Include metadata src/app/settings/settings.component.html - 174 + 166 Include metadata setting + + Max concurrent downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + Kill all downloads src/app/settings/settings.component.html - 178 + 191 Kill all downloads button @@ -1502,7 +1585,7 @@ Top title src/app/settings/settings.component.html - 191 + 204 Top title input placeholder @@ -1510,7 +1593,7 @@ File manager enabled src/app/settings/settings.component.html - 196 + 209 File manager enabled setting @@ -1518,7 +1601,7 @@ Downloads manager enabled src/app/settings/settings.component.html - 199 + 212 Downloads manager enabled setting @@ -1526,7 +1609,7 @@ Allow quality select src/app/settings/settings.component.html - 202 + 215 Allow quality seelct setting @@ -1534,23 +1617,23 @@ Download only mode src/app/settings/settings.component.html - 205 + 218 Download only mode setting - - Allow multi-download mode + + Allow autoplay src/app/settings/settings.component.html - 208 + 221 - Allow multi-download mode setting + Allow autoplay setting Enable Public API src/app/settings/settings.component.html - 216 + 229 Enable Public API key setting @@ -1558,7 +1641,7 @@ Public API Key src/app/settings/settings.component.html - 221 + 234 Public API Key setting placeholder @@ -1566,7 +1649,7 @@ View documentation src/app/settings/settings.component.html - 222 + 235 View API docs setting hint @@ -1574,7 +1657,7 @@ This will delete your old API key! src/app/settings/settings.component.html - 226 + 239 delete api key tooltip @@ -1582,7 +1665,7 @@ Generate src/app/settings/settings.component.html - 226 + 239 Generate key button @@ -1590,7 +1673,7 @@ Use YouTube API src/app/settings/settings.component.html - 235 + 248 Use YouTube API setting @@ -1598,7 +1681,7 @@ Youtube API Key src/app/settings/settings.component.html - 239 + 252 Youtube API Key setting placeholder @@ -1606,11 +1689,11 @@ Generating a key is easy! src/app/settings/settings.component.html - 240 + 253 src/app/settings/settings.component.html - 252 + 265 Youtube API Key setting hint @@ -1618,7 +1701,7 @@ Use Twitch API src/app/settings/settings.component.html - 244 + 257 Use Twitch API setting @@ -1626,7 +1709,7 @@ Twitch API Key src/app/settings/settings.component.html - 251 + 264 Twitch API Key setting placeholder @@ -1634,15 +1717,47 @@ Also known as a Client ID. src/app/settings/settings.component.html - 252 + 265 Twitch API Key setting hint AKA preamble + + Enables a button to skip ads when viewing supported videos. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + Auto-download Twitch Chat src/app/settings/settings.component.html - 247 + 260 Auto download Twitch Chat setting @@ -1650,15 +1765,15 @@ Click here src/app/settings/settings.component.html - 262 + 281 src/app/settings/settings.component.html - 268 + 287 src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 Chrome ext click here @@ -1666,15 +1781,15 @@ to download the official YoutubeDL-Material Chrome extension manually. src/app/settings/settings.component.html - 262 + 281 Chrome click here suffix - You must manually load the extension and modify the extension's settings to set the frontend URL. + You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 263 + 282 Chrome setup suffix @@ -1682,7 +1797,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. src/app/settings/settings.component.html - 268 + 287 Firefox click here suffix @@ -1690,31 +1805,31 @@ Detailed setup instructions. src/app/settings/settings.component.html - 269 + 288 Firefox setup prefix link - Not much is required other than changing the extension's settings to set the frontend URL. + Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 269 + 288 Firefox setup suffix - Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html - 274 + 293 Bookmarklet instructions - Generate 'audio only' bookmarklet + Generate 'audio only' bookmarklet src/app/settings/settings.component.html - 275 + 294 Generate audio only bookmarklet checkbox @@ -1722,7 +1837,7 @@ Database location: src/app/settings/settings.component.html - 290 + 309 Database location label @@ -1730,7 +1845,7 @@ Records per table src/app/settings/settings.component.html - 291 + 310 Records per table label @@ -1738,7 +1853,7 @@ MongoDB Connection String src/app/settings/settings.component.html - 299 + 318 MongoDB Connection String @@ -1746,7 +1861,7 @@ Example: src/app/settings/settings.component.html - 300 + 319 MongoDB Connection String setting hint AKA preamble @@ -1754,7 +1869,7 @@ Test connection string src/app/settings/settings.component.html - 304 + 323 Test connection string button @@ -1762,7 +1877,7 @@ Transfer DB to src/app/settings/settings.component.html - 308 + 327 Transfer DB button @@ -1770,7 +1885,7 @@ Database information could not be retrieved. Check the server logs for more information. src/app/settings/settings.component.html - 312 + 331 Database info not retrieved error message @@ -1778,7 +1893,7 @@ Select a downloader src/app/settings/settings.component.html - 326 + 345 Default downloader select label @@ -1786,7 +1901,7 @@ Use default downloading agent src/app/settings/settings.component.html - 335 + 354 Use default downloading agent setting @@ -1794,7 +1909,7 @@ Select a download agent src/app/settings/settings.component.html - 339 + 358 Custom downloader select label @@ -1802,7 +1917,7 @@ Log Level src/app/settings/settings.component.html - 353 + 372 Log Level label @@ -1810,7 +1925,7 @@ Login expiration src/app/settings/settings.component.html - 365 + 384 Login expiration select label @@ -1818,7 +1933,7 @@ Allow advanced download src/app/settings/settings.component.html - 376 + 395 Allow advanced downloading setting @@ -1826,7 +1941,7 @@ Use Cookies src/app/settings/settings.component.html - 384 + 403 Use cookies setting @@ -1834,7 +1949,7 @@ Set Cookies src/app/settings/settings.component.html - 385 + 404 Set cookies button @@ -1842,15 +1957,23 @@ Restart server src/app/settings/settings.component.html - 397 + 416 Restart server button + + Users + + src/app/settings/settings.component.html + 425 + + Users settings label + Allow user registration src/app/settings/settings.component.html - 407 + 431 Allow registration setting @@ -1858,7 +1981,7 @@ Auth method src/app/settings/settings.component.html - 411 + 435 Auth method select @@ -1866,7 +1989,7 @@ Internal src/app/settings/settings.component.html - 413 + 437 Internal auth method @@ -1874,7 +1997,7 @@ LDAP src/app/settings/settings.component.html - 416 + 440 LDAP auth method @@ -1882,7 +2005,7 @@ LDAP URL src/app/settings/settings.component.html - 423 + 447 LDAP URL @@ -1890,7 +2013,7 @@ Bind DN src/app/settings/settings.component.html - 428 + 452 Bind DN @@ -1898,7 +2021,7 @@ Bind Credentials src/app/settings/settings.component.html - 433 + 457 Bind Credentials @@ -1906,7 +2029,7 @@ Search Base src/app/settings/settings.component.html - 438 + 462 Search Base @@ -1914,7 +2037,7 @@ Search Filter src/app/settings/settings.component.html - 443 + 467 Search Filter @@ -1927,7 +2050,7 @@ About dialog title - is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. src/app/dialogs/about-dialog/about-dialog.component.html 12 @@ -1950,11 +2073,35 @@ Version label + + Installation type: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + Found a bug or have a suggestion? src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 About bug prefix @@ -1962,7 +2109,7 @@ to create an issue! src/app/dialogs/about-dialog/about-dialog.component.html - 25 + 36 About bug suffix @@ -1990,6 +2137,14 @@ Update through settings menu hint + + Docker tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + Select a version: @@ -2046,35 +2201,228 @@ Share video dialog title - - Session ID: + + Creating download - src/app/components/downloads/downloads.component.html - 5 + src/app/components/downloads/downloads.component.ts + 58 - Session ID - - Clear all downloads + + Getting info - src/app/components/downloads/downloads.component.html - 18 + src/app/components/downloads/downloads.component.ts + 59 - clear all downloads action button - - (current) + + Downloading file + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date src/app/components/downloads/downloads.component.html - 6 + 7 - Current session + Date + + + Title + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads No downloads available! src/app/components/downloads/downloads.component.html - 25 + 90 No downloads label @@ -2127,7 +2475,7 @@ Create admin account dialog title - No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html 5 @@ -2322,11 +2670,19 @@ Go to subscription menu item + + Add to playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + Delete and redownload src/app/components/unified-file-card/unified-file-card.component.html - 28 + 34 src/app/subscription/subscription-file-card/subscription-file-card.component.html @@ -2338,7 +2694,7 @@ Delete forever src/app/components/unified-file-card/unified-file-card.component.html - 31 + 37 src/app/subscription/subscription-file-card/subscription-file-card.component.html @@ -2362,6 +2718,14 @@ See less + + Skip ad + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + Length: diff --git a/src/assets/i18n/messages.es.json b/src/assets/i18n/messages.es.json deleted file mode 100644 index c7e3277..0000000 --- a/src/assets/i18n/messages.es.json +++ /dev/null @@ -1,271 +0,0 @@ -{ - "ccc7e92cbdd35e901acf9ad80941abee07bd8f60": "No es necesario incluir URL, solo todo después ", - "f41145afc02fd47ef0576ac79acd2c47ebbf4901": "Argumentos personalizados globales para descargas en la página de inicio.", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una lista de reproducción", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nombre", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Archivos de sonido", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Archivos de video", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modificar args de youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Args nuevos simulados", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Añadir un arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Busqueda por categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usar valor de arg", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor de arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Añadir arg", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancelar", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modificar", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Descargador de Youtube", - "6d2ec8898344c8955542b0542c942038ef28bb80": "Por favor entre una URL válida", - "a38ae1082fec79ba1f379978337385a539a28e73": " Calidad ", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Usa URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": " Ver ", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Solo audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Descarga múltiple", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Descarga", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancelar", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avanzado", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Commando simulado:", - "4e4c721129466be9c3862294dc40241b64045998": "Usar argumentos personalizados", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Argumentos personalizados", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "No es necesario incluir URL, solo todo después. Los argumentos se delimitan usando dos comas así: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usar salida personalizada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Salida personalizada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentación", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "La ruta es relativa a la ruta de descarga de la config. No incluya el extensión.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Usa autenticación", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nombre de usuario", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Contraseña", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Tus archivos de audio están aquí", - "47546e45bbb476baaaad38244db444c427ddc502": "Listas de reproducción", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "No hay listas de reproducción disponibles. Cree uno de tus archivos de audio haciendo clic en el botón azul más.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Vídeo", - "960582a8b9d7942716866ecfb7718309728f2916": "Tus archivos de video son aquí", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "No hay listas de reproducción disponibles. Cree uno de tus archivos de video haciendo clic en el botón azul más.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nombre:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Cargador:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Tamaño del archivo:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Ruta:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Subido:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Cerca", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Cuenta:", - "321e4419a943044e674beb55b8039f42a9761ca5": "Información", - "826b25211922a1b46436589233cb6f1a163d89b7": "Eliminar", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Eliminar y pones en la lista negra", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Configuraciones", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL desde la que se accederá a esta aplicación, sin el puerto.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Puerto", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Puerto deseado. El valor predeterminado es 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modo multiusuario", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Ruta base de usuarios", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Ruta base para los usuarios y sus videos descargados.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Usa cifrado", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Ruta del archivo de certificado", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Ruta de archivo de clave", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permitir suscripciones", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Ruta base de suscripciones", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Ruta base para videos de sus canales y listas de reproducción suscritos. Es relativo a la carpeta raíz de YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervalo de comprobación", - "0f56a7449b77630c114615395bbda4cab398efd8": "La unidad es segundos, solo incluye números.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Usa el archivo de youtube-dl", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Con la función de archivo de youtube-dl,", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "los videos descargados de sus suscripciones se graban en un archivo de texto en el subdirectorio del archivo de suscripciones.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Esto permite eliminar videos de sus suscripciones de forma permanente sin darse de baja y le permite grabar los videos que descargó en caso de pérdida de datos.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Defecto", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Oscura", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permitir cambio de tema", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Ruta de la carpeta de audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Ruta para descargas de solo audio. Es relativo a la carpeta raíz de YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Ruta de la carpeta de video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Ruta de descarga de videos. Es relativo a la carpeta raíz de YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Argumentos personalizados globales para descargas en la página de inicio. Los argumentos se delimitan usando dos comas así: ,,", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Descargador", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Título superior", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Administrador de archivos habilitado", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Administrador de descargas habilitado", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permitir selección de calidad", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modo de solo descarga", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permitir el modo de descarga múltiple", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Requiere pin para la configuración", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Establecer nuevo pin", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilitar API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clave API pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Ver documentación", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generar", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utilizar la API de YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clave API de YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "¡Generar una clave es fácil!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "¡Haga clic aquí", - "7f09776373995003161235c0c8d02b7f91dbc4df": "para descargar la extensión Chrome oficial de YoutubeDL-Material manualmente.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Debe cargar manualmente la extensión y modificar la configuración de la extensión para establecer la URL de la interfaz.", - "9a2ec6da48771128384887525bdcac992632c863": "para instalar la extensión Firefox oficial de YoutubeDL-Material directamente desde la página de extensiones de Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instrucciones detalladas de configuración.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "No se requiere mucho más que cambiar la configuración de la extensión para establecer la URL de la interfaz.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arrastra el enlace de abajo a tus marcadores, ¡y listo! Simplemente navegue hasta el video de YouTube que desea descargar y haga clic en el marcador.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Generar bookmarklet solo de audio", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usar agente de descarga predeterminado", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleccione un descargador", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permitir descarga avanzada", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avanzado", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permitir registro de usuario", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuarios", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salvar", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Cerrar} false {Cancelar} other {Otro} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "es un descargador de código abierto de YouTube creado bajo las especificaciones de \"Material Design\" de Google. Puede descargar sin problemas sus videos favoritos como archivos de video o audio, e incluso suscribirse a sus canales favoritos y listas de reproducción para mantenerse actualizado con sus nuevos videos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "tiene algunas características increíbles incluidas! Una amplia API, soporte de Docker y soporte de localización (traducción). Lea todas las funciones compatibles haciendo clic en el icono de GitHub que se encuentra arriba.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versión instalada:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Comprobando actualizaciones...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Actualización disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Puede actualizar desde el menú de configuración.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "¿Encontró un error o tiene una sugerencia?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "para crear una cuestión!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Tu perfil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creado:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Usted no se ha identificado.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Identificarse", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Salir", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crear cuenta de administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "No se detectó una cuenta de administrador predeterminada. Esto creará y establecerá la contraseña para una cuenta de administrador con el nombre de usuario como 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Crear", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Sobre", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Inicio", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Suscripciones", - "822fab38216f64e8166d368b59fe756ca39d301b": "Descargas", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Compartir lista de reproducción", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Compartir vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Compartir audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Habilitar compartir", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usar marca de tiempo", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segundos", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copiar al Portapapeles", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Guardar cambios", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalles", - "383000ab16bf415d5a1d61d7eb7b5959c72a9515": "Se ha producido un error:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inicio de descarga:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Fin de descarga:", - "ad127117f9471612f47d01eae09709da444a36a4": "Ruta(s) del archivo:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Suscríbase a la lista de reproducción o al canal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "La lista de reproducción o la URL del canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nombre personalizado", - "f3f62aa84d59f3a8b900cc9a7eec3ef279a7b4e7": "Esto es opcional", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Descargar todas las cargas", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Descargar videos subidos en el último", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modo de solo transmisión", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Subscribe", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archivo:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportar el archivo", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Darse de baja", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Sus suscripciones", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canales", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nombre no disponible. Recuperación de canales en progreso.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "No tienes suscripciones de canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nombre no disponible. Recuperación de listas de reproducción en progreso.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "No tienes suscripciones a listas de reproducción.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Buscar", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duración:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Eliminar y volver a descargar", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Borrar para siempre", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Updater", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleccione una versión:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrarse", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID de sesión:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "¡No hay descargas disponibles!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrar un usuario", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nombre de usuario", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Administrar usuario", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID de usuario:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nueva contraseña", - "6498fa1b8f563988f769654a75411bb8060134b9": "Establecer nueva contraseña", - "40da072004086c9ec00d125165da91eaade7f541": "Uso por defecto", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Si", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestionar rol", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": " Nombre de usuario ", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": " Rol ", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": " Acciones ", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Agregar Usuarios", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Editar Rol", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registros", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Search Filter", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Método de autenticación", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Configurar Cookies", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usar Cookies", - "db6c192032f4cab809aad35215f0aa4765761897": "Caducidad de inicio de sesión", - "00e274c496b094a019f0679c3fab3945793f3335": "Seleccione un nivel de registrador", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "¡Esto eliminará su vieja clave API!", - "fb35145bfb84521e21b6385363d59221f436a573": "Mata todas las descargas", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Incluir metadatos", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Incluir miniatura", - "85e0725c870b28458fd3bbba905397d890f00a69": "NOTA: La carga de cookies nuevas anulará las cookies anteriores y las cookies son para toda la instancia, no por usuario.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrastrar y soltar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Subir nuevas cookies", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Editar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modificar lista de reproducción", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "d02888c485d3aeab6de628508f4a00312a722894": "Mis videos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ir a suscripción", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Abrir archivo en nueva pestaña", - "ccf5ea825526ac490974336cb5c24352886abc07": "Abrir archivo", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Borrar registros", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Líneas:", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Eliminar usuario", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Editar usuario", - "98b6ec9ec138186d663e64770267b67334353d63": "Salida de archivo personalizado", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Estos se agregan después de los argumentos estándar.", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modo de solo audio", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Un error ha ocurrido:", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Un error ha ocurrido", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "La descarga era exitosa", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usar rol predeterminado", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Claro todas las descargas", - "3697f8583ea42868aa269489ad366103d94aece7": "Editando", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nivel de registro", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: La carga de cookies nuevas anulará las cookies anteriores y las cookies son para toda la instancia, no por usuario.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Agregar más contenido", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Ver menos.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Ver más.", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleccione un agente de descarga", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Descarga automática de Twitch Chat", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "También conocido como ID de cliente.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clave de API de Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usar la API de Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorías", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Args personalizados globales", - "1148fd45287ff09955b938756bc302042bcb29c7": "La ruta es relativa a las rutas de descarga anteriores. No incluya la extensión.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Salida de archivo predeterminada", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Volver a descargar nuevas cargas", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "A veces, los videos nuevos se descargan antes de procesarse por completo. Esta configuración significará que los nuevos videos se verificarán para una versión de mayor calidad al día siguiente.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "vistas", - "792dc6a57f28a1066db283f2e736484f066005fd": "Descargar Twitch Chat", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Añadir nueva regla", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Reglas", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editando la categoría", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Pausado", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "No se encontraron vídeos.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Orden inverso", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Orden normal", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Añadir contenido", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoría:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausado)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Calidad máxima" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.es.xlf b/src/assets/i18n/messages.es.xlf index 04a30ba..bcf54aa 100644 --- a/src/assets/i18n/messages.es.xlf +++ b/src/assets/i18n/messages.es.xlf @@ -48,7 +48,7 @@ Arg value - Valor de arg + Valor de argumento Add arg @@ -103,8 +103,8 @@ Avanzado - Simulated command: - Commando simulado: + Simulated command: + Orden simulada: Use custom args @@ -132,11 +132,11 @@ Path is relative to the config download path. Don't include extension. - La ruta es relativa a la ruta de descarga de la config. No incluya el extensión. + La ruta es relativa a la ruta de descarga de la configuración. No incluya el extensión. - Use authentication - Usa autenticación + Use authentication + Utilizar autenticación Username @@ -200,7 +200,7 @@ Close - Cerca + Cerrar ID: @@ -308,7 +308,7 @@ Default - Defecto + Predeterminado Dark @@ -432,7 +432,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. - No se requiere mucho más que cambiar la configuración de la extensión para establecer la URL de la interfaz. + No se requiere mucho más que cambiar la configuración de la extensión para establecer el URL de la interfaz. Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. @@ -472,7 +472,7 @@ Save - Salvar + Guardar {VAR_SELECT, select, true {Close} false {Cancel} other {otha} } @@ -480,7 +480,7 @@ About YoutubeDL-Material - Sobre YoutubeDL-Material + Acerca de YoutubeDL-Material is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. @@ -512,7 +512,7 @@ to create an issue! - para crear una cuestión! + para crear un informe. Your Profile @@ -556,7 +556,7 @@ About - Sobre + Acerca de Home @@ -584,11 +584,11 @@ Enable sharing - Habilitar compartir + Activar compartición Use timestamp - Usar marca de tiempo + Utilizar cronomarcador Seconds @@ -596,7 +596,7 @@ Copy to clipboard - Copiar al Portapapeles + Copiar en el portapapeles Save changes @@ -652,7 +652,7 @@ Subscribe - Subscribe + Suscribirse Type: @@ -712,7 +712,7 @@ Updater - Updater + Actualizador Select a version: @@ -724,7 +724,7 @@ Session ID: - ID de sesión: + Id. de sesión: (current) @@ -752,7 +752,7 @@ New password - Nueva contraseña + Contraseña nueva Set new password @@ -764,7 +764,7 @@ Yes - Si + No @@ -805,7 +805,7 @@ Search Base - Search Base + Base de búsquedas app/settings/settings.component.html 333 @@ -814,7 +814,7 @@ Search Filter - Search Filter + Filtro de búsqueda app/settings/settings.component.html 338 @@ -823,7 +823,7 @@ Bind Credentials - Bind Credentials + Credenciales de vinculación app/settings/settings.component.html 328 @@ -832,7 +832,7 @@ Bind DN - Bind DN + DN de vinculación app/settings/settings.component.html 323 @@ -922,7 +922,7 @@ Kill all downloads - Mata todas las descargas + Forzar término de todas las descargas app/settings/settings.component.html 139 @@ -967,7 +967,7 @@ Upload new cookies - Subir nuevas cookies + Cargar «cookies» nuevas app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html 1 @@ -1136,7 +1136,7 @@ An error has occurred: - Un error ha ocurrido: + Ha ocurrido un error: app/download-item/download-item.component.html 27 @@ -1145,7 +1145,7 @@ An error has occurred - Un error ha ocurrido + Ha ocurrido un error app/download-item/download-item.component.html 9 @@ -1154,7 +1154,7 @@ The download was successful - La descarga era exitosa + La descarga fue exitosa app/download-item/download-item.component.html 8 @@ -1172,7 +1172,7 @@ Clear all downloads - Claro todas las descargas + Borrar todas las descargas app/components/downloads/downloads.component.html 18 @@ -1316,7 +1316,7 @@ Redownload fresh uploads - Volver a descargar nuevas cargas + Volver a descargar cargas nuevas src/app/settings/settings.component.html 63 @@ -1388,7 +1388,7 @@ No videos found. - No se encontraron vídeos. + No se encontró ningún vídeo. src/app/components/recent-videos/recent-videos.component.html 38 @@ -1469,6 +1469,167 @@ Max quality placeholder + + Auto-generated + Generado automáticamente + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Share file + Compartir archivo + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Reiniciar servidor + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + No se pudo recuperar la información de la base de datos. Compruebe los registros del servidor para obtener detalles. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transferir BD a + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Probar cadena de conexión + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Ejemplo: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Cadena de conexión de MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Registros por tabla + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Ubicación de base de datos: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Permitir categorización de listas + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Con esta opción activada, si un único vídeo coincide con una categoría, toda la lista de reproducción se clasificará en la misma. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Base de datos + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Aleatorizar orden al reproducir + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Recortar hasta (s) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Recortar a partir de (s) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Recortar archivo + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Download for has been queued! + ¡La descarga de se ha puesto en cola! + + src/app/main/main.component.ts + 469 + + diff --git a/src/assets/i18n/messages.fi.xlf b/src/assets/i18n/messages.fi.xlf new file mode 100644 index 0000000..f4fa7b0 --- /dev/null +++ b/src/assets/i18n/messages.fi.xlf @@ -0,0 +1,2634 @@ + + + + + + About + Tietoa + + src/app/app.component.html + 32 + + About menu label + + + Profile + Profiili + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + Tumma + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + Asetukset + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + Koti + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + Kirjaudu + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + Tilaukset + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + Lataukset + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + Vain ääni + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + Tallenna + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + Laatu + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + Käytä osoitelinkkiä + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + Näytä + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + Multitallennustila + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + Peruuta + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + Kehittynyt + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + Käytä mukautettuja argumentteja + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + Mukautetut argumentit + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Ei tarvetta sisällyttää osoitelinkkiä, riittää pelkkä loppuosa. Argumentit erotellaan kahdella pilkulla, eli näin: ,, + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + Käytä mukautettua ulostuloa + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + Mukautettu ulostulo + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + Dokumentaatio + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + Polku vastaa config-tallennuksen polkua. Älä sisällytä liitännäistä. + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + Rajaa tiedosto + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + Rajaa jostain (sekuntia) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + Rajaa johonkin (sekuntia) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + Simuloitu komento: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + Käytä tunnistautumista + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + Käyttäjänimi + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + Salasana + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + Luo soittolista + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + Nimi + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + Tyyppi + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + Ääni + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + Video + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + Äänitiedostot + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + Videot + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + Tilaa soittolista tai kanava + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + Soittolistan tai kanavan osoitelinkki + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + Mukautettu nimi + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + Tallenna kaikki lataukset + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + Maksimilaatu + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + Vain ääni -tila + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + Vain suoratoisto -tila + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + Nämä lisätään standardiargumenttien perään. + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + Mukautettu tiedoston ulostulo + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + Peruuta + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + Tilaa + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + Tallenna videot, jotka on ladattu viimeisen + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + Tyyppi: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + URL: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + ID: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + Sulje + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + Vientiarkisto + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + Poista tilaus + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (Pysäytetty) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + Arkisto: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + Nimi: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + Lataaja: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + Tiedostokoko: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + Polku: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + Latauspäivämäärä: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + Kategoria: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + Muokkaa youtube-dl -argumentteja + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + Simuloidut uudet argumentit + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + Lisää argumentti + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + Etsi kategorian perusteella + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + Käytä argumentin arvoa + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + Lisää argumentti + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + Muokkaa + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + Argumentin arvo + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + Päivittäjä + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + Rekisteröi käyttäjä + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + Käyttäjän nimi + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + Rekisteröidy + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + Lataa uusia evästeitä + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + HUOMIO: Uusien evästeiden lataaminen korvaa vanhat evästeet. Huomioi myös, että evästeet ovat palveluntarjoajalaajuisia, ei käyttäjäkohtaisia. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + Raahaa ja pudota + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + Muokkaa soittolistaa + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + Tallenna + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + Aseta satunnainen toistojärjestys + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + Lisää sisältöä + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + Tavallinen järjestys + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + Käänteinen järjestys + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + Minun videot + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + Etsi + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + Ei löydetty videoita. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + Muokataan + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + Pysäytetty + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + Kategorian muokkaaminen + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + Säännöt + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + Luo uusi sääntö + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + Tallenna Twitch-chat + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + Muokkaa + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + Poista + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + Tietoa + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + Lukumäärä: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + Poista ja estä + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + näyttökertaa + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + Tallennus onnistui + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + Tapahtui virhe + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + Lisätietoja + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + Tapahtui virhe: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + Tallennuksen aloitus: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + Tallennuksen loppu: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + Tiedostopolku/-polut: + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + Sinun tilauksesi + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + Kanavat + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + Soittolistat + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + Nimi ei saatavilla. Kanavan nouto kesken. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + Sinulla ei ole kanavatilauksia. + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + Nimi ei saatavilla. Soittolistan nouto kesken. + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + Sinulla ei ole soittolistatilauksia. + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + Päävalikko + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + Tallentaja + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + Extra + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + Tietokanta + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + Kehittynyt + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + Käyttäjät + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + Lokit + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + {VAR_SELECT, select, true {Sulje} false {Peruuta} other {muu}} + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + Osoite, josta yhdistetään tähän sovellukseen, ilman porttia. + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + Portti + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + Toivottu portti. Oletus on 17442. + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + Monikäyttäjätila + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + Käyttäjien peruspolku + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + Peruspolku käyttäjille ja niiden tallennetuille videoille. + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + Salli tilaukset + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + Tilausten peruspolku + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Peruspolku videoille sinun tilaamiltasi kanavilta ja soittolistoilta. Se vastaa YTDL-Materialin root-kansiota. + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + Tarkistusväli + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + Yksikkö on sekuntia, sisällytä vain numeroita. + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + Joskus uudet videot tallennetaan ennen kuin ne ovat täysin valmisteltuja. Tämä asetus tarkoittaa, että uudet videot tarkistetaan seuraavana päivänä korkealaatuisemman version varalta. + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + Uudelleentallenna tuoreet lataukset + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + Teema + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + Oletus + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + Salli teeman muuttaminen + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + Kieli + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + Äänen tiedostopolku + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + Polku ainoastaan äänimuotoisia tallennuksia varten. Se vastaa YTDL-Materialin root-kansiota. + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + Videon tiedostopolku + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + Polku videomuotoisille tallennuksille. Se vastaa YTDL-Materialin root-kansiota. + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + Oletusarvoinen tiedoston ulostulo + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + Polku vastaa yllä olevia tallennuspolkuja. Älä sisällytä liitännäistä. + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + Globaalit mukautetut argumentit + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Globaalit mukautetut argumentit latauksille, jotka ovat kotisivulla. Argumentit eritellään kahdella pilkulla, eli näin: ,, + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + Kategoriat + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Kun tämä asetus on päällä, jos yksittäinen video vastaa kategoriaa, koko soittolista saa kyseisen kategorian. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + Salli soittolistan kategoriasointi + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + Käytä youtube-dl arkistoa + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + Sisällytä pienoiskuvake + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + Sisällytä metadata + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + Tapa kaikki tallennukset + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + Yläotsikko + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + Tiedostonhallintaohjelma sallittu + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + Tallennustenhallintaohjelma sallittu + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + Salli laadun valinta + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + Vain tallennus -tila + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + Salli monitallennus -tila + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + Salli julkinen API + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + Julkinen API-avain + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + Näytä dokumentaatio + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + Tämä poistaa sinun vanhan API-avaimen! + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + Luo + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + Käytä YouTube API:a + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + YouTube API-avain + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + Avaimen luominen on helppoa! + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + Käytä Twitch API:a + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + Twitch API-avain + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + Tunnetaan myös nimellä Client ID. + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + Tallenna automaattisesti Twitch-chat + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + Klikkaa tänne + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + ladataksesi virallisen YouTubeDL-Materialin Chrome-liitännäisen manuaalisesti. + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + Sinun täytyy manuaalisesti ladata liitännäinen ja muokata liitännäise asetuksia säätääksesi frontend-osoitelinkin. + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + asentaaksesi virallisen YoutubeDL-Material Firefox-laajennuksen suoraan Firefoxin laajennussivulta. + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + Tarkat asennusohjeet. + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + Ei vaadita paljoa muuta kuin liitännäisen asetuksen vaihtaminen, jotta saa säädettyä frontend-osoitelinkin. + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Raahaa alla oleva linkki kirjanmerkkeihisi, ja voit aloittaa! Siirry haluamaasi YouTube-videoon ja klikkaa kirjanmerkkiä. + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + Luo 'vain ääni' kirjanmerkki + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + Tietokannan sijainti: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + Tallenteita per taulukko + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + MongoDB-yhteyden merkkijono + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + Esimerkki: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + Testaa yhteys merkkijono + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + Siirrä DB kohteeseen + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + Tietokantainformaatiota ei voitu noutaa. Tarkista palvelimen lokit saadaksesi lisätietoa. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + Valitse tallentaja + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + Käytä oletusarvoista tallennusagenttia + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + Valitse tallennusagentti + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + Lokin taso + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + Kirjautumisen vanhentuminen + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + Salli kehittynyt tallennus + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + Käytä evästeitä + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + Aseta evästeet + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + Uudelleenkäynnistä palvelin + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + Salli käyttäjän rekisteröityminen + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + Tunnistautumismetodi + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + Sisäinen + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + LDAP URL + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + Sido DN + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + Sido kredentiaalit + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + Etsi basea + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + Hakusuodatin + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + Tietoa YoutubeDL-Material -ohjelmasta + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + on avoimen koodin YouTube-tallennusohjelma, joka on tehty Googlen Material Design -vaatimusten mukaisesti. Voit saumattomasti tallentaa suosikkivideosi videona tai äänenä. Voit jopa tilata suosikkikanaviasi ja soittolistojasi pysyäksesi ajan tasalla heidän uusista videoista. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + -sovelluksessa on upeita ominaisuuksia! Laaja API, Docker-tuki ja kielituki. Lue kaikista ominaisuuksista lisää klikkaamalla GitHub-kuvaketta yllä. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + Asennettu versio: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + Löysitkö bugin tai onko sinulla ehdotuksia? + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + luodaksesi ilmoituksen! + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + Tarkistetaan päivityksiä… + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + Päivitys saatavilla + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + Voit päivittää asetusvalikon kautta. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + Valitse versio: + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + Salli jakaminen + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + Käytä aikaleimaa + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + Sekuntia + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + Kopioi leikepöydälle + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + Jaa soittolista + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + Jaa tiedosto + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + Session ID: + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + Tyhjennä kaikki tallennukset + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + (nykyinen) + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + Ei tallennuksia saatavilla! + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + Sinun profiilisi + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + Kirjaudu ulos + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + Luotu: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + Et ole kirjautuneena. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + Luo ylläpitäjän tili + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + Ei oletusarvoista ylläpitäjätiliä tunnistettu. Tämä luo ja asettaa ylläpitäjän salanan käyttäjänimen kanssa muotoon 'admin'. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + Luo + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + Lisää käyttäjiä + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + Muokkaa roolia + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + Käyttäjän nimi + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + Rooli + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + Toiminnot + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + Hallitse käyttäjää + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + Poista käyttäjä + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + Muokkaa käyttäjää + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + Käyttäjä UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + Uusi salasana + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + Aseta uusi salasana + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + Käytä roolia oletus + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + Kyllä + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + Ei + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + Hallitse roolia + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + Rivit: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + Tyhjennä lokit + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + Automaattisesti luotu + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + Avaa tiedosto + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + Avaa tiedosto uudessa välilehdessä + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + Siirry tilaukseen + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + Poista ja tallenna uudelleen + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + Poista pysyvästi + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + Katso enemmän. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + Katso vähemmän. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + Pituus: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + diff --git a/src/assets/i18n/messages.fr.json b/src/assets/i18n/messages.fr.json deleted file mode 100644 index 5b6066b..0000000 --- a/src/assets/i18n/messages.fr.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Créer une liste de lecture", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nom", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Fichiers audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vidéos", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifier les args de téléchargement", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Nouveaux args simulés", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Ajouter un arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Rechercher par catégorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Utiliser la valeur arg", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valeur arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Ajouter", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annuler", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifier", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Youtube Downloader", - "a38ae1082fec79ba1f379978337385a539a28e73": "Résolution", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utiliser l'URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Voir", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Audio seulement", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Activer le téléchargement simultané", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Télécharger", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Annuler", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Système", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Prévisualisation des arguments :", - "4e4c721129466be9c3862294dc40241b64045998": "Utiliser des arguments personnalisés", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arguments personnalisés", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Pas besoin d'inclure l'URL, seulement ce qui suit. Les arguments sont délimités par deux virgules comme suit ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Modifier le chemin de sortie", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Sortie personnalisée", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentation", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Le chemin est relatif au chemin de téléchargement de la config. Ne pas inclure l'extension.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "S'authentifier", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nom d'utilisateur", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Mot de passe", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "Audio", - "9779715ac05308973d8f1c8658b29b986e92450f": "Vos fichiers audio sont ici", - "47546e45bbb476baaaad38244db444c427ddc502": "Listes de lecture", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "Aucune liste de lecture disponible. Créez-en une à l'aide du bouton \\\"+\\\" bleu de votre fichier audio.", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "Vídéos", - "960582a8b9d7942716866ecfb7718309728f2916": "Vos fichiers vidéos sont ici", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "Aucune liste de lecture disponible. Créez-en une à l'aide du bouton \\\"+\\\" bleu de votre fichier vidéo.", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nom :", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL :", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Chaîne :", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Taille du fichier :", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Chemin :", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Mise en ligne :", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Fermer", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifier la liste de lecture", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID :", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Compteur :", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Modifier", - "826b25211922a1b46436589233cb6f1a163d89b7": "Effacer", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informations", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Supprimer et bannir", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Téléverser de nouveaux cookies", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Glisser-déposer", - "85e0725c870b28458fd3bbba905397d890f00a69": "NOTE : le téléversement de nouveaux cookies remplacera vos cookies précédents. Notez également que les cookies sont par instance, et non par utilisateur.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Paramètres", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL à partir de laquelle cette application sera accessible, sans le port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Port souhaité. La valeur par défault est 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Activer Multi-Utilisateurs", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Chemin d'enregistrement des utilisateurs", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Chemin racine pour les utilisateurs et leurs vidéos téléchargées.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "Activer le cryptage des données", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "Chemin du fichier de certificat", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "Chemin d'accès au fichier clé", - "4e3120311801c4acd18de7146add2ee4a4417773": "Autoriser les abonnements", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Chemin d'enregistrement des abonnements", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Chemin racine pour les vidéos des chaînes et des listes de lecture auxquelles vous êtes abonné.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Interval de vérification des abonnements", - "0f56a7449b77630c114615395bbda4cab398efd8": "L'unité est la seconde, écricre uniquement un nombre entier.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Utiliser youtube-dl archive", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "Avec youtube-dl's archive", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "les vidéos téléchargées à partir de vos abonnements sont enregistrées dans un fichier texte dans le sous-répertoire du fichier d'abonnement.", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "Cela vous permet de supprimer définitivement des vidéos de vos abonnements sans vous désabonner et vous permet d'enregistrer les vidéos que vous avez téléchargées en cas de perte de données.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Thème", - "ff7cee38a2259526c519f878e71b964f41db4348": "Par défaut", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Sombre", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Autoriser le changement du thème", - "fe46ccaae902ce974e2441abe752399288298619": "Choix de la langue", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Chemin du dossier audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Chemin racine pour les téléchargements audio uniquement.", - "46826331da1949bd6fb74624447057099c9d20cd": "Chemin d'accès au dossier vidéo", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Chemin racine de téléchargement des vidéos.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Arguments personnalisés globaux pour les téléchargements sur la page d'accueil. Les arguments sont délimités par deux virgules comme suit ,,", - "d01715b75228878a773ae6d059acc639d4898a03": "Désactiver le téléchargement sécurisé", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Téléchargements", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Nom de l'application", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Gestionnaire de fichiers activé", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Gestionnaire de téléchargement activé", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permettre la sélection de la résolution", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Empêcher le téléchargement local", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Autoriser les téléchargements simultanés", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "Utiliser un code PIN", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "Définir le code PIN", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Activer l'API publique", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Clé API publique", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Voir documentation", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Générer", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Utiliser l'API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Clé API YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Générer un mot de passe !", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Cliquez ici", - "7f09776373995003161235c0c8d02b7f91dbc4df": "pour télécharger manuellement l'extension officielle YoutubeDL-Material Chrome.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Vous devez charger manuellement l'extension et modifier les paramètres de l'extension pour définir l'URL de l'interface.", - "9a2ec6da48771128384887525bdcac992632c863": "pour installer l'extension officielle YoutubeDL-Material Firefox directement depuis la page des extensions Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Installation détaillé ici.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Il suffit de modifier les paramètres de l'extension pour définir l'URL de l'interface.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Faites glisser le lien ci-dessous vers vos favoris, et le tour est joué ! Il suffit de naviguer vers la vidéo YouTube que vous souhaitez télécharger et de cliquer sur le signet.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Générer un signet audio uniquement", - "d5f69691f9f05711633128b5a3db696783266b58": "Avancés", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Utiliser l'agent de téléchargement par défault", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Sélectionner une méthode de téléchargement", - "00e274c496b094a019f0679c3fab3945793f3335": "Niveau des logs", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Autoriser le téléchargement avancé", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Utiliser les cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Gérer les cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avancé", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Autoriser l'enregistrement des utilisateurs", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Utilisateurs", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Journaux", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Sauvegarder", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Fermer} false {Annuler}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "est un téléchargeur YouTube open source créé selon le graphique \\\"Material Design\\\" de Google. Vous pouvez facilement télécharger vos vidéos préférées sous forme de fichiers vidéo ou audio, et même vous abonner à vos chaînes et listes de lecture préférées pour vous tenir au courant de vos nouvelles vidéos.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "comporte des caractéristiques étonnantes ! Une API étendue, un support Docker et un support de localisation (traduction). Pour en savoir plus sur toutes les fonctionnalités prises en charge, cliquez sur l'icône GitHub ci-dessus.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Version installée :", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Vérification des mises à jours ...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Mise à jour disponible", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Vous pouvez mettre à jour à partir du menu de configuration.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Avez-vous trouvé une erreur ou avez-vous une suggestion ?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "pour signaler un problème !", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Votre profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID :", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Créé le :", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Vous n'êtes pas identifié.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Se connecter", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Se déconnecter", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Créer un compte administrateur", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Aucun compte administrateur détecté. Veuillez définir le mot de passe du compte adminstrateur \\\"admin\\\".", - "70a67e04629f6d412db0a12d51820b480788d795": "Créer", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "À propos", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Accueil", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnements", - "822fab38216f64e8166d368b59fe756ca39d301b": "Téléchargements", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Partager une liste de lecture", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Partager une vidéo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Partager un audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Activer le partage", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Utiliser l'horodatage", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Secondes", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copier dans le presse-papiers", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Sauvegarder", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Détails", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Une erreur s'est produite :", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Début du téléchargement :", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Fin du téléchargement :", - "ad127117f9471612f47d01eae09709da444a36a4": "Chemin(s) de fichier :", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "S'abonner à la liste de lecture ou à la chaîne", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "L'URL de la liste de lecture ou de la chaîne", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nom personnalisé", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Télécharger tous les fichiers téléversés", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Télécharger les dernières vidéos téléversées", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Extraire le son", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Streaming uniquement", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Ceux-ci sont ajoutés après les arguments standard.", - "98b6ec9ec138186d663e64770267b67334353d63": "Sortie de fichier personnalisé", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "S'abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type :", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archive :", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exporter l'archive", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Se désabonner", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Vos abonnements", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Chaînes", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nom non disponible. Le rétablissement des canaux est en cours...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Vous n'êtes abonné à aucune châine.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Ce nom n'est pas disponible. Recherche de chaînes en cours.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Vous n'êtes abonné·e à aucune liste de lectures.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Chercher", - "2054791b822475aeaea95c0119113de3200f5e1c": "Durée :", - "94e01842dcee90531caa52e4147f70679bac87fe": "Effacer et re-télécharger", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Supprimer définitivement", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Mettre à jour", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Sélectionnez une version :", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Créer un compte", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID de la session :", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(actual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Pas de téléchargements !", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Ajouter un utilisateur", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nom d'utilisateur", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gérer l'utilisateur", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Identifiant de l'utilisateur :", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nouveau mot de passe", - "6498fa1b8f563988f769654a75411bb8060134b9": "Enregistrer le nouveau mot de passe", - "40da072004086c9ec00d125165da91eaade7f541": "Utilisation par défault", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Oui", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Non", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gérer le groupe", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Identifiant", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Groupe", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Gérer", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Ajouter", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Gérer les groupes", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "Les enregistrements apparaîtront ici", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Lignes :", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Une erreur s'est produite", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Le téléchargement a réussi", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Méthode d'authentification", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtre de recherche", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interne", - "db6c192032f4cab809aad35215f0aa4765761897": "Expiration de la connexion", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Niveau de journal", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Ceci supprimera votre ancienne clé API !", - "fb35145bfb84521e21b6385363d59221f436a573": "Supprimer tous les téléchargements", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inclure les métadonnées", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inclure une miniature", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "REMARQUE : le téléversement de nouveaux cookies remplacera vos cookies précédents. Notez également que les cookies sont à l'échelle de l'instance et non par utilisateur.", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Ajouter plus de contenu", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vidéo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "3697f8583ea42868aa269489ad366103d94aece7": "Édition", - "d02888c485d3aeab6de628508f4a00312a722894": "Mes vidéos", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Aller aux abonnements", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Ouvrir le fichier dans un nouvel onglet", - "ccf5ea825526ac490974336cb5c24352886abc07": "Ouvrir le fichier", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Effacer les journaux", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Supprimer l'utilisateur", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Utiliser le groupe par défaut", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Modifier l'utilisateur", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Effacer tous les téléchargements", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP URL", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Voir moins.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Voir plus.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Généré automatiquement", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Sélectionnez un agent de téléchargement", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Télécharger automatiquement la discussion Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Aussi connu sous le nom d'identifiant client.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Clé API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Utiliser l'API de Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Catégories", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Arguments personnalisés globaux", - "1148fd45287ff09955b938756bc302042bcb29c7": "Le chemin est relatif aux chemins de téléchargement ci-dessus. Ne pas inclure l'extension.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Sortie de fichier par défaut", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Retélécharger les nouvelles mises en ligne", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Il arrive que de nouvelles vidéos soient téléchargées avant d'être entièrement traitées. Grâce à ce paramètre, les nouvelles vidéos seront vérifiées pour obtenir une version de meilleure qualité le jour suivant.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "vues", - "792dc6a57f28a1066db283f2e736484f066005fd": "Télécharger la discussion Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Ajouter une nouvelle règle", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Règles", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Modification de la catégorie", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "En pause", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Aucune vidéo trouvée.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordre inverse", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordre normal", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Ajouter du contenu", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Catégorie :", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(En pause)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualité maximale" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.fr.xlf b/src/assets/i18n/messages.fr.xlf index 86dc228..f517f89 100644 --- a/src/assets/i18n/messages.fr.xlf +++ b/src/assets/i18n/messages.fr.xlf @@ -1,4 +1,4 @@ - + @@ -732,8 +732,8 @@ Allow subscriptions setting - Subscriptions base path - Chemin d'enregistrement des abonnements + Base bath for subscriptions + Chemin de base pour les abonnements app/settings/settings.component.html 72 @@ -1262,7 +1262,7 @@ About YoutubeDL-Material - Sobre YoutubeDL-Material + A propos de YoutubeDL-Material app/dialogs/about-dialog/about-dialog.component.html 1 @@ -2573,6 +2573,598 @@ Max quality placeholder + + Transfer DB to + Transférer la base de donnés à + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Test connection string + Tester la chaîne de connexion + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Example: + Exemple : + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Chaîne de connexion MongoDB + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Records per table + Enregistrements par table + + src/app/settings/settings.component.html + 310 + + Records per table label + + + Database location: + Emplacement de la base de donné : + + src/app/settings/settings.component.html + 309 + + Database location label + + + Generate NFO files + Générer des fichiers NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Générer des fichiers NFO à chaque téléchargement, principalement utilisés par Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + Utiliser SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + Activer un bouton pour ignorer les annonces lors du visionnage des vidéos prises en charge. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + Autoriser l'autoplay + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + Le taux limite vos téléchargements à la quantité spécifiée. Ex : 200 000 + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + Limite de téléchargements simultanés + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limitez le nombre de téléchargements qui peuvent être effectués simultanément. Utilisez -1 pour aucune limite. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Téléchargements simultanés maximum + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Allow playlist categorization + Autoriser la catégorisation de la playlist + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Quand ces paramètres ce paramètre est activé, si une vidéo entre dans une catégorie, toute la playlist va recevoir cette catégorie. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Database + Base de donnés + + src/app/settings/settings.component.html + 303 + + Database settings label + + + You must enable multi-user mode to access this tab. + Vous devez activer le mode multi-utilisateurs pour accéder à cet onglet. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + Audio seulement + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + Vidéos seulement + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Mêmes + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Type de fichier + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Randomize order when playing + Ordre aléatoire quand joué + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Rajuster à (secondes) + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Crop from (seconds) + Rajuster de (secondes) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop file + Rajuster le fichier + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Replace args + Remplacer les arguments + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Autoplay + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + Le téléchargement à était ajouté à la queue ! + + src/app/main/main.component.ts + 469 + + + + Database information could not be retrieved. Check the server logs for more information. + Les informations de la base de données n'ont pas pu être récupérées. Consultez les journaux du serveur pour plus d'informations. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Restart server + Redémarrer le serveur + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Installation type: + Type d'installation : + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Build date: + Date de compilation : + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Share file + Partager le fichier + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Docker tag: + Étiquette Docker : + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Commit hash: + Hash du commit : + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Creating download + Création du téléchargement + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + Récupération des infos + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Téléchargement du fichier + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + Terminé + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Nettoyer les téléchargements finis + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Voulez-vous nettoyer tous les téléchargements finis ? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + Nettoyer + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Erreur pour + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + Copier dans le presse-papier + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + Fermer + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + Copié dans le presse-papier ! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Date + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + Titre + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + Souscription + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Étape + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Progression + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Actions + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Effacer + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + Reprendre + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + Regarder le contenu + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Afficher l'erreur + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Recommencer + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + Mettre tous en pause + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + Reprendre tous + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Nettoyer les téléchargements finis + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Ajouter à la liste de lecture + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Passer la pub + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + diff --git a/src/assets/i18n/messages.id.json b/src/assets/i18n/messages.id.json deleted file mode 100644 index 1fd4e2c..0000000 --- a/src/assets/i18n/messages.id.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Tentang", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Gelap", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Pengaturan", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Beranda", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Masuk", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Langganan", - "822fab38216f64e8166d368b59fe756ca39d301b": "Unduhan", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Hanya Audio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Unduhan", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kualitas", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Gunakan Alamat URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Tampilkan", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Mode Multi-unduh", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Batal", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Khusus", - "4e4c721129466be9c3862294dc40241b64045998": "Gunakan arg kustom", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Arg kustom", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Tidak perlu mencantumkan alamat URL, hanya bagian setelahnya saja. Arg dibatasi menggunakan dua koma seperti ini: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Gunakan output kustom", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Output kustom", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasi", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Path adalah relatif kepada path unduh konfigurasi. Jangan mencantumkan ektensi.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Perintah yang disimulasi:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Gunakan otentikasi", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nama Pengguna", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Kata Sandi", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Buat sebuah playlist", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nama", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Jenis", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Berkas audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Langganan ke playlist atau saluran/channel", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Alamat URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Playlist atau alamat URL saluran/channel", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nama kustom", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Unduh semua unggahan", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Kualitas maksimal", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Mode hanya-audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Mode hanya-streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Ini ditambahkan setelah argumen standar.", - "98b6ec9ec138186d663e64770267b67334353d63": "Output berkas kustom", - "d7b35c384aecd25a516200d6921836374613dfe7": "Batal", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Langganan", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Unduh video yang diunggah terakhir", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Jenis:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Alamat URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Tutup", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Ekspor Arsip", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Batal Langganan", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Dijeda)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arsip:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nama:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Pengunggah:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Ukuran berkas:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Jalur/path:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Tanggal Unggah:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Kategori:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifikasi arg youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulasikan arg baru", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Tambah sebuah arg", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cari berdasarkan kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Gunakan nilai arg", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Tambah arg", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifikasi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Nilai arg", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Pembaruan", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Daftarkan pengguna", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nama pengguna", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Daftar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Unggah cookie baru", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "CATATAN: Mengunggah cookie baru akan menimpa cookie Anda sebelumnya. Juga ingat bahwa cookie termasuk dalam pengguna-banyak, bukan per-pengguna.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Tarik dan Jatuhkan", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifikasi playlist", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Tambah konten", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Simpan", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Urutan normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Urutan terbalik", - "d02888c485d3aeab6de628508f4a00312a722894": "Video saya", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cari", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Tidak ada video ditemukan.", - "3697f8583ea42868aa269489ad366103d94aece7": "Menyunting", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Dijeda", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Kategori suntingan", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Aturan", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Tambah aturan baru", - "792dc6a57f28a1066db283f2e736484f066005fd": "Unduh Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Sunting", - "826b25211922a1b46436589233cb6f1a163d89b7": "Hapus", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informasi", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Hitung:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Hapus dan jadikan daftarhitam", - "dad95154dcef3509b8cc705046061fd24994bbb7": "dilihat", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Simpan perubahan", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Unduhan telah berhasil", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Sebuah kesalahan telah terjadi", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Rincian", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Sebuah kesalahan telah terjadi:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Unduhan dimulai:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Unduhan berakhir:", - "ad127117f9471612f47d01eae09709da444a36a4": "Jalur file:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Langganan anda", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Saluran", - "47546e45bbb476baaaad38244db444c427ddc502": "Daftar putar", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nama tidak tersedia. Pengambilan saluran sedang berlangsung.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Anda tidak memiliki saluran langganan.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nama tidak tersedia. Pengambilan daftar-putar sedang berlangsung.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Anda tidak memiliki langganan daftar putar.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Utama", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Pengunduh", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Lanjutan", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Pengguna", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Log", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Tutup} false {Batal} other {lainnya}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL aplikasi ini akan diakses dari, tanpa port.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Port yang diinginkan. Default-nya adalah 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Mode multi-pengguna", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Path basis pengguna", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Path basis untuk pengguna dan unduhan video mereka.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Izinkan langganan", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Langganan Pangkros Base", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Jalur dasar untuk video dari saluran dan daftar putar Anda yang berlangganan. Itu relatif terhadap folder root ytdl-material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Periksa interval", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unit adalah detik, hanya termasuk angka.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Kadang-kadang video baru diunduh sebelum diproses sepenuhnya. Pengaturan ini akan berarti video baru akan diperiksa untuk versi berkualitas lebih tinggi pada hari berikutnya.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Redownload unggahan segar", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Default", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Izinkan perubahan tema", - "fe46ccaae902ce974e2441abe752399288298619": "Bahasa", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Jalur folder audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Jalur untuk unduhan hanya audio. Ini relatif terhadap folder root ytdl-material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Jalur folder video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Jalur untuk unduhan video. Ini relatif terhadap folder root YTDL-material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Output file default", - "1148fd45287ff09955b938756bc302042bcb29c7": "Jalur relatif terhadap jalur unduhan di atas. Jangan sertakan ekstensi.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Args kustom global", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Args kustom global untuk unduhan di beranda. Args dibatasi menggunakan dua koma seperti itu: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Kategori", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Gunakan YouTube-DL Archive", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Sertakan thumbnail", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Sertakan metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Bunuh semua unduhan", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Top judul", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Manajer file diaktifkan", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Unduhan Manager diaktifkan", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Izinkan kualitas pilih", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Unduh Only Mode", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Izinkan Mode Multi-Unduh", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Aktifkan API publik", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Kunci API Publik", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Lihat dokumentasi", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Ini akan menghapus kunci API lama Anda!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Menghasilkan", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Gunakan API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube API Key", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Menghasilkan kunci itu mudah!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Gunakan Twitch API", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Kunci Twitch API", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Juga dikenal sebagai ID Klien.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Obrolan Download Otomatis", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klik disini", - "7f09776373995003161235c0c8d02b7f91dbc4df": "Untuk mengunduh ekstensi Chrome Bahan YouTubedl resmi secara manual.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Anda harus secara manual memuat ekstensi dan memodifikasi pengaturan ekstensi untuk mengatur URL frontend.", - "9a2ec6da48771128384887525bdcac992632c863": "Untuk menginstal ekstensi Firefox Bahan YouTubedl resmi langsung dari halaman ekstensi Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruksi pengaturan terperinci.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Tidak banyak yang diperlukan selain mengubah pengaturan ekstensi untuk mengatur URL frontend.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Seret tautan di bawah ke bookmark Anda, dan Anda baik-baik saja! Cukup navigasikan ke video YouTube yang ingin Anda unduh, dan klik bookmark.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Buat 'audio hanya' Bookmarklet", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Pilih pengunduh", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Gunakan agen pengunduhan default", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Pilih agen unduhan", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Layar log", - "db6c192032f4cab809aad35215f0aa4765761897": "Login kedaluwarsa", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Izinkan unduhan lanjutan", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Gunakan cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Atur Cookie", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Izinkan pendaftaran pengguna", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Metode Auth", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Gabung DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Mengikat kredensial", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Basis pencarian", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Cari Filter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Tentang YouTubedl-material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "Adalah pengunduh YouTube open-source yang dibangun di bawah spesifikasi desain bahan Google. Anda dapat mengunduh video favorit Anda dengan mulus sebagai file video atau audio, dan bahkan berlangganan saluran dan daftar putar favorit Anda untuk terus diperbarui dengan video baru mereka.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "Memiliki beberapa fitur yang luar biasa termasuk! API yang luas, dukungan Docker, dan dukungan pelokalan (terjemahan). Baca pada semua fitur yang didukung dengan mengklik ikon GitHub di atas.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versi yang diinstal:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Menemukan bug atau punya saran?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "Untuk menciptakan masalah!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Memeriksa pembaruan ...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Pembaruan tersedia", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Anda dapat memperbarui dari menu Pengaturan.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Pilih versi:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Aktifkan berbagi", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Gunakan Timestamp", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Detik", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Menyalin ke clipboard", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Bagikan Daftar Putar", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Berbagi video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Bagikan audio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID Sesi:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Hapus semua unduhan", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(arus)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Tidak ada unduhan yang tersedia!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Profil kamu", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Keluar", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Diciptakan:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Kamu tidak masuk.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Buat Akun Admin", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Tidak ada akun admin default yang terdeteksi. Ini akan membuat dan mengatur kata sandi untuk akun admin dengan nama pengguna sebagai 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Buat", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Tambahkan pengguna", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Edit peran", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nama pengguna", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Peran", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Tindakan", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Kelola pengguna", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Hapus pengguna", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Edit Pengguna", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID pengguna:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Kata sandi baru", - "6498fa1b8f563988f769654a75411bb8060134b9": "Atur kata sandi baru", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Gunakan default peran", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ya", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Tidak", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Kelola peran", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Baris:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Hapus log", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Dihasilkan otomatis", - "ccf5ea825526ac490974336cb5c24352886abc07": "Buka Berkas", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Buka berkas di tab baru", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Menuju ke langganan", - "94e01842dcee90531caa52e4147f70679bac87fe": "Hapus dan unduh ulang", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Hapus selamanya", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Lihat lebih banyak.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Lihat lebih sedikit.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Panjang:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.id.xlf b/src/assets/i18n/messages.id.xlf index fde0f21..cc36167 100644 --- a/src/assets/i18n/messages.id.xlf +++ b/src/assets/i18n/messages.id.xlf @@ -2512,6 +2512,150 @@ Video duration label + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Jika pengaturan ini diaktifkan, saat satu video cocok dengan kategori, seluruh daftar putar akan menerima kategori tersebut. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Share file + Berbagi berkas + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Mulai ulang server + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Informasi basis data tidak dapat diambil. Periksa log server untuk informasi lebih lanjut. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Transfer BD ke + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Uji koneksi string + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Contoh: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + String Koneksi MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Catatan per tabel + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Lokasi basisdata: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Izinkan kategorisasi daftar putar + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Database + Basisdata + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Acak urutan saat memainkan + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Pangkas ke (detik) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Pangkas dari (detik) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Pangkas berkas + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + diff --git a/src/assets/i18n/messages.it.json b/src/assets/i18n/messages.it.json deleted file mode 100644 index 8a79d82..0000000 --- a/src/assets/i18n/messages.it.json +++ /dev/null @@ -1,249 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Crea una scaletta", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nome", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "File audio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modifica i parametri di youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simula i nuovi parametri", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Aggiungi un'impostazione", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Cerca per categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usa valore impostato", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valore impostato", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Aggiungi impostazione", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annulla", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modifica", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualità", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Utilizza URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Visualizza", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Solo audio", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Modalità download multiplo", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Scarica", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Annulla", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avanzato", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Comando simulato:", - "4e4c721129466be9c3862294dc40241b64045998": "Usa parametri personalizzati", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Parametri personalizzati", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Non è necessario includere l'URL, solo ciò che viene dopo. I parametri sono delimitati da due vigole: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usa output personalizzato", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Output personalizzata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentazione", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Il percorso è relativo al percorso di download configurato. Non includere l'estensione.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Utilizza l'autenticazione", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nome utente", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Password", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nome:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Caricato da:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Dimensioni file:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Percorso:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data di caricamento:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Chiudi", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modifica playlist", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Aggiungi più contenuto", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salva", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Conteggio:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Modifica", - "826b25211922a1b46436589233cb6f1a163d89b7": "Elimina", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informazioni", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Elimina e aggiungi alla lista nera", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Carica nuovi cookie", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Trascina e rilascia", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: il caricamento di nuovi cookie sovrascriverà i cookie precedenti. Inoltre tieni presente che i cookie sono a livello di processo, non per utente.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Impostazioni", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL con cui si accederà a questa applicazione, senza porta.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Porta", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Porta personalizzata. La predefinita è 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modalità multiutente", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Percorso profili utente", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Percorso per profili utente e per video scaricati da ognuno.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Consenti iscrizioni", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Percorso salvataggio playlist sottoscritte", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Percorso salvataggio per i video dei canali e delle playlist sottoscritte. È relativo alla cartella principale di YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervallo di verifica", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unità in secondi, inserire solo numeri.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Tema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Predefinito", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Scuro", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Consenti variazione tema", - "fe46ccaae902ce974e2441abe752399288298619": "Lingua", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Principale", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Percorso della cartella audio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Percorso per download solo audio. È relativo alla cartella principale di YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Percorso cartella Video", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Percorso per il download di video. È relativo alla cartella principale di YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Parametri personalizzati generali per i download sulla home page. I parametri sono delimitati da due virgole: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Usa l'archivio youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Includi anteprima", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Includi metadati", - "fb35145bfb84521e21b6385363d59221f436a573": "Interrompi tutti i download", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Scaricato da", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Titolo della barra superiore", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Abilita il file manager", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Abilita il download manager", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Consenti la selezione della qualità", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modalità solo download", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Consenti la modalità di download multiplo", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Abilita l'API Pubblica", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Chiave API Pubblica", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Visualizza la documentazione", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genera", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Cancellerai la tua chiave API precedente!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Usa l'API di YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Chiave API YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Generare una chiave è facile!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Premi qui", - "7f09776373995003161235c0c8d02b7f91dbc4df": "per scaricare manualmente l'estensione ufficiale per Chrome di YoutubeDL-Material.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "È necessario installare manualmente l'estensione e modificarne le impostazioni inserendo l'URL della pagina principale.", - "9a2ec6da48771128384887525bdcac992632c863": "per installare l'estensione ufficiale YoutubeDL-Material per Firefox direttamente dalla pagina delle estensioni di Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Istruzioni dettagliate per la configurazione.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Viene richiesto semplicemente di modificare le impostazioni dell'estensione, inserendo l'URL della pagina principale.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Trascina il link qui sotto tra tuoi preferiti e sei a posto! Vai al video YouTube che desideri scaricare e fai clic sul preferito.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genera un preferito \"solo audio\"", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usa agente di download predefinito", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Seleziona un metodo di download", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Livello di Log", - "db6c192032f4cab809aad35215f0aa4765761897": "Scadenza accesso", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Consenti download avanzato", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usa i cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Imposta i cookie", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avanzate", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Consenti registrazione utente", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Metodo di autenticazione", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Associa DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Associa credenziali", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Base di ricerca", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Filtro di ricerca", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Utenti", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Registri", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, seleziona, vero {Close} falso {Cancel} altro {otha}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Informazioni su YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "è un downloader di YouTube open source costruito secondo le specifiche Material Design di Google. Puoi scaricare agevolmente i tuoi video preferiti come file video o solo audio e persino iscriverti ai tuoi canali e playlist preferiti per tenerti aggiornato con i nuovi video pubblicati.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "ha alcune fantastiche funzionalità incluse! Una solida API, supporto Docker e supporto per la localizzazione (traduzione). Leggi tutte le funzionalità supportate cliccando sull'icona GitHub in alto.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versione installata:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Verifica aggiornamenti in corso...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Aggiornamento disponibile", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "È possibile eseguire l'aggiornamento dal menù impostazioni.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Hai trovato un errore o hai un suggerimento?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "per segnalare un problema!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Il tuo profilo", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Creato:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Non hai eseguito l'accesso.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Accedi", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Esci", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Crea un account amministratore", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Nessun account amministratore predefinito rilevato. Verrà creato e impostata la password per un account amministratore con il nome utente \"admin\".", - "70a67e04629f6d412db0a12d51820b480788d795": "Crea", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profilo", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Informazioni", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Pagina principale", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Iscrizioni", - "822fab38216f64e8166d368b59fe756ca39d301b": "Download", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Condividi playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Condividi il video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Condividi l'audio", - "1f6d14a780a37a97899dc611881e6bc971268285": "Abilita la condivisione", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usa data e ora", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Secondi", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copia negli appunti", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Salva le modifiche", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Il download è riuscito", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Si è verificato un errore", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Dettagli", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Si è verificato un errore:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Inizio download:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Termine download:", - "ad127117f9471612f47d01eae09709da444a36a4": "Percorso(i) file:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Iscriviti alla playlist o al canale", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL della playlist o del canale", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nome personalizzato", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Scarica tutti i file caricati", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Scarica i video caricati negli ultimi", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modalità solo audio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modalità solo streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Questi vengono aggiunti dopo ai parametri standard.", - "98b6ec9ec138186d663e64770267b67334353d63": "File di uscita personalizzato", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Iscriviti", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archivio:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Esporta archivio", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Annulla l'iscrizione", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "I tuoi abbonamenti", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canali", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nome non disponibile. Recupero del canale in corso.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Non sei iscritto a nessun canale.", - "47546e45bbb476baaaad38244db444c427ddc502": "Scalette", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nome non disponibile. Recupero playlist in corso.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Non sei iscritto a nessuna playlist.", - "3697f8583ea42868aa269489ad366103d94aece7": "Modifica", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Cerca", - "2054791b822475aeaea95c0119113de3200f5e1c": "Durata:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Elimina e scarica di nuovo", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Elimina definitivamente", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Aggiornato da", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Seleziona una versione:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrati", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID sessione:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(attuale)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Cancella tutti i download", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Nessun download disponibile!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registra un utente", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nome utente", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gestisci utente", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID utente:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nuova password", - "6498fa1b8f563988f769654a75411bb8060134b9": "Imposta nuova password", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usa il ruolo predefinito", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sì", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "No", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gestisci ruolo", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nome utente", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Ruolo", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Azioni", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Modifica utente", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Elimina utente", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Aggiungi utenti", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Modifica ruolo", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linee:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Cancella i registri", - "ccf5ea825526ac490974336cb5c24352886abc07": "Apri il file", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Apri il file in una nuova scheda", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Vai alle iscrizioni", - "d02888c485d3aeab6de628508f4a00312a722894": "I miei video", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Parametri personalizzati generali", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Nascondi.", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Conosciuto anche come Client ID.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "File output predefinito", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Riscarica i nuovi contenuti", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "A volte i nuovi video vengono scaricati prima di essere completamente elaborati. Questa impostazione significa che per i nuovi video verrà effettuata una verifica il giorno successivo per la ricerca di versioni di qualità superiore.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Vedi altro.", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Generato automaticamente", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Seleziona un agente di download", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Scarica automaticamente le Chat Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Chiave dell'API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usa l'API Twitch", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorie", - "1148fd45287ff09955b938756bc302042bcb29c7": "Il percorso è riferito ai percorsi di download sopra. Non includere l'estensione.", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualizzazioni", - "792dc6a57f28a1066db283f2e736484f066005fd": "Scarica Chat Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Aggiungi nuova regola", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regole", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Categoria in modifica", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "In pausa", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nessun video trovato.", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordine inverso", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordine normale", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Aggiungi contenuto", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(In pausa)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualità massima" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.ko.xlf b/src/assets/i18n/messages.ko.xlf new file mode 100644 index 0000000..eecfa9f --- /dev/null +++ b/src/assets/i18n/messages.ko.xlf @@ -0,0 +1,3082 @@ + + + + + + About + 정보 + + src/app/app.component.html + 32 + + About menu label + + + Profile + 프로필 + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + 다크 모드 + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + 설정 + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + 로그인 + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + 구독 + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + 다운로드 + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + 오디오만 다운로드 + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + 다운로드 + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + 품질 + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + URL 이용 + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + 보기 + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + 복수 다운로드 모드 + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + 취소 + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + 고급 + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + 사용자 지정 인수 이용 + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + 사용자 지정 인수 + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + URL을 포함할 필요가 없습니다. 이후의 모든 항목만 포함하면 됩니다. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + 사용자 지정 출력 사용 + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + 사용자 지정 출력 + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + 문서 + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + 경로는 설정된 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + 파일 자르기 + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + 자르기 시작 지점 (초) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + 자르기 끝 지점 (초) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + 시뮬레이션된 명령: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + 인증 사용 + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + 아이디 + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + 비밀번호 + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + 재생목록 만들기 + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + 제목 + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + 종류 + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + 오디오 + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + 동영상 + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + 오디오 파일 + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + 동영상 + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + 채널 혹은 재생목록 구독 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + 채널 혹은 재생목록 URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + 표시될 이름 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + 업로드 된 모든 파일 다운로드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + 최고 화질 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + 오디오 전용 모드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + 스트리밍 전용 모드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + 이것들은 일반적인 인수 뒤에 추가됩니다. + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + 사용자 지정 파일 출력 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + 취소 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + 구독 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + 마지막으로 업로드된 동영상 다운로드 + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + 종류: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + URL: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + 아이디: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + 닫기 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + 아카이브 내보내기 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + 구독 취소 + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (일시정지) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + 아카이브: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + 제목: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + 업로더: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + 파일 크기: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + 경로: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + 업로드 날짜: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + 카테고리: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + Youtube-dl 인수 수정 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + 시뮬레이션된 새 인수 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + 인수 추가 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + 카테고리로 찾기 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + 인수 값 이용 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + 인수 추가 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + 수정 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + 인수 값 + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + 업데이터 + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + 사용자 등록 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + 아이디 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + 등록 + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + 새 쿠키 업로드 + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + 참고: 새로운 쿠키를 추가하면 이전 쿠키를 덮어씁니다. 또한 쿠키는 사용자 개인이 아닌 전체에 적용됩니다. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + 드래그 앤 드롭 + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + 재생목록 수정 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + 저장 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + 재생시 랜덤 재생 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + 콘텐츠 추가 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + 순서 일반 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + 순서 거꾸로 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + 내 동영상 + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + 검색 + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + 동영상 없음. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + 수정 : + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + 구독 일시정지 + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + 카테고리 수정중 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + 규칙 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + 새로운 규칙 추가 + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + 트위치 채팅 다운로드 + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + 수정 + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + 삭제 + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + 정보 + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + 동영상 수: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + 삭제하고 블랙리스트 추가 + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + 조회수 + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + 성공적으로 다운로드 완료 + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + 에러 발생 + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + 세부사항 + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + 에러 발생: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + 다운로드 시작: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + 다운로드 끝: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + 파일 경로(들): + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + 구독중 + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + 채널 + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + 재생목록 + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + 이름이 유효하지 않음. 채널 검색중. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + 구독중인 채널이 없습니다. + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + 이름이 유효하지 않음. 플레이리스트 검색중. + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + 구독중인 재생목록이 없습니다. + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + 메인 + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + 다운로더 + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + 기타 + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + 데이터베이스 + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + 고급 + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + 사용자 + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + 로그 + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + {VAR_SELECT, select, true {닫다} false {취소} other {기타}} + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + 포트를 제외한 이 앱에 접속할 URL. + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + 포트 + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + 포트 설정. 기본 포트는 17442 입니다. + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + 복수 사용자 모드 + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + 사용자 기본 경로 + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + 사용자와 그들의 동영상 다운로드를 위한 기본 경로. + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + 구독 허용 + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + 구독 기본 경로 + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + 구독된 채널과 재생목록에서 나온 영상들을 위한 기본 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + 확인 간격 + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + 단위는 초이며, 숫자만 넣으세요. + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + 가끔 새 동영상이 최고 화질 처리 전에 다운로드 될 때가 있습니다. 이 설정은 새 동영상이 더 높은 화질의 버전이 있는지 다음 날짜에 확인됨을 의미합니다. + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + 높은 화질 재다운로드 + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + 테마 + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + 기본 + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + 테마 변경 허용 + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + 언어 + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + 오디오 폴더 경로 + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + 오디오 전용 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + 동영상 폴더 경로 + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + 동영상 다운로드 경로. 경로는 YTDL-Material 루트 폴더 경로에 상대적입니다. + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + 기본 파일 출력 + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + 경로는 위의 다운로드 경로에 상대적입니다. 확장자는 포함하지 마세요. + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + 전반적으로 적용될 사용자 지정 인수 + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + 홈페이지에서의 다운로드에 대해 전반적으로 적용될 사용자 지정 인수. 인수는 다음과 같은 두 개의 쉼표를 사용하여 구분됩니다. : ,, + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + 카테고리 + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + 이 설정을 사용하면, 하나의 동영상이 카테고리와 일치할 경우, 전체 재생목록에 해당 카테고리가 표시됩니다. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + 재생목록 카테고리화 허용 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + Youtube-dl 아카이브 사용 + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + 썸네일 포함 + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + 메타데이터 포함 + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + 모든 다운로드 종료 + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + 상위 제목 + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + 파일 매니저 설정됨 + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + 다운로드 매니저 설정됨 + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + 화질 선택 허용 + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + 다운로드 전용 모드 + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + 복수 다운로드 모드 허용 + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + 오픈 API 허용 + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + 오픈 API 키 + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + 문서 보기 + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + 이것은 예전 API키를 지울 것입니다! + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + 생성 + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + 유튜브 API 사용 + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + 유튜브 API 키 + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + 키를 만드는 것은 쉽습니다! + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + 트위치 API 사용 + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + 트위치 API 키 + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + 클라이언트 ID라고도 알려져 있음. + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + 트위치 채팅 자동 다운로드 + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + 이곳을 누르세요 + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + 공식 YoutubeDL-Material 크롬 확장 프로그램을 수동으로 다운로드 하기 위하여. + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + 반드시 확장 프로그램을 수동으로 실행하고 확장 프로그램 설정을 수정하여 프론트엔드 URL을 설정해야 합니다. + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + 파이어폭스 확장 프로그램 페이지에서 바로 공식 YoutubeDL-Material 파이어폭스 확장 프로그램을 설치하기 위하여. + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + 자세한 설정 지침. + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + 프론트엔드 URL을 설정하기 위해 확장 프로그램 설정을 변경하는 것 외에는 필요한 것이 많지 않습니다. + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + 아래 링크를 북마크에 끌어다 놓으시면 됩니다! 이제 그냥 다운로드하고자 하는 유튜브 비디오 페이지에서 북마크를 클릭하면 됩니다. + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + '오디오 전용' 북마크 생성 + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + 데이터베이스 위치: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + 테이블당 레코드 + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + 몽고DB 연결 문자열 + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + 예시: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + 연결 문자열 테스트 + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + DB 전환 : + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + 데이터베이스 정보를 검색할 수 없습니다. 자세한 내용은 서버 로그를 확인하세요. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + 다운로더 선택 + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + 기본 다운로드 에이전트 사용 + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + 다운로드 에이전트 선택 + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + 로그 레벨 + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + 로그인 만료 + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + 고급 다운로드 허용 + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + 쿠키 사용 + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + 쿠키 설정 + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + 서버 재시작 + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + 사용자 등록 허용 + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + 인증 방법 + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + 내부 + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + LDAP URL + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + Bind DN + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + Bind Credentials + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + 기본 검색 + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + 검색 필터 + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + YoutubeDL-Material에 대하여 + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + 은(는) 구글의 Material 디자인 요건에 따라 만들어진 오픈소스 유튜브 다운로더 입니다. 당신이 좋아하는 동영상을 동영상이나 오디오 파일로 원활하게 받을 수 있으며, 심지어 당신이 좋아하는 채널이나 재생목록을 구독해 그들의 새로운 동영상을 지속적으로 업데이트 받아볼 수도 있습니다. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + 은(는) 광범위한 API, 도커 지원, 현지화 (번역) 지원을 포함한 몇몇 엄청난 기능이 포함되어 있습니다! 아래 깃허브 아이콘을 클릭해 지원되는 모든 기능을 확인해보세요. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + 설치된 버전: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + 버그를 찾았거나 제안하실 사항이 있으신가요? + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + 이슈를 생성하기 위하여! + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + 업데이트 확인중... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + 업데이트 가능 + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + 설정 메뉴에서 업데이트를 할 수 있습니다. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + 선택된 버전: + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + 공유 허용 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + 타임스탬프 사용 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + 클립보드에 복사 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + 재생목록 공유 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + 파일 공유 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + 세션 아이디: + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + 모든 다운로드된 항목 지우기 + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + (현재) + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + 다운로드된 항목 없음! + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + 프로필 + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + 로그아웃 + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + 생성됨: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + 로그인하지 않았습니다. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + 관리자 계정 생성 + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + 기본 관리자 계정이 감지되지 않았습니다. 이것은 'admin'이라는 ID를 가진 관리자 계정을 만들고, 비밀번호를 설정할 것입니다. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + 생성 + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + 사용자 추가 + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + 역할 수정 + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + ID + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + 역할 + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + 액션 + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + 사용자 관리 + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + 사용자 삭제 + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + 사용자 수정 + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + 사용자 UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + 새 비밀번호 + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + 새 비밀번호 설정 + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + 기본 역할 사용 + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + 아니오 + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + 역할 관리 + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + 줄: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + 로그 지우기 + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + 자동으로 생성됨 + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + 파일 열기 + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + 새 탭에서 파일 열기 + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + 구독중으로 가기 + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + 삭제하고 재다운로드 + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + 영원히 삭제 + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + 더 보기. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + 간략히 보기. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + 길이: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + Both + 전체 + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Skip ad + 광고 스킵 + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Add to playlist + 재생목록에 추가 + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Clear finished downloads + 완료된 다운로드 기록 삭제 + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Resume all downloads + 모든 다운로드 재개 + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + 모든 다운로드 일시정지 + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + 재시작 + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Show error + 에러 보기 + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Watch content + 콘텐츠 재생 + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Resume + 재개 + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause + 일시정지 + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Clear + 삭제 + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Actions + 액션 + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Progress + 진행 + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Stage + 상태 + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Subscription + 구독 + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Title + 제목 + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Date + 날짜 + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Copied to clipboard! + 클립보드에 복사됨! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Close + 닫기 + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copy to clipboard + 클립보드에 복사 + + src/app/components/downloads/downloads.component.ts + 240 + + + + Error for + 에 대한 에러 + + src/app/components/downloads/downloads.component.ts + 238 + + + + Clear + 삭제 + + src/app/components/downloads/downloads.component.ts + 131 + + + + Would you like to clear your finished downloads? + 완료된 다운로드 기록을 삭제하고 싶으신가요? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear finished downloads + 완료된 다운로드 기록 삭제 + + src/app/components/downloads/downloads.component.ts + 129 + + + + Complete + 완료 + + src/app/components/downloads/downloads.component.ts + 61 + + + + Downloading file + 파일 다운로드 중 + + src/app/components/downloads/downloads.component.ts + 60 + + + + Getting info + 정보 가져오는 중 + + src/app/components/downloads/downloads.component.ts + 59 + + + + Creating download + 다운로드 생성 중 + + src/app/components/downloads/downloads.component.ts + 58 + + + + Docker tag: + 도커 태그: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Build date: + 빌드 날짜: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Commit hash: + 커밋 해시: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Installation type: + 설치 타입: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Generate NFO files + NFO 파일 생성 + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Kodi에 의해 주로 사용되는 NFO 파일을 모든 다운로드에 대해 생성합니다. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + SponsorBlock API 사용 + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + 동영상을 시청할 때 광고 스킵 버튼을 활성화합니다. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + 자동 재생 허용 + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + 다운로드 속도를 지정된 값으로 제한합니다. 예시: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + 다운로드 속도 제한 + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + 동시에 다운로드할 수 있는 다운로드 양을 제한합니다. 제한하지 않으려면 -1을 쓰세요. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + 최대 동시 다운로드수 + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + You must enable multi-user mode to access this tab. + 이 페이지에 들어오려면 복수 사용자 모드를 활성화해야 합니다. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + 오디오만 + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + 동영상만 + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + File type + 파일 종류 + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Replace args + 전체 인수 교체 + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + 자동 재생 + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + 에 대한 다운로드가 대기열에 추가되었습니다! + + src/app/main/main.component.ts + 469 + + + + + diff --git a/src/assets/i18n/messages.mk.xlf b/src/assets/i18n/messages.mk.xlf new file mode 100644 index 0000000..66cfc31 --- /dev/null +++ b/src/assets/i18n/messages.mk.xlf @@ -0,0 +1,3040 @@ + + + + + + About + За апликацијата + + src/app/app.component.html + 32 + + About menu label + + + Profile + Профил + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + Темна Тема + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 67 + + Dark mode toggle label + + + Home + Почетна + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + Најавување + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 34 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + Претплати + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + Превземања + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Settings + Подесувања + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + Превземањето за е ставено во редицата за чекање! + + src/app/main/main.component.ts + 469 + + + + Only Audio + Само Аудио + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + Превземи + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + Квалитет + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + Користи URL + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + Прегледај + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Autoplay + Автоматска репродукција + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Cancel + Откажи + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + Напредно + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + Користи персонализирани аргументи + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Replace args + Замени аргументи + + src/app/main/main.component.html + 116,117 + + Replace args + + + Custom args + Персонализирани аргументи + + src/app/main/main.component.html + 120 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Нема потреба од URL, само се после него. Аргументите се раздалечени со две запирки: ,, + + src/app/main/main.component.html + 123,124 + + Custom Args input hint + + + Use custom output + Користи персонализиран output + + src/app/main/main.component.html + 131,132 + + Use custom output checkbox + + + Custom output + Персонализиран output + + src/app/main/main.component.html + 135 + + Custom output placeholder + + + Documentation + Документација + + src/app/main/main.component.html + 137 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 117 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + Патеката е релативна на патеката за превземања. Не користете екстензија. + + src/app/main/main.component.html + 138 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + Исечи го видеото + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Simulated command: + Симулирана команда: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + Користи автентикација + + src/app/main/main.component.html + 145,146 + + Use authentication checkbox + + + Username + Корисничко име + + src/app/main/main.component.html + 149 + + YT Username placeholder + + + Password + Лозинка + + src/app/main/main.component.html + 154 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Crop from (seconds) + Сечи од (секунди) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + Сечи до (секунди) + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Create a playlist + Креирај плејлиста + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + Име + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + Вид + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + Аудио + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + Видео + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + Аудио фајлови + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + Видео фајлови + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + Претплати се на плејлиста или канал + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 10 + + Subscription URL input placeholder + + + The playlist or channel URL + URL од плејлиста или канал + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + Персонализирано име + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + Превземи ја цела содржина + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + MAX Квалитет + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + Режим само за Аудио + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + Режим само за стриминг + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + Овие се додаваат после стандардните аргументи. + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + Персонализиран output + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + Откажи + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + Претплати се + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + Превземи ги само најновите видеа + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + Вид: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + URL: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + ID: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + Затвори + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + Експортирај Архива + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + Отпишете се + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (Паузирано) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + Архива: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + Име: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + Уплоадер: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + Големина на фајлот: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + Патека: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + Дата на прикачување: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + Категорија: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + Измени ги аргументите за youtube-dl + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + Симулирани нови аргументи + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + Додади аргумент + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + Пребарај по категорија + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + Користи ја вредноста на аргументот + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + Додади аргумент + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + Измени + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + Вредност на аргумент + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + Ажурирач + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + Регистрирај корисник + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + Корисничко име + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + Регистрирај + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 38 + + Register user button + + + Upload new cookies + Прикачи нови колачиња + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + ЗАБЕЛЕШКА: Со прикачување на нови колачиња, ќе ги изгубете старите. Исто така, колачињата се глобални, а не по корисник. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + Повлечи и Пушти + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + Измени плејлиста + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + Зачувај + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 487 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + Рандом редослед + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + Додади содржини + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + Нормален редослед + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + Обратен редослед + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + Мој Видеа + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + Пребарај + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + File type + Вид на фајл + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + Заедно + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + Само видео + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + Само аудио + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + No videos found. + Не се пронајдени видеа. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + Уредување + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + Паузирано + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + Уредување на категорија + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + Правила + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + Додади ново правило + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + Превземи Twitch Chat + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + Измени + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button + + + Delete + Избриши + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete playlist + + + Info + Инфо + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + Број: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + Избриши и додади на црна листа + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + views + прегледи + + src/app/player/player.component.html + 16 + + View count label + + + The download was successful + Превземањето е успешно + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + Настана грешка + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + Детали + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + Настана грешка: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + Почеток на превземање: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + Завршеток на превземање: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + Патека(и) за фајлови: + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + Вашите претплати + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + Канали + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + Плејлисти + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + Името не е достапно. Вчитувањето на каналот е во тек. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + Немате претплати за канали. + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + Името не е достапно. Вчитувањето на плејлистата е во тек. + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + Немате претплати за плејлисти. + + src/app/subscriptions/subscriptions.component.html + 46 + + No playlist subscriptions text + + + You must enable multi-user mode to access this tab. + Мора да го вклучето мулти-корисничкиот режим за да имате пристап до овој таб. + + src/app/settings/settings.component.ts + 48 + + + + Main + Главно + + src/app/settings/settings.component.html + 4 + + Main settings label + + + Downloader + Превземач + + src/app/settings/settings.component.html + 94 + + Downloader settings label + + + Extra + Дополнително + + src/app/settings/settings.component.html + 198 + + Extra settings label + + + Database + База со податоци + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Advanced + Напредно + + src/app/settings/settings.component.html + 339 + + Host settings label + + + Logs + Логови + + src/app/settings/settings.component.html + 476 + + + src/app/settings/settings.component.html + 476 + + Logs settings label + + + URL this app will be accessed from, without the port. + URL за пристап до апликацијата, без port број. + + src/app/settings/settings.component.html + 11 + + URL setting input hint + + + Port + Port број + + src/app/settings/settings.component.html + 16 + + Port input placeholder + + + The desired port. Default is 17442. + Посакуваниот port број. Стандардно е 17442. + + src/app/settings/settings.component.html + 17 + + Port setting input hint + + + Multi-user mode + Мулти-Корисничи режим + + src/app/settings/settings.component.html + 26 + + Multi user mode setting + + + Users base path + Основна патека за корисниците + + src/app/settings/settings.component.html + 30 + + Users base path placeholder + + + Base path for users and their downloaded videos. + Основна патека за корисниците и нивните превземања. + + src/app/settings/settings.component.html + 31 + + Users base path hint + + + Allow subscriptions + Овозможете претплати + + src/app/settings/settings.component.html + 40 + + Allow subscriptions setting + + + Subscriptions base path + Основна патека за претплати + + src/app/settings/settings.component.html + 44 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + Основна патека за видеа од вашите претплатени канали и плејлисти. Релативна е на главниот фолдер за YTDL-Material. + + src/app/settings/settings.component.html + 45 + + Subscriptions base path setting input hint + + + Check interval + Интервал за проверка + + src/app/settings/settings.component.html + 50 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + Единицата е секунди, внесете само броеви. + + src/app/settings/settings.component.html + 51 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + Понекогаш новите видеа се превземани пред да бидат целосно процесирани. Оваа опција, доколку е активна, наредниот ден ке провери дали има верзија од видеото со повисок квалитет. + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + Повторно превземање на најновите прикачувања + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads + + + Theme + Тема + + src/app/settings/settings.component.html + 64 + + Theme select label + + + Default + Стандардно + + src/app/settings/settings.component.html + 66 + + Default theme label + + + Allow theme change + Дозволете промена на тема + + src/app/settings/settings.component.html + 72 + + Allow theme change setting + + + Language + Јазик + + src/app/settings/settings.component.html + 81 + + Language select label + + + Audio folder path + Патека за аудио фајловите + + src/app/settings/settings.component.html + 101 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + Патека за превземањата само со аудио. Релативна е на главната патека за YTDL-Material. + + src/app/settings/settings.component.html + 102 + + Aduio path setting input hint + + + Video folder path + Патека за видео фајловите + + src/app/settings/settings.component.html + 108 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + Патека за превземените видеа. Релативна е на главната патека за YTDL-Material. + + src/app/settings/settings.component.html + 109 + + Video path setting input hint + + + Default file output + Стандарден фајл output + + src/app/settings/settings.component.html + 115 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + Патеката е релативна на патеките за превземања од опциите погоре. Не внесувајте екстензија. + + src/app/settings/settings.component.html + 118 + + Custom Output input hint + + + Global custom args + Глобални персонализирани аргументи + + src/app/settings/settings.component.html + 125 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + Глобални персонализирани аргументи за превземања на почетната страна. Аргументите се раздалечени со две запирки: ,, + + src/app/settings/settings.component.html + 126 + + Custom args setting input hint + + + Categories + Категории + + src/app/settings/settings.component.html + 136 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Со оваа опција активна, ако едно видео спадне во одредена категорија, целата плејлиста ќе биде додадена во истата категорија. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + Дозволете категоризација на плејлисти + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Use youtube-dl archive + Користи ја опцијата за архивирање на youtube-dl + + src/app/settings/settings.component.html + 158 + + Use youtubedl archive setting + + + Include thumbnail + Вклучи превземање на мини-слика + + src/app/settings/settings.component.html + 162 + + Include thumbnail setting + + + Include metadata + Вклучи превземата на метадата + + src/app/settings/settings.component.html + 166 + + Include metadata setting + + + Max concurrent downloads + Максимален број на истовремени превземања + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Го лимитира бројот на истовремени превземања. Внесете -1 за да го тргнете лимитот. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + Ограничување на брзината за превземање + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + Ја лимитира брзината за превземање. Пр. 200К + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Kill all downloads + Запри ги сите превземања + + src/app/settings/settings.component.html + 191 + + Kill all downloads button + + + Top title + Наслов за почетната страна + + src/app/settings/settings.component.html + 204 + + Top title input placeholder + + + File manager enabled + Вклучете го менаџерот за фајлови + + src/app/settings/settings.component.html + 209 + + File manager enabled setting + + + Downloads manager enabled + Вклучете го менаџерот за превземања + + src/app/settings/settings.component.html + 212 + + Downloads manager enabled setting + + + Allow quality select + Дозволете избор на квалитет + + src/app/settings/settings.component.html + 215 + + Allow quality seelct setting + + + Download only mode + Режим само за превземање + + src/app/settings/settings.component.html + 218 + + Download only mode setting + + + Allow autoplay + Дозволете автоматска репродукција + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enable Public API + Вклучете го јавниот API + + src/app/settings/settings.component.html + 229 + + Enable Public API key setting + + + Public API Key + Јавен API клуч + + src/app/settings/settings.component.html + 234 + + Public API Key setting placeholder + + + View documentation + Прегледај ја документацијата + + src/app/settings/settings.component.html + 235 + + View API docs setting hint + + + This will delete your old API key! + Ова ќе го избрише вашиот стар API клуч! + + src/app/settings/settings.component.html + 239 + + delete api key tooltip + + + Generate + Генерирај + + src/app/settings/settings.component.html + 239 + + Generate key button + + + Use YouTube API + Користете го API на YouTube + + src/app/settings/settings.component.html + 248 + + Use YouTube API setting + + + Youtube API Key + YouTube API клуч + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting placeholder + + + Generating a key is easy! + Генерирањето на клуч е лесно! + + src/app/settings/settings.component.html + 253 + + + src/app/settings/settings.component.html + 265 + + Youtube API Key setting hint + + + Use Twitch API + Користете го API на Twitch + + src/app/settings/settings.component.html + 257 + + Use Twitch API setting + + + Twitch API Key + Twitch API клуч + + src/app/settings/settings.component.html + 264 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + Клучот може да биде прикажан како Client ID. + + src/app/settings/settings.component.html + 265 + + Twitch API Key setting hint AKA preamble + + + Enables a button to skip ads when viewing supported videos. + Овозможете опција за прескокнување на реклами, доклоку видеото е подржано. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + Користете го API на SponsorBlock + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + Генерирај NFO фајлови за секое превземање, во главно се користат од Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + Генерирај NFO фајлови + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Auto-download Twitch Chat + Автоматско превземање на Twitch Chat + + src/app/settings/settings.component.html + 260 + + Auto download Twitch Chat setting + + + Click here + Кликнете овде + + src/app/settings/settings.component.html + 281 + + + src/app/settings/settings.component.html + 287 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + за да ја превземете официјалната YoutubeDL-Material екстензија за Chrome. + + src/app/settings/settings.component.html + 281 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + Екстензијата мора да се инсталира мануелно и да се изменат поставките за да се постави URL-линкот до апликацијата. + + src/app/settings/settings.component.html + 282 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + за да ја инсталирате официјалната YoutubeDL-Material екстензија за Firefox, директно од страницата за екстензии на Firefox. + + src/app/settings/settings.component.html + 287 + + Firefox click here suffix + + + Detailed setup instructions. + Детални упатства за инсталирање. + + src/app/settings/settings.component.html + 288 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + Треба само да се изменат подесувањата за URL-линкот до апликацијата. + + src/app/settings/settings.component.html + 288 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + Само повлечето го линкот подоле во вашите обележувачи! Само одете до видеото на YouTube што сакате да го превземете и кликнете на обележувачот. + + src/app/settings/settings.component.html + 293 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + Генерирај обележувач за превземање само на аудио + + src/app/settings/settings.component.html + 294 + + Generate audio only bookmarklet checkbox + + + Database location: + Локација на базата со податоци: + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + Податоци по табела + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + Линк за поврзување со MongoDB + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + Пример: + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + Тестирај го линкот за конекцијата + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Transfer DB to + Префрли ја базата со податоци во + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + Информациите за базата со податоци не може да се превземат. Проверете ги логовите на серверот за повеќе информации. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Select a downloader + Изберете превземач + + src/app/settings/settings.component.html + 345 + + Default downloader select label + + + Use default downloading agent + Користете го стандардниот агент за превземање + + src/app/settings/settings.component.html + 354 + + Use default downloading agent setting + + + Select a download agent + Селектирај агент за превземање + + src/app/settings/settings.component.html + 358 + + Custom downloader select label + + + Log Level + Ниво за снимање на логови + + src/app/settings/settings.component.html + 372 + + Log Level label + + + Login expiration + Истекување на најавената сесија + + src/app/settings/settings.component.html + 384 + + Login expiration select label + + + Allow advanced download + Овозможи напредни превземања + + src/app/settings/settings.component.html + 395 + + Allow advanced downloading setting + + + Use Cookies + Користи колачиња + + src/app/settings/settings.component.html + 403 + + Use cookies setting + + + Set Cookies + Постави колачиња + + src/app/settings/settings.component.html + 404 + + Set cookies button + + + Restart server + Рестарт на серверот + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Users + Корисници + + src/app/settings/settings.component.html + 425 + + Users settings label + + + Allow user registration + Овозможи регистрација на корисници + + src/app/settings/settings.component.html + 431 + + Allow registration setting + + + Auth method + Метод за автентикација + + src/app/settings/settings.component.html + 435 + + Auth method select + + + Internal + Внатрешен + + src/app/settings/settings.component.html + 437 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 440 + + LDAP auth method + + + LDAP URL + LDAP URL + + src/app/settings/settings.component.html + 447 + + LDAP URL + + + Bind DN + Bind DN + + src/app/settings/settings.component.html + 452 + + Bind DN + + + Bind Credentials + Bind Credentials + + src/app/settings/settings.component.html + 457 + + Bind Credentials + + + Search Base + Search Base + + src/app/settings/settings.component.html + 462 + + Search Base + + + Search Filter + Филтер за пребарување + + src/app/settings/settings.component.html + 467 + + Search Filter + + + About YoutubeDL-Material + За YoutubeDL-Material + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + е превземач за YouTube со отворен код изграден според спецификациите на Google за материјалн дизајн. Можете без проблем да ги превземате вашите омилени видеа, како видео или аудио фајлови, па дури и да се претплатите на вашите омилени канали и плејлисти за да бидете во тек со нивните нови видеа. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + има вклучено неколку одлични карактеристики! Одличен API, поддршка за Docker и поддршка за локализација (превод). Прочитајте ги сите поддржани карактеристики со кликнување на иконата GitHub погоре. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + Инсталирана верзија: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Installation type: + Вид на инсталација: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + Commit hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + Датум на градење: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + Пронајдовте проблем или имате предлог? + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + to create an issue! + за да креирате тикет! + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Checking for updates... + Се проверува за ажурирања ... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + Достапно ажурирање + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + Може да ажурирате од менито за поставки. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Docker tag: + Docker ознака: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Select a version: + Селектирај верзија: + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + Овозможи споделување + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + Користи временски печат + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + Секунди + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + Копирај во clipboard + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + Сподели плејлиста + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + Сподели видео + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + Создавање на превземање + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + Добивање информации + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Превземање на фајл + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + Завршено + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Исчисти ги завршените превземања + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Дали сакате да ги исчистите завршените превземања? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + Исчисти + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Грешка за + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + Копирај во clipboard + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + Затвори + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + Копирано во clipboard! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Дата + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + Наслов + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + Претплата + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Фаза + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + Прогрес + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Акции + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Исчисти + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Пауза + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + Продолжи + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + Репродукција на содржина + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + Прикажи грешка + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Рестарт + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + Паузирај ги сите превземања + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + Продолжи ги сите превземања + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Исчисти ги завршените превземања + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + Нема достапни превземања! + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Your Profile + Вашиот профил + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + Одјави се + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + Креирано: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + Не сте најавени. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + Креирај профил за администратор + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + Не е откриен стандарден администраторски профил. Ова ќе создаде администраторски профил со ID 'admin' и ќе постави лозинка. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + Креирај + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + Додади корисници + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + Измени ги улогите + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + Корисничко име + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + Улога + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + Акции + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + Управување со корисници + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + Избриши корисник + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + Измени корисник + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + UID на корисник: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + Нова лозинка + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + Постави нова лозинка + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + Користи стандардни улоги + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + Да + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + Не + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + Управување со улоги + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + Линии: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + Исчисти ги логовите + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + Автоматски генериран + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + Отвори фајл + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + Отвори фајл во нов таб + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + Одете во Претплата + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + Додади во плејлиста + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + Избриши и повторно превземи + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + Избриши засекогаш + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + Види повеќе. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + Види помалку. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Skip ad + Прескокни реклама + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Length: + Времетраење: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + diff --git a/src/assets/i18n/messages.nb-NO.xlf b/src/assets/i18n/messages.nb-NO.xlf new file mode 100644 index 0000000..4f8218a --- /dev/null +++ b/src/assets/i18n/messages.nb-NO.xlf @@ -0,0 +1,2889 @@ + + + + + + About + Om + + src/app/app.component.html + 32 + + About menu label + + + Profile + Profil + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + Mørk + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 75 + + Dark mode toggle label + + + Settings + Innstillinger + + src/app/app.component.html + 28 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Home + Hjem + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + Logg inn + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 15 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + Abonnementer + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + Nedlastinger + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Only Audio + Kun lyd + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + Last ned + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + Kvalitet + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + Bruk nettadresse + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + Vis + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Multi-download Mode + Multi-nedlastingsmodus + + src/app/main/main.component.html + 70,71 + + Multi-download Mode checkbox + + + Cancel + Avbryt + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + Avansert + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + Bruk egendefinerte argumenter + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Custom args + Egendefinerte argumenter + + src/app/main/main.component.html + 115 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter inndeles med to komma, slik: ,, + + src/app/main/main.component.html + 118,119 + + Custom Args input hint + + + Use custom output + Bruk egendefinert utdata + + src/app/main/main.component.html + 126,127 + + Use custom output checkbox + + + Custom output + Egendefinert utdata + + src/app/main/main.component.html + 130 + + Custom output placeholder + + + Documentation + Dokumentasjon + + src/app/main/main.component.html + 132 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 125 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + + + src/app/main/main.component.html + 133 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + Beskjær fil + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Crop from (seconds) + Beskjær fra (sekunder) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop to (seconds) + Beskjær til (sekunder) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Simulated command: + Simulert kommando: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + Bruk identitetsbekreftelse + + src/app/main/main.component.html + 140,141 + + Use authentication checkbox + + + Username + Brukernavn + + src/app/main/main.component.html + 144 + + YT Username placeholder + + + Password + Passord + + src/app/main/main.component.html + 149 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Create a playlist + Opprett en spilleliste + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + Navn + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + Type + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + Lyd + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + Video + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + Lydfiler + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + Videoer + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + Abonner på spilleliste eller kanal + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + Nettadresse + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 18 + + Subscription URL input placeholder + + + The playlist or channel URL + Spillelistens eller kanalens nettadresse + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + Egendefinert navn + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + Last ned alle opplastninger + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + Maksimal kvalitet + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + «Kun lyd»-modus + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + «Kun strømming»-modus + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + Egendefinert filutdata + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + Avbryt + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + Abonner + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + Type: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + Nettadresse: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + ID: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + Lukk + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 59 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + Eksporter arkiv + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + Opphev abonnement + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (Pauset) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 31 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + Arkiv: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + Navn: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + Opplaster: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + Filstørrelse: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + Sti: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + Opplastingsdato: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + Kategori: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + Endre youtube-dl-argumenter + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + Søk etter kategori + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + Bruk argument-verdi + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + Legg til argument + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + Endre + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + Argument-verdi + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + Registrer en bruker + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + Brukernavn + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 35 + + Register user button + + + Upload new cookies + Last opp nye kaker + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + Dra og slipp + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + Endre spilleliste + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + Lagre + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 464 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + Legg til innhold + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + Normal rekkefølge + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + Omvendt rekkefølge + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + Mine videoer + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + Søk + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + No videos found. + Fant ingen videoer. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + Pauset + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + Redigerer kategori + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + Regler + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + Legg til ny regel + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + Last ned Twitch-sludring + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + Rediger + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + Playlist edit button + + + Delete + Slett + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 33 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + Delete playlist + + + Info + Info + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + Antall: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + Slett og svartelist + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + Delete and blacklist video button + + + views + visninger + + src/app/player/player.component.html + 15 + + View count label + + + The download was successful + Nedlastet + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + En feil oppstod + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + Detaljer + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + En feil har oppstått: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + Nedlastingsstart: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + Nedlastingsslutt: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + Filsti(er): + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + Dine abonnementer + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + Kanaler + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + Spillelister + + src/app/subscriptions/subscriptions.component.html + 27 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + Du har ingen kanalabonnementer. + + src/app/subscriptions/subscriptions.component.html + 24 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + Navn er ikke tilgjengelig. Spillelistemottak underveis … + + src/app/subscriptions/subscriptions.component.html + 33 + + Subscription playlist not available text + + + You have no playlist subscriptions. + Du har ingen spillelisteabonnementer. + + src/app/subscriptions/subscriptions.component.html + 43 + + No playlist subscriptions text + + + Main + + + src/app/settings/settings.component.html + 12 + + Main settings label + + + Downloader + Nedlaster + + src/app/settings/settings.component.html + 102 + + Downloader settings label + + + Extra + Ekstra + + src/app/settings/settings.component.html + 185 + + Extra settings label + + + Database + Database + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Advanced + Avansert + + src/app/settings/settings.component.html + 320 + + Host settings label + + + Users + Brukere + + src/app/settings/settings.component.html + 403 + + + src/app/settings/settings.component.html + 403 + + Users settings label + + + Logs + Logger + + src/app/settings/settings.component.html + 451 + + + src/app/settings/settings.component.html + 451 + + Logs settings label + + + {VAR_SELECT, select, true {Close} false {Cancel} other {otha}} + + + src/app/settings/settings.component.html + 467 + + Settings cancel and close button + + + URL this app will be accessed from, without the port. + + + src/app/settings/settings.component.html + 19 + + URL setting input hint + + + Port + Port + + src/app/settings/settings.component.html + 24 + + Port input placeholder + + + The desired port. Default is 17442. + Foretrukket port. Forvalget er 17442. + + src/app/settings/settings.component.html + 25 + + Port setting input hint + + + Multi-user mode + Multibrukermodus + + src/app/settings/settings.component.html + 34 + + Multi user mode setting + + + Users base path + + + src/app/settings/settings.component.html + 38 + + Users base path placeholder + + + Base path for users and their downloaded videos. + + + src/app/settings/settings.component.html + 39 + + Users base path hint + + + Allow subscriptions + Tillat abonnementer + + src/app/settings/settings.component.html + 48 + + Allow subscriptions setting + + + Subscriptions base path + + + src/app/settings/settings.component.html + 52 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 53 + + Subscriptions base path setting input hint + + + Check interval + + + src/app/settings/settings.component.html + 58 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + + + src/app/settings/settings.component.html + 59 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + + + src/app/settings/settings.component.html + 63 + + Redownload fresh uploads + + + Theme + + + src/app/settings/settings.component.html + 72 + + Theme select label + + + Default + Forvalg + + src/app/settings/settings.component.html + 74 + + Default theme label + + + Allow theme change + Tillat draktendring + + src/app/settings/settings.component.html + 80 + + Allow theme change setting + + + Language + Språk + + src/app/settings/settings.component.html + 89 + + Language select label + + + Audio folder path + Lydmappesti + + src/app/settings/settings.component.html + 109 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 110 + + Aduio path setting input hint + + + Video folder path + Videomappesti + + src/app/settings/settings.component.html + 116 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + + + src/app/settings/settings.component.html + 117 + + Video path setting input hint + + + Default file output + + + src/app/settings/settings.component.html + 123 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + + + src/app/settings/settings.component.html + 126 + + Custom Output input hint + + + Global custom args + + + src/app/settings/settings.component.html + 133 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + + + src/app/settings/settings.component.html + 134 + + Custom args setting input hint + + + Categories + Kategorier + + src/app/settings/settings.component.html + 144 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + Tillat spillelistekategorisering + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + Use youtube-dl archive + Bruk youtube-dl-arkivet + + src/app/settings/settings.component.html + 166 + + Use youtubedl archive setting + + + Include thumbnail + Inkluder miniatyrbilde + + src/app/settings/settings.component.html + 170 + + Include thumbnail setting + + + Include metadata + Inkluder metadata + + src/app/settings/settings.component.html + 174 + + Include metadata setting + + + Kill all downloads + Drep alle nedlastinger + + src/app/settings/settings.component.html + 178 + + Kill all downloads button + + + Top title + Topptittel + + src/app/settings/settings.component.html + 191 + + Top title input placeholder + + + File manager enabled + + + src/app/settings/settings.component.html + 196 + + File manager enabled setting + + + Downloads manager enabled + + + src/app/settings/settings.component.html + 199 + + Downloads manager enabled setting + + + Allow quality select + Tillat valg av kvalitet + + src/app/settings/settings.component.html + 202 + + Allow quality seelct setting + + + Download only mode + + + src/app/settings/settings.component.html + 205 + + Download only mode setting + + + Allow multi-download mode + + + src/app/settings/settings.component.html + 208 + + Allow multi-download mode setting + + + Enable Public API + Skru på offentlig API + + src/app/settings/settings.component.html + 216 + + Enable Public API key setting + + + Public API Key + Nøkkel for offentlig API + + src/app/settings/settings.component.html + 221 + + Public API Key setting placeholder + + + View documentation + Vis dokumentasjon + + src/app/settings/settings.component.html + 222 + + View API docs setting hint + + + This will delete your old API key! + Dette vil slette din gamle API-nøkkel. + + src/app/settings/settings.component.html + 226 + + delete api key tooltip + + + Generate + Generer + + src/app/settings/settings.component.html + 226 + + Generate key button + + + Use YouTube API + Bruk YouTube-API + + src/app/settings/settings.component.html + 235 + + Use YouTube API setting + + + Youtube API Key + API-nøkkel for YouTube + + src/app/settings/settings.component.html + 239 + + Youtube API Key setting placeholder + + + Generating a key is easy! + Generering av nøkkel er enkelt. + + src/app/settings/settings.component.html + 240 + + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting hint + + + Use Twitch API + Bruk Twitch-API + + src/app/settings/settings.component.html + 244 + + Use Twitch API setting + + + Twitch API Key + API-nøkkel for Twitch + + src/app/settings/settings.component.html + 251 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + Også kjent som «klient-ID». + + src/app/settings/settings.component.html + 252 + + Twitch API Key setting hint AKA preamble + + + Auto-download Twitch Chat + + + src/app/settings/settings.component.html + 247 + + Auto download Twitch Chat setting + + + Click here + Klikk her + + src/app/settings/settings.component.html + 262 + + + src/app/settings/settings.component.html + 268 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + + + src/app/settings/settings.component.html + 262 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 263 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + + + src/app/settings/settings.component.html + 268 + + Firefox click here suffix + + + Detailed setup instructions. + + + src/app/settings/settings.component.html + 269 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + + + src/app/settings/settings.component.html + 269 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + + + src/app/settings/settings.component.html + 274 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + + + src/app/settings/settings.component.html + 275 + + Generate audio only bookmarklet checkbox + + + Database location: + + + src/app/settings/settings.component.html + 290 + + Database location label + + + Records per table + + + src/app/settings/settings.component.html + 291 + + Records per table label + + + MongoDB Connection String + + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Example: + Eksempel: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Transfer DB to + Overfør database til + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Select a downloader + Velg en nedlaster + + src/app/settings/settings.component.html + 326 + + Default downloader select label + + + Use default downloading agent + Bruk forvalgt nedlastingsagent + + src/app/settings/settings.component.html + 335 + + Use default downloading agent setting + + + Select a download agent + Velg en nedlastingsagent + + src/app/settings/settings.component.html + 339 + + Custom downloader select label + + + Log Level + Loggføringsnivå + + src/app/settings/settings.component.html + 353 + + Log Level label + + + Login expiration + Innloggingsutløp + + src/app/settings/settings.component.html + 365 + + Login expiration select label + + + Allow advanced download + Tillat avansert nedlasting + + src/app/settings/settings.component.html + 376 + + Allow advanced downloading setting + + + Use Cookies + Bruk kaker + + src/app/settings/settings.component.html + 384 + + Use cookies setting + + + Set Cookies + Sett kaker + + src/app/settings/settings.component.html + 385 + + Set cookies button + + + Restart server + Utfør omstart av tjener + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Allow user registration + Tillat brukerregistrering + + src/app/settings/settings.component.html + 407 + + Allow registration setting + + + Auth method + Identitetbekreftelsesmetode + + src/app/settings/settings.component.html + 411 + + Auth method select + + + Internal + Intern + + src/app/settings/settings.component.html + 413 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 416 + + LDAP auth method + + + LDAP URL + LDAP-nettadresse + + src/app/settings/settings.component.html + 423 + + LDAP URL + + + Bind DN + + + src/app/settings/settings.component.html + 428 + + Bind DN + + + Bind Credentials + + + src/app/settings/settings.component.html + 433 + + Bind Credentials + + + Search Base + + + src/app/settings/settings.component.html + 438 + + Search Base + + + Search Filter + + + src/app/settings/settings.component.html + 443 + + Search Filter + + + About YoutubeDL-Material + Om mateirell YouTube-DL + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + Installert versjon: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Found a bug or have a suggestion? + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug prefix + + + to create an issue! + + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + About bug suffix + + + Checking for updates... + + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Select a version: + + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + Bruk tidsstempel + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + Sekunder + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + Kopier til utklippstavle + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + Del spilleliste + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + Del fil + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Session ID: + Økts-ID: + + src/app/components/downloads/downloads.component.html + 5 + + Session ID + + + Clear all downloads + Tøm alle nedlastninger + + src/app/components/downloads/downloads.component.html + 18 + + clear all downloads action button + + + (current) + (nåværende) + + src/app/components/downloads/downloads.component.html + 6 + + Current session + + + No downloads available! + + + src/app/components/downloads/downloads.component.html + 25 + + No downloads label + + + Your Profile + Din profil + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + Logg ut + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + Opprettet: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + Du er ikke innlogget. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + Opprett administratorkonto + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + Opprett + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + Legg til brukere + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + Rediger rolle + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + Brukernavn + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + Rolle + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + Handlinger + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + Håndter bruker + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + Slett bruker + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + Rediger bruker + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + Bruker-UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + Nytt passord + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + Sett nytt passord + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + Bruk folleforvalg + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + Ja + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + Nei + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + Håndter rolle + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + Linjer: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + Tøm logger + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + Auto-generert + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + Åpne fil + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + Åpne fil i ny fane + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + Gå til abonnement + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Delete and redownload + Slett og last ned igjen + + src/app/components/unified-file-card/unified-file-card.component.html + 28 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + Slett for godt + + src/app/components/unified-file-card/unified-file-card.component.html + 31 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + Vis mer. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + Vis mindre. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Length: + Lengde: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + Autoplay + Spill automatisk + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Replace args + Erstatt argumenter + + src/app/main/main.component.html + 116,117 + + Replace args + + + Max concurrent downloads + Maks. samtidige nedlastinger + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Date + Dato + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Progress + Framdrift + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Handlinger + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + Tøm + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + Pause + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + Fortsett + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Add to playlist + Legg til i spilleliste + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Resume all downloads + Fortsett alle nedlastinger + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Download for has been queued! + Nedlasting for har blitt lagt i kø. + + src/app/main/main.component.ts + 469 + + + + Both + Begge + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Skip ad + Hopp over reklame + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Video only + Kun video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + File type + Filtype + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Audio only + Kun lyd + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Show error + Vis feil + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Allow autoplay + Tillat automatisk avspilling + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Close + Lukk + + src/app/components/downloads/downloads.component.ts + 241 + + + + Installation type: + Installasjonstype: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Copy to clipboard + Kopier til utklippstavle + + src/app/components/downloads/downloads.component.ts + 240 + + + + Clear finished downloads + Tøm fullførte nedlastinger + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Copied to clipboard! + Kopiert til utklippstavlen. + + src/app/components/downloads/downloads.component.ts + 249 + + + + Pause all downloads + Sett alle nedlastinger på pause + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + Omstart + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + + diff --git a/src/assets/i18n/messages.nb.json b/src/assets/i18n/messages.nb.json deleted file mode 100644 index 120f171..0000000 --- a/src/assets/i18n/messages.nb.json +++ /dev/null @@ -1,222 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Opprett en spilleliste", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Navn", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Lyd", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Type", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Lydfiler", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Videoer", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Endre youtube-dl-argumenter", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Simulerte nye argumenter", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Legg til argument", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Søk etter kategori", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Bruk argument-verdi", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Argument-verdi", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Legg til argument", - "d7b35c384aecd25a516200d6921836374613dfe7": "Avbryt", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Endre", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kvalitet", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Bruk nettadresse", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Vis", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Kun lyd", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Multi-nedlastingsmodus", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Last ned", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Avbryt", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avansert", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Simulert kommando:", - "4e4c721129466be9c3862294dc40241b64045998": "Bruk egendefinerte argumenter:", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Egendefinerte argumenter", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Du trenger ikke å inkludere nettadressen, kun alt etter. Argumenter skilles ved bruk av to komma, slik: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Bruk defendefinert utdata", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Egendefinert utdata", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Dokumentasjon", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Sti er relativ til oppsettsnedlastingsstien. Ikke inkluder utvidelse.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Bruk identitetsbekreftelse", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Brukernavn", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Passord", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Navn:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "Nettadresse:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Opplaster:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Filstørrelse:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Sti:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Opplastingsdato:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Lukk", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Endre spilleliste", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "Legg til mer innhold", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Lagre", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Antall:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Rediger", - "826b25211922a1b46436589233cb6f1a163d89b7": "Slett", - "321e4419a943044e674beb55b8039f42a9761ca5": "Info", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Slett og svartelist", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Last opp nye kaker", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Dra og slipp", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Merk: Oppasting av nye kaker overskriver tidligere. Merk deg også at kaker gjelder for hele instansen, ikke per bruker.", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Innstillinger", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "Nettadresse", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "Nettadressen dette programmet nås fra, uten porten.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Port", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Ønsket port. Forvalet er 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Multi-brukermodus", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Bruker-basissti", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Basissti for brukere og deres nedlastede videoer.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Tillat abonnementer", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnements-basissti", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Basissti for videoer fra dine abonnementskanaler og spillelister. Den er relativ til YTDL-Material sin rotmappe.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Sjekkintervall", - "0f56a7449b77630c114615395bbda4cab398efd8": "I sekunder, kun tall.", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Drakt", - "ff7cee38a2259526c519f878e71b964f41db4348": "Forvalg", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Mørk", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Tillat draktendring", - "fe46ccaae902ce974e2441abe752399288298619": "Språk", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Generelt", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Lydmappe", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Sti for lydbaserte nedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomappe", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Sti for videonedlastinger. Den er relativ til YTDL-Material sin rotmappe.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Egendefinerte argumenter for nedlastninger på hjemmesiden for hele programmet. Argumenter skilles med to komma, slik: ,,", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Bruk youtube-dl-arktivet", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Inkluder miniatyrbilde", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Inkluder metadata", - "fb35145bfb84521e21b6385363d59221f436a573": "Drep alle nedlastinger", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Nedlaster", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Topptittel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Filbehandler påskrudd", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Nedlastingsbehandler påskrudd", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Tillat kvalitetsvalg", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modus kun for nedlasting", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Tillat multi-nedlastingsmodus", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Skru på offentlig API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Offentlig API-nøkkel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Vis dokumentasjon", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Generer", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Dette vil slette din gamle API-nøkkel!", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Bruk YouTube-API", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-API-nøkkel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Å generere en nøkkel er lett!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klikk her", - "7f09776373995003161235c0c8d02b7f91dbc4df": "for å laste ned den offisielle Chrome-utvidelsen for YouTubeDL-Material selv.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Du må manuelt laste ned utvidelsen og endre dens innstillinger for å sette skjermflate-nettadresse.", - "9a2ec6da48771128384887525bdcac992632c863": "for å installere den offisielle Firefox-utvidelsen for YouTubeDL-Material rett fra Firefox sin utvidelsesside.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Detaljert oppsettsinstruks", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Ikke mye kreves annet enn å endre utvidelses innstillinger for å sette skjermflate-nettadresse.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Dra lenken nedenfor til bokmerker. Naviger til YouTube-videoen du ønsker å laste ned og klikk på bokmerket.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Genrer \"kun lyd\"-bookmerke", - "d5f69691f9f05711633128b5a3db696783266b58": "Ekstra", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Bruk forvalgt nedlastingsagent", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Velg en nedlaster", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Loggingsnivå", - "db6c192032f4cab809aad35215f0aa4765761897": "Innloggingsutløp", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Tillat avansert nedlasting", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Bruk kaker", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Sett kaker", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avansert", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Tillat brukerregistrering", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Autentiseringsmetode", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-nettadresse", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "BIND-DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "BIND-identitetsdetaljer", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Søkebase", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Søkefilter", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Brukere", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logger", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Om YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "er en fri YouTube-nedlaster bygd i henhold til Google sine Materielle spesifikasjoner. Du kan sømløst laste ned dine favorittvideoer som video- eller lydfiler, og tilogmed abonnere på dine favorittkanaler og spillelister for å holde deg oppdatert med nye videoer.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "har noen flotte funksjoner inkludert. Et vidtfavnende API, Docker-støtte, og lokalisering (oversettelser)-støtte. Les om alle støttede funksjoner ved å klikke på GitHub-ikonet ovenfor.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Installert versjon:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Ser etter oppdateringer …", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Oppdatering tilgjengelig", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Du kan oppdatere fra innstillingsmenyen.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Funnet en feil eller har et forslag å komme med?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "for å opprette en feilrapport.", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Din profil", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Opprettet:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Du er ikke innlogget.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Logg inn", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Logg ut", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Opprett administratorkonto", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Fant ingen administratorkonto. Dette vil opprette og sette passord for en slik konto med brukernavn som «admin».", - "70a67e04629f6d412db0a12d51820b480788d795": "Opprett", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profil", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Om", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Hjem", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementer", - "822fab38216f64e8166d368b59fe756ca39d301b": "Nedlastinger", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Del spilleliste", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Del video", - "1d540dcd271b316545d070f9d182c372d923aadd": "Del lyd", - "1f6d14a780a37a97899dc611881e6bc971268285": "Skru på deling", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Bruk tidsstempel", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Sekunder", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopier til utklippstavle", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Lagre endringer", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Nedlastet", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "En feil inntraff", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detaljer", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "En feil har inntruffet:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Nedlastingsstart:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Nedlastingsslutt:", - "ad127117f9471612f47d01eae09709da444a36a4": "Filsti(er):", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonner på en spilleliste eller kanal", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "Spilleliste- eller kanal-nettadressen", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Egendefinert navn", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Last ned alle opplastinger", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Last ned videoer oppdatert siste", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Kun lyd-modus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Kun strømming-modus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Disse legges til etter standard-argumentene.", - "98b6ec9ec138186d663e64770267b67334353d63": "Egendefinert filutdata", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonner", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Type:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arkiv:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Eksporter arkiv", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Opphev abonnement", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Dine abonnementer", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanaler", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Navn ikke tilgjengelig. Henter kanal …", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Du har ingen kanalabonnementer.", - "47546e45bbb476baaaad38244db444c427ddc502": "Spillelister", - "2e0a410652cb07d069f576b61eab32586a18320d": "Navn ikke tilgjengelig. Henter spilleliste …", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Du har ingen spillelisteabonnement.", - "3697f8583ea42868aa269489ad366103d94aece7": "Redigering", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Søk", - "2054791b822475aeaea95c0119113de3200f5e1c": "Lengde:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Slett og last ned igjen", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Slett for alltid", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Oppdaterer", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Velg en versjon:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Regustrer", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Økt-ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(nåværende)", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Tøm alle nedlastinger", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Ingen nedlastninger tilgjengelige!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrer en bruker", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Brukernavn", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Håndter bruker", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Bruker-UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nytt passord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Sett nytt passord", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Bruk rolle-forvalg", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nei", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Håndter rolle", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Brukernavn", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rolle", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Handlinger", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Rediger bruker", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Slett bruker", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Legg til brukere", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rediger rolle", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linjer:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Tøm logger", - "ccf5ea825526ac490974336cb5c24352886abc07": "Åpne fil", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Åpne fil i ny fane", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Gå til abonnement", - "d02888c485d3aeab6de628508f4a00312a722894": "Mine videoer" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.nl.json b/src/assets/i18n/messages.nl.json deleted file mode 100644 index 79226a8..0000000 --- a/src/assets/i18n/messages.nl.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Over", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Profiel", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Donker", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Instellingen", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Overzicht", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Inloggen", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Abonnementen", - "822fab38216f64e8166d368b59fe756ca39d301b": "Downloads", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Alleen audio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Downloaden", - "a38ae1082fec79ba1f379978337385a539a28e73": "Kwaliteit", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "URL gebruiken", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Bekijken", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Meerdere video's downloaden", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Afbreken", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Geavanceerd", - "4e4c721129466be9c3862294dc40241b64045998": "Aanvullende opties toekennen", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Aanvullende opties", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Je hoeft alleen de aanvullende opties op te geven, dus niet de url. Je kunt de opties scheiden met twee komma's: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Aangepaste uitvoer gebruiken", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Aangepaste uitvoer", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentatie", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Het pad is relatief aan het ingestelde downloadpad. Laat de extensie achterwege.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Geteste opdracht:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Authenticatie gebruiken", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Gebruikersnaam", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Wachtwoord", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Afspeellijst maken", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Naam", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Soort", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Audio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Video", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Audiobestanden", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Video's", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Abonneren op afspeellijst of kanaal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "De url van de afspeellijst of het kanaal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Aangepaste naam", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Alle uploads downloaden", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Maximumkwaliteit", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Audiomodus", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Streamingmodus", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Deze worden toegevoegd ná de standaardopties.", - "98b6ec9ec138186d663e64770267b67334353d63": "Aangepaste bestandsuitvoer", - "d7b35c384aecd25a516200d6921836374613dfe7": "Annuleren", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Abonneren", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Video's downloaden die geüpload zijn in de afgelopen", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Soort:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Sluiten", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Archief exporteren", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "De-abonneren", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(onderbroken)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Archief:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Naam:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Uploader:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Bestandsgrootte:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Pad:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Uploaddatum:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categorie:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "youtube-dl-opties aanpassen", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Geteste nieuwe aanvullende opties", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Optie toevoegen", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Zoeken op categorie", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Optiewaarde gebruiken", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Optie toevoegen", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Aanpassen", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Optiewaarde", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Updater", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Gebruikersregistratie", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Gebruikersnaam", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registreren", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Nieuwe cookies uploaden", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "Let op: de nieuwe cookies overschrijven de oude. Daarnaast zijn de cookies procesgebonden en niet gebruikersgebonden.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Slepen-en-neerzetten", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Afspeellijst aanpassen", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Inhoud toevoegen", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Opslaan", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Normale volgorde", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Omgekeerde volgorde", - "d02888c485d3aeab6de628508f4a00312a722894": "Mijn video's", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Zoeken", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Geen video's gevonden.", - "3697f8583ea42868aa269489ad366103d94aece7": "Bewerken", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Onderbroken", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Categorie bewerken", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regels", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Regel toevoegen", - "792dc6a57f28a1066db283f2e736484f066005fd": "Twitch-chatgesprek downloaden", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Aanpassen", - "826b25211922a1b46436589233cb6f1a163d89b7": "Verwijderen", - "321e4419a943044e674beb55b8039f42a9761ca5": "Informatie", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Aantal:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Verwijderen en op zwarte lijst plaatsen", - "dad95154dcef3509b8cc705046061fd24994bbb7": "weergaven", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Aanpassingen opslaan", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Het downloaden is voltooid", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Er is een fout opgetreden", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Details", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Er is een fout opgetreden:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Gestart om:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Afgerond om:", - "ad127117f9471612f47d01eae09709da444a36a4": "Bestandspad(en):", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Mijn abonnementen", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Kanalen", - "47546e45bbb476baaaad38244db444c427ddc502": "Afspeellijsten", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "De naam is niet beschikbaar omdat het kanaal nog wordt opgehaald.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Je hebt geen abonnementen.", - "2e0a410652cb07d069f576b61eab32586a18320d": "De naam is niet beschikbaar omdat de afspeellijst nog wordt opgehaald.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Je hebt geen abonnementen.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Algemeen", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Downloader", - "d5f69691f9f05711633128b5a3db696783266b58": "Diversen", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Geavanceerd", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Gebruikers", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logboeken", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "De url waarvan deze app wordt geladen, zonder het poortnummer.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Poort", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Het gewenste poortnummer (standaard: 17442).", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Meerdere gebruikers", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Gebruikersbasispad", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Het basispad voor gebruikers en hun gedownloade video's.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Abonnementen toestaan", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Abonnementenbasispad", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Het basispad voor video's van afspeellijsten en kanalen uit je abonnementen. Dit is relatief aan YTDL-Material's hoofdmap.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Controletussenpoos", - "0f56a7449b77630c114615395bbda4cab398efd8": "In seconden (alleen cijfers).", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Soms worden nieuwe video's gedownload voordat ze volledig verwerkt zijn. Met deze instelling wordt de volgende dag gecontroleerd of er een hogere kwaliteit beschikbaar is.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Nieuwe uploads opnieuw downloaden", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Thema", - "ff7cee38a2259526c519f878e71b964f41db4348": "Standaard", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Themawijziging toestaan", - "fe46ccaae902ce974e2441abe752399288298619": "Taal", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Audiopad", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Het pad voor audiodownloads. Dit is relatief aan YTDL-Material's hoofdmap.", - "46826331da1949bd6fb74624447057099c9d20cd": "Videomap", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Het pad voor videodownloads. Dit is relatief aan YTDL-Material's hoofdmap.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Standaard bestandsuitvoer", - "1148fd45287ff09955b938756bc302042bcb29c7": "Dit pad is relatief aan bovenstaande downloadpaden. Laat de extensie achterwege.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Algemene aanvullende opties", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorieën", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "youtube-dl-archief gebruiken", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Miniatuurvoorbeeld opslaan", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Metagegevens opslaan", - "fb35145bfb84521e21b6385363d59221f436a573": "Alle downloads afbreken", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Boventitel", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Bestandsbeheer ingeschakeld", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Downloadbeheer ingeschakeld", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Kwaliteitskeuze toestaan", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Downloadmodus", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Meerdere downloads toestaan", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Openbare api gebruiken", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Openbare api-sleutel", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Documentatie bekijken", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Let op: hiermee verwijder je je oude api-sleutel!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Genereren", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "YouTube-api gebruiken", - "ce10d31febb3d9d60c160750570310f303a22c22": "YouTube-api-sleutel", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Het genereren van een sleutel is eenvoudig.", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Twitch-api gebruiken", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch-api-sleutel", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Ook wel de client-id.", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Twitch-chatgesprekken automatisch downloaden", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Klik hier", - "7f09776373995003161235c0c8d02b7f91dbc4df": "om de officiële Chrome-extensie van YouTubeDL-Material te downloaden.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Hiervoor dien je de extensie handmatig te laden en de frontend-url op te geven in de instellingen.", - "9a2ec6da48771128384887525bdcac992632c863": "om de officiële Firefox-extensie van YouTubeDL-Material te installeren.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Uitgebreide installatiehandleiding.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Je hoeft alleen de frontend-url op te geven in de instellingen.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Sleep de link naar je bladwijzers en klaar is Kees! Ga vervolgens naar een YouTube-video en klik op de bladwijzer.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Audio-bookmarklet genereren", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Kies een downloader", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Standaard downloadagent gebruiken", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Kies een downloadagent", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Logniveau", - "db6c192032f4cab809aad35215f0aa4765761897": "Inlogverloopdatum", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Geavanceerd downloaden toestaan", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Cookies gebruiken", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Cookies instellen", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Gebruikersregistratie toestaan", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Authenticatiemethode", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Intern", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP-url", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind-inloggegevens", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Zoekdatabank", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Zoekfilter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Over YouTubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "is een opensource YouTube-downloader, gebouwd volgens Google's Material Design-specificaties. Je kunt naadloos je favoriete video's downloaden als audio- of videobestanden of abonneren op je favoriete kanalen of afspeellijsten om altijd de nieuwste video's binnen te halen.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "bevat een aantal handige functies, zoals een uitgebreide api, Docker-ondersteuning en is volledig vertaalbaar. Meer functies zijn te vinden op onze GitHub-pagina (klik op het GitHub-pictogram).", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Geïnstalleerde versie:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Heb je een bug aangetroffen of een idee?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "om een 'issue' te openen!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Bezig met controleren op updates...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Update beschikbaar", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Je kunt de update installeren via het instellingenmenu.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Kies een versie:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Delen toestaan", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Tijdstempel gebruiken", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "seconden", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Kopiëren naar klembord", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Afspeellijst delen", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Video delen", - "1d540dcd271b316545d070f9d182c372d923aadd": "Audio delen", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Sessie-id:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Alle downloads wissen", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(huidig)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Geen downloads beschikbaar!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Mijn profiel", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Uitloggen", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Aangemaakt:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Je bent niet ingelogd.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Beheerdersaccount aanmaken", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Er zijn geen beheerdersaccounts aangetroffen. Hiermee maak je een beheerdersaccount met wachtwoord aan - de gebruikersnaam is 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Aanmaken", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Gebruikers toevoegen", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Rol aanpassen", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Gebruikersnaam", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Rol", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Acties", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gebruiker beheren", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Gebruiker verwijderen", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Gebruiker bewerken", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Gebruikers-uid:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nieuw wachtwoord", - "6498fa1b8f563988f769654a75411bb8060134b9": "Nieuw wachtwoord instellen", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Standaardrol gebruiken", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Ja", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Nee", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Rol beheren", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Aantal regels:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Logboeken wissen", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Automatisch gegenereerd", - "ccf5ea825526ac490974336cb5c24352886abc07": "Bestand openen", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Bestand openen op nieuw tabblad", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ga naar abonnement", - "94e01842dcee90531caa52e4147f70679bac87fe": "Verwijderen en opnieuw downloaden", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Permanent verwijderen", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Meer tonen.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Minder tonen.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duur:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.nl.xlf b/src/assets/i18n/messages.nl.xlf index 0049336..03cb155 100644 --- a/src/assets/i18n/messages.nl.xlf +++ b/src/assets/i18n/messages.nl.xlf @@ -1,4 +1,4 @@ - + @@ -1392,7 +1392,7 @@ Allow subscriptions setting - Subscriptions base path + Base bath for subscriptions Abonnementenbasispad src/app/settings/settings.component.html @@ -1545,8 +1545,8 @@ Custom args input placeholder - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - Algemene aanvullende opties voor downloads op de overzichtspagina. Scheidt deze met komma's: ,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + Algemene aanvullende opties voor downloads op de overzichtspagina. (Stel de opties per abonnement in!) Scheidt deze met komma's: ,, src/app/settings/settings.component.html 134 @@ -2512,6 +2512,598 @@ Video duration label + + Share file + Bestand delen + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Server herstarten + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + De databankinformatie kan niet worden opgehaald. Bekijk voor meer informatie de serverlogboeken. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + DB overzetten naar + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Tekenreeks testen + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Voorbeeld: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB-verbindingstekenreeks + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Aantal items per tabel + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Databanklocatie: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Afspeellijsten categoriseren + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Schakel in om een categorie toe te kennen aan een volledige afspeellijst als ook maar één video overeenkomt. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + Databank + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Willkeurig afspelen + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Bijsnijden tot (in seconden) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Bijsnijden vanaf (in seconden) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Bestand bijsnijden + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Skip ad + Reclame overslaan + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Add to playlist + Toevoegen aan afspeellijst + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Clear finished downloads + Afgeronde downloads wissen + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Resume all downloads + Alle downloads hervatten + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + Alle downloads onderbreken + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Restart + Herstarten + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Show error + Foutmelding + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Watch content + Inhoud bekijken + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Resume + Hervatten + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Pause + Onderbreken + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Clear + Wissen + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Actions + Acties + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Progress + Voortgang + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Stage + Fase + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Subscription + Abonnement + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Title + Naam + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Date + Datum + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Copied to clipboard! + Gekopieerd naar het klembord! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Close + Sluiten + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copy to clipboard + Kopiëren naar klembord + + src/app/components/downloads/downloads.component.ts + 240 + + + + Error for + Foutmelding bij + + src/app/components/downloads/downloads.component.ts + 238 + + + + Clear + Wissen + + src/app/components/downloads/downloads.component.ts + 131 + + + + Would you like to clear your finished downloads? + Weet je zeker dat je de afgeronde downloads wilt wissen? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear finished downloads + Afgeronde downloads wissen + + src/app/components/downloads/downloads.component.ts + 129 + + + + Complete + Voltooid + + src/app/components/downloads/downloads.component.ts + 61 + + + + Downloading file + Bezig met downloaden… + + src/app/components/downloads/downloads.component.ts + 60 + + + + Getting info + Bezig met ophalen van informatie… + + src/app/components/downloads/downloads.component.ts + 59 + + + + Creating download + Bezig met samenstellen… + + src/app/components/downloads/downloads.component.ts + 58 + + + + Docker tag: + Docker-tag: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Build date: + Bouwdatum: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Commit hash: + Commitsom: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Installation type: + Soort installatie: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Generate NFO files + NFO-bestanden genereren + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Generates NFO files with every download, primarily used by Kodi. + Genereert nfo-bestanden bij elke downloaden, die voornamelijk worden gebruikt door Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Use SponsorBlock API + SponsorBlock-api gebruiken + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Enables a button to skip ads when viewing supported videos. + Toon een knop die reclame overslaat (alleen ondersteunde video's. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Allow autoplay + Automatisch afspelen + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Rate limits your downloads to the specified amount. Ex: 200K + Beperkt de downloadsnelheid tot het opgegeven aantal, bijv. 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download rate limit + Downloadsnelheidslimiet + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Beperkt het aantal gelijktijdige downloads. Stel in op -1 om niet in te perken. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Max. aantal gelijktijdige downloads + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + You must enable multi-user mode to access this tab. + Schakel de meerderegebruikersmodus in om dit tabblad te kunnen gebruiken. + + src/app/settings/settings.component.ts + 48 + + + + Audio only + Alleen audio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Video only + Alleen video + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Beide + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Bestandstype + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Replace args + Opties vervangen + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Automatisch afspelen + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Download for has been queued! + staat in de wachtrij! + + src/app/main/main.component.ts + 469 + + diff --git a/src/assets/i18n/messages.pt.json b/src/assets/i18n/messages.pt.json deleted file mode 100644 index 9f7abbd..0000000 --- a/src/assets/i18n/messages.pt.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "Sobre", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Perfil", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Escuro", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Configurações", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Início", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Entrar", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Inscrições", - "822fab38216f64e8166d368b59fe756ca39d301b": "Baixados", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Apenas áudio", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Baixar", - "a38ae1082fec79ba1f379978337385a539a28e73": "Qualidade", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Usar URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Ver", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Modo baixar-múltiplos", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Cancelar", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Avançado", - "4e4c721129466be9c3862294dc40241b64045998": "Usar argumentos personalizados", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Argumentos personalizados", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Não é necessário incluir URL, apenas tudo depois. Argumentos são delimitados usando duas vírgulas assim: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Usar saída personalizada", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Saída personalizada", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Documentação", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Caminho é relativo a configuração do caminho de download. Não inclua a extensão.", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Comando simulado:", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Usar autenticação", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Nome de usuário", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Senha", - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Criar lista de reprodução", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Nome", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Tipo", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Áudio", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Vídeo", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Arquivos de áudio", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Vídeos", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Inscreva-se numa lista de reprodução ou canal", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "A URL da lista de reprodução ou canal", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Nome personalizado", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Baixar todos uploads", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Qualidade máxima", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Modo apenas-áudio", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Modo somente streaming", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Eles são adicionados após os argumentos padrão.", - "98b6ec9ec138186d663e64770267b67334353d63": "Saída de arquivo personalizado", - "d7b35c384aecd25a516200d6921836374613dfe7": "Cancelar", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Inscreva-se", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Baixe vídeos enviados no último", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Tipo:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Fechar", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Exportar Arquivos", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Cancelar inscrição", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Pausado)", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Arquivos:", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Nome:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Quem subiu:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Tamanho do arquivo:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Caminho:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Data de upload:", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Categoria:", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Modificar argumentos do youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Novos argumentos simulados", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Adicionar um argumento", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Buscar por categoria", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Usar valor do argumento", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Adicionar argumento", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Modificar", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Valor do argumento", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Atualizador", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Registrar usuário", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Nome de usuário", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Registrar", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Fazer upload de novos cookies", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "NOTA: O upload de novos cookies substituirá os cookies anteriores. Observe também que os cookies abrangem toda a instância, não por usuário.", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Arrastar e soltar", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Modificar lista de reprodução", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Adicionar conteúdo", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Salvar", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Ordem normal", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Ordem reversa", - "d02888c485d3aeab6de628508f4a00312a722894": "Meus vídeos", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Buscar", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Nenhum vídeo encontrado.", - "3697f8583ea42868aa269489ad366103d94aece7": "Editando", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Em pausa", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Editando categoria", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Regras", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Adicionar nova regra", - "792dc6a57f28a1066db283f2e736484f066005fd": "Baixar Twitch Chat", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Editar", - "826b25211922a1b46436589233cb6f1a163d89b7": "Excluir", - "321e4419a943044e674beb55b8039f42a9761ca5": "Detalhes", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Total:", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Excluir e bloquear", - "dad95154dcef3509b8cc705046061fd24994bbb7": "visualizações", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Salvar alterações", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Download finalizado com sucesso", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Ocorreu um erro", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Detalhes", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Ocorreu um erro:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Download iniciado:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Download finalizado:", - "ad127117f9471612f47d01eae09709da444a36a4": "Destino do arquivo:", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Suas inscrições", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Canais", - "47546e45bbb476baaaad38244db444c427ddc502": "Playlists", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Nome não disponível. Carregamento do canal em andamento.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "Você não está inscrito em um canal.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Nome não disponível. Carregamento da playlist em andamento.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "Você não está inscrito em uma playlist.", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Geral", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Downloader", - "d5f69691f9f05711633128b5a3db696783266b58": "Extra", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Avançado", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Usuários", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Logs", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Fechar} false {Cancelar} other {Outro}}", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL para acesso ao app, sem porta.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Porta", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Porta desejada. (Padrão 17442).", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Modo multi-usuário", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Diretório base de usuários", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Diretório base para usuários e seus vídeos baixados.", - "4e3120311801c4acd18de7146add2ee4a4417773": "Permitir inscrições", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Diretório base para Inscrições", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Diretório base para vídeos das inscrições em canais e playlists. Relativo ao diretório raiz do YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Intervalo de checagem", - "0f56a7449b77630c114615395bbda4cab398efd8": "Unidade em segundos, inclua apenas números.", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Algumas vezes vídeos são baixados antes de serem totalmente processados. Esta configuração faz com que vídeos novos sejam verificados por uma qualidade mais alta no dia seguinte.", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Baixar novamente uploads recentes", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Aparência", - "ff7cee38a2259526c519f878e71b964f41db4348": "Padrão", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Permitir alteração da aparência", - "fe46ccaae902ce974e2441abe752399288298619": "Idioma", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Diretório para áudio", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Diretório para downloads de 'áudio apenas'. Relativo ao diretório raiz do YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Diretório de Vídeos", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Diretório para download de vídeos. Relativo ao diretório raiz do YTDL-Material.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Arquivo de destino padrão", - "1148fd45287ff09955b938756bc302042bcb29c7": "O caminho é relativo ao diretório de download acima. Não inclua extensão.", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Parâmetro global personalizado", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Parâmetro global personalizado para downloads na home page. Parâmetros são delimitados utilizando duas vírgulas. Ex: ,,", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Categorias", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Armazenar youtube-dl", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Incluir miniatura", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Incluir metadados", - "fb35145bfb84521e21b6385363d59221f436a573": "Parar todos os downloads", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Título", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Habilitar gerenciador de arquivos", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Habilitar gerenciador de downloads", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Permitir seleção de qualidade", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Modo Apenas Download", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Permitir modo múltiplos downloads", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Habilitar API pública", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Chave da API Pública", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Ver documentação", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Isso irá excluir sua chave API anterior!", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Gerar", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Usar API do YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Chave da API do YouTube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Gerar uma chave é fácil!", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Usar API do Twitch", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Chave da API do Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Também chamado de ID do Cliente (Client ID).", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Baixar Twitch Chat automaticamente", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Clique aqui", - "7f09776373995003161235c0c8d02b7f91dbc4df": "para baixar a extensão do YoutubeDL-Material para o Chrome manualmente.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Você deve carregar a extensão manualmente e alterar as configurações para a URL inicial.", - "9a2ec6da48771128384887525bdcac992632c863": "para instalar a extensão oficial do YoutubeDL-Material para o Firefox diretamente da página de extensões.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Instruções de instalação detalhadas.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Nada além de alterar a configuração da extensão para a URL inicial é necessário.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Arraste o link abaixo para seus Favoritos, e pronto! Navegue para o vídeo do Youtube que deseja baixar e clique no link favoritado.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Gerar favorito 'apenas áudio' interativo", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Selecione um downloader", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Usar agente de download padrão", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Selecionar um agente de download", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Nível do Log", - "db6c192032f4cab809aad35215f0aa4765761897": "Expiração do login", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Permitir Download avançado", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Usar Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Configurar Cookies", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Permitir cadastro de usuário", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Método de autenticação", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Interno", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL do LDAP", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Bind DN", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Bind Credentials", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "Search Base", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Search Filter", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "Sobre o YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "é um downloader open-source para o Youtube feito nas especificações do Mateerial Design da Google. Você pode baixar seus vídeos favoritos como arquivos de vídeo ou áudio, e até se inscrever nos seus canais ou playlists favoritos para ficar atualizado com os novos vídeos publicados.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "tem algumas funcionalidades incríveis inclusas! Uma API extensa, suporte ao Docker, suporte à tradução. Leia sobre todas as funcionalidades suportadas clicando no ícone do GitHub acima.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Versão instalada:", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Achou m bug ou tem uma sugestão?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "para criar uma ocorrência!", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Buscando por atualizações...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Atualização disponível", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Você pode atualizar pelo Menu de Configuração.", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Selecionar uma versão:", - "1f6d14a780a37a97899dc611881e6bc971268285": "Habilitar compartilhamento", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Usar timestamp", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Segundos", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Copiar para a Área de transferência", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Compartilhar playlist", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Compartilhar Vídeo", - "1d540dcd271b316545d070f9d182c372d923aadd": "Compartilhar Áudio", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "ID da sessão:", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Limpar todos os downloads", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(atual)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Não há downloads disponíveis!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Seu Perfil", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Sair", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Criado:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Você não está logado.", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Criar conta de Administrador", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Conta padrão de Administrador não detectada. Isto irá criar e configurar uma senha para a conta de administrador com o usuário 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Criar", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Adicionar Usuários", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Editar função", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Nome de usuário", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Função", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Ações", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Gerenciar usuário", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Excluir usuário", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Editar usuário", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "UID do usuário:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Nova senha", - "6498fa1b8f563988f769654a75411bb8060134b9": "Aplicar nova senha", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Usar função padrão", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Sim", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Não", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Gerenciar função", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Linhas:", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Limpar logs", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Auto-gerado", - "ccf5ea825526ac490974336cb5c24352886abc07": "Abrir arquivo", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Abrir arquivo em uma nova aba", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Ir para Inscrições", - "94e01842dcee90531caa52e4147f70679bac87fe": "Excluir e baixar novamente", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Excluir para sempre", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "Ver mais.", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Ver menos.", - "2054791b822475aeaea95c0119113de3200f5e1c": "Duração:" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.pt.xlf b/src/assets/i18n/messages.pt.xlf index 9076586..f3404b0 100644 --- a/src/assets/i18n/messages.pt.xlf +++ b/src/assets/i18n/messages.pt.xlf @@ -1,4 +1,4 @@ - + @@ -1214,7 +1214,7 @@ Playlists - Playlists + Lista de reprodução src/app/subscriptions/subscriptions.component.html 27 @@ -1972,7 +1972,7 @@ Bind Credentials - Bind Credentials + Bind Credenciais src/app/settings/settings.component.html 385 @@ -1981,7 +1981,7 @@ Search Base - Search Base + Pesquisar Base src/app/settings/settings.component.html 390 @@ -1990,7 +1990,7 @@ Search Filter - Search Filter + Pesquisar Filtro src/app/settings/settings.component.html 395 @@ -2512,6 +2512,598 @@ Video duration label + + Crop to (seconds) + Cortar para (segundos) + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Autoplay + Reprodução automática + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + File type + Tipo do arquivo + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Apenas vídeo + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Both + Amobs + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + You must enable multi-user mode to access this tab. + Você deve habilitar o modo multiusuário para acessar essa aba. + + src/app/settings/settings.component.ts + 48 + + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Limita a quantidade de downloads simultâneos. Use -1 para ilimitado. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Max concurrent downloads + Número máximo de downloads simultâneos + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Allow autoplay + Permitir reprodução automática + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Restart server + Reiniciar servidor + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Generates NFO files with every download, primarily used by Kodi. + Gera arquivos NFO em todos os downloads, usado primariamente pelo Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Build date: + Data da compilação: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Close + Fechar + + src/app/components/downloads/downloads.component.ts + 241 + + + + Title + Título + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Pause all downloads + Pausar todos os downloads + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Show error + Mostrar erro + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + Reiniciar + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Clear + Limpar + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Download for has been queued! + Download de foi adicionado à fila! + + src/app/main/main.component.ts + 469 + + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + Com essa configuração ativada, se um único vídeo corresponder a uma categoria, a playlist inteira vai receber essa categoria. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Crop from (seconds) + Cortar de (segundos) + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Database + Banco de dados + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Replace args + Substituir argumentos + + src/app/main/main.component.html + 116,117 + + Replace args + + + Crop file + Cortar arquivo + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Audio only + Apenas áudio + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + Randomize order when playing + Randomizar ordem ao reproduzir + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Resume + Resumir + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Allow playlist categorization + Permitir categorização de playlist + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Download rate limit + Taxa limite do download + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + Limita a taxa de seus downloads na quantidade especificada. Ex: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Watch content + Assistir conteúdo + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Enables a button to skip ads when viewing supported videos. + Habilita um botão para pular propagandas em vídeos suportados. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + Usar API SponsorBlock + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generate NFO files + Gerar arquivos NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Transfer DB to + Transferir banco de dados para + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + Informação do banco de dados não pôde ser obtida. Verifique os logs do servidor para mais informação. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Installation type: + Tipo de instalação: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Database location: + Localização do banco de dados: + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + Registros por tabela + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + String de conexão do MongoDB + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + Exemplo: + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + Testar string de conexão + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Commit hash: + Commitar hash: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Docker tag: + Tag Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Share file + Compartilhar arquivo + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + Criando download + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + Obtendo informações + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + Baixando arquivo + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + Concluído + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Limpar downloads concluídos + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Você gostaria de limpar os downloads concluídos? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + Limpar + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + Erro para + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + Copiar para a área de transferência + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + Copiado para a área de transferência! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + Data + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Subscription + Inscrição + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Progress + Progresso + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + Ações + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Pause + Pausar + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Stage + Estágio + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Resume all downloads + Resumir todos os downloads + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + Limpar downloads concluídos + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Add to playlist + Adicionar à playlist + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Pular propaganda + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + diff --git a/src/assets/i18n/messages.ru.json b/src/assets/i18n/messages.ru.json deleted file mode 100644 index 3c64599..0000000 --- a/src/assets/i18n/messages.ru.json +++ /dev/null @@ -1,268 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "Создайте список воспроизведения", - "cff1428d10d59d14e45edec3c735a27b5482db59": "Имя", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "Аудиофайлы", - "a52dae09be10ca3a65da918533ced3d3f4992238": "Видео", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "Изменение аргументов youtube-dl", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "Моделирование новых аргументов", - "0b71824ae71972f236039bed43f8d2323e8fd570": "Добавить аргумент", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "Поиск по категориям", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "Использовать значение аргумента", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "Значение аргумента", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "Добавить аргумент", - "d7b35c384aecd25a516200d6921836374613dfe7": "Отмена", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "Модифицировать", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "", - "a38ae1082fec79ba1f379978337385a539a28e73": "Качество", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "Использовать URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "Вид", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "Только аудио", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "Режим мультизагрузки", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "Загрузка", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "Отмена", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "Расширенный", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "Имитация команды:", - "4e4c721129466be9c3862294dc40241b64045998": "Используйте пользовательские аргументы", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "Пользовательские аргументы", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "Нет необходимости включать URL, просто все, что после. Аргументы разграничиваются двумя запятыми следующим образом: ,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "Использование пользовательского вывода", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "Пользовательский вывод", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "Документация", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "Путь является относительным к пути загрузки конфигурации. Не включайте расширение.", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "Используйте аутентификацию", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "Имя пользователя", - "c32ef07f8803a223a83ed17024b38e8d82292407": "Пароль", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "", - "9779715ac05308973d8f1c8658b29b986e92450f": "", - "47546e45bbb476baaaad38244db444c427ddc502": "Плейлисты", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "", - "960582a8b9d7942716866ecfb7718309728f2916": "", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "Имя:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL-адрес:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "Загрузчик:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "Размер файла:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "Путь:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "Дата загрузки:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "Закрыть", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "Изменить список воспроизведения", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "Подсчет:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "Редактировать", - "826b25211922a1b46436589233cb6f1a163d89b7": "Удалить", - "321e4419a943044e674beb55b8039f42a9761ca5": "Информация", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "Удаление и черный список", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "Загрузка новых файлов cookie", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "Перетаскивание", - "85e0725c870b28458fd3bbba905397d890f00a69": "", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "Настройки", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL-адрес", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "URL, с которого будет осуществляться доступ к этому приложению, без указания порта.", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "Порт", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "Желаемый порт. По умолчанию - 17442.", - "d4477669a560750d2064051a510ef4d7679e2f3e": "Многопользовательский режим", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "Базовый путь пользователей", - "a64505c41150663968e277ec9b3ddaa5f4838798": "Базовый путь для пользователей и их загруженных видео.", - "cbe16a57be414e84b6a68309d08fad894df797d6": "", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "", - "4e3120311801c4acd18de7146add2ee4a4417773": "Разрешить подписки", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "Базовый путь подписки", - "bc9892814ee2d119ae94378c905ea440a249b84a": "Базовый путь для видео из подписанных вами каналов и плейлистов. Он является относительным к корневой папке YTDL-Material.", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "Контрольный интервал", - "0f56a7449b77630c114615395bbda4cab398efd8": "Единица измерения - секунды, включайте только цифры.", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "Используйте архив youtube-dl", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "Тема", - "ff7cee38a2259526c519f878e71b964f41db4348": "По умолчанию", - "adb4562d2dbd3584370e44496969d58c511ecb63": "Тёмный", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "Разрешить смену темы", - "fe46ccaae902ce974e2441abe752399288298619": "Язык", - "82421c3e46a0453a70c42900eab51d58d79e6599": "Главная", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "Путь к папке аудио", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "Путь для загрузки только аудиофайлов. Он является относительным к корневой папке YTDL-Material.", - "46826331da1949bd6fb74624447057099c9d20cd": "Путь к папке с видео", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "Путь для загрузки видео. Относится к корневой папке YTDL-Material.", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "Глобальные пользовательские аргументы для загрузок на главной странице. Аргументы разграничиваются с помощью двух запятых следующим образом: ,,", - "d01715b75228878a773ae6d059acc639d4898a03": "", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "Загрузчик", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "Верхний заголовок", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "Включен файловый менеджер", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "Включен менеджер загрузок", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "Разрешить выбор качества", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "Режим только загрузки", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "Разрешить режим мультизагрузки", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "Включить публичный API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "Открытый ключ API", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "Просмотр документации", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "Создать", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "Используйте API YouTube", - "ce10d31febb3d9d60c160750570310f303a22c22": "Ключ API Youtube", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "Сгенерировать ключ очень просто!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "Нажмите здесь", - "7f09776373995003161235c0c8d02b7f91dbc4df": "чтобы загрузить официальное расширение YoutubeDL-Material Chrome вручную.", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "Вы должны вручную загрузить расширение и изменить его настройки, чтобы установить URL-адрес фронтенда.", - "9a2ec6da48771128384887525bdcac992632c863": "чтобы установить официальное расширение YoutubeDL-Material Firefox прямо со страницы расширений Firefox.", - "eb81be6b49e195e5307811d1d08a19259d411f37": "Подробные инструкции по настройке.", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "Не требуется ничего особенного, кроме изменения настроек расширения для установки внешнего URL.", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "Перетащите приведенную ниже ссылку в закладки, и все готово! Просто перейдите к видео YouTube, которое вы хотите загрузить, и нажмите на закладку.", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "Создать букмарклет \"только аудио\"", - "d5f69691f9f05711633128b5a3db696783266b58": "Дополнительно", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "Использовать агент загрузки по умолчанию", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "Выберите программу загрузки", - "00e274c496b094a019f0679c3fab3945793f3335": "", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "Разрешить расширенную загрузку", - "431e5f3a0dde88768d1074baedd65266412b3f02": "Использование файлов cookie", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "Установить Cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "Продвинутый", - "37224420db54d4bc7696f157b779a7225f03ca9d": "Разрешить регистрацию пользователей", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "Пользователи", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "Журналы", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "Сохранить", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {Close} false {Cancel} other {otha}}", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "О YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "это загрузчик YouTube с открытым исходным кодом, созданный в соответствии со спецификациями Material Design от Google. Вы можете легко загружать любимые видеоролики в виде видео- или аудиофайлов и даже подписываться на любимые каналы и плейлисты, чтобы быть в курсе их новых видео.", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "включает в себя несколько потрясающих функций! Обширный API, поддержка Docker и поддержка локализации (перевода). Ознакомьтесь со всеми поддерживаемыми функциями, нажав на значок GitHub выше.", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "Установленная версия:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "Проверяем обновления...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "Доступно обновление", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "Обновление можно выполнить в меню настроек.", - "b33536f59b94ec935a16bd6869d836895dc5300c": "Нашли ошибку или у вас есть предложение?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "чтобы создать проблему!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "Ваш профиль", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "Создан:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "Вы не вошли в систему.", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "Логин", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "Выход из системы", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "Создайте учетную запись администратора", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "Учетная запись администратора по умолчанию не обнаружена. Это создаст и установит пароль для учетной записи администратора с именем пользователя 'admin'.", - "70a67e04629f6d412db0a12d51820b480788d795": "Создать", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "Профиль", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "О", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "Дом", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "Подписки", - "822fab38216f64e8166d368b59fe756ca39d301b": "Загрузки", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "Поделиться плейлистом", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "Поделиться видео", - "1d540dcd271b316545d070f9d182c372d923aadd": "Поделиться аудиозаписью", - "1f6d14a780a37a97899dc611881e6bc971268285": "Включить совместное использование", - "6580b6a950d952df847cb3d8e7176720a740adc8": "Используйте метку времени", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "Секунды", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "Копировать в буфер обмена", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "Сохранить изменения", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "Подробности", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "Произошла ошибка:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "Начало загрузки:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "Конец загрузки:", - "ad127117f9471612f47d01eae09709da444a36a4": "Путь(и) к файлам:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "Подписаться на плейлист или канал", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "URL-адрес списка воспроизведения или канала", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "Пользовательское имя", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "Загрузить все загруженные файлы", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "Скачать видео, загруженное за последние время", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "Только аудио режим", - "408ca4911457e84a348cecf214f02c69289aa8f1": "Режим только для потокового вещания", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "Они добавляются после стандартных аргументов.", - "98b6ec9ec138186d663e64770267b67334353d63": "Пользовательский вывод файлов", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "Подписаться", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "Тип:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "Архив:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "Экспорт архива", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "Отписаться от рассылки", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "Ваши подписки", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "Каналы", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "Имя недоступно. Идет поиск канала.", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "У вас нет подписок на каналы.", - "2e0a410652cb07d069f576b61eab32586a18320d": "Имя недоступно. Идет поиск списка воспроизведения.", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "У вас нет подписок на плейлисты.", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "Поиск", - "2054791b822475aeaea95c0119113de3200f5e1c": "Длина:", - "94e01842dcee90531caa52e4147f70679bac87fe": "Удаление и повторная загрузка", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "Удалить навсегда", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "Обновление", - "1372e61c5bd06100844bd43b98b016aabc468f62": "Выберите версию:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "Зарегистрироваться", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "Идентификатор сессии:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(текущий)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "Загрузка недоступна!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "Зарегистрировать пользователя", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "Имя пользователя", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "Управление пользователями", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "Идентификатор пользователя:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "Новый пароль", - "6498fa1b8f563988f769654a75411bb8060134b9": "Установите новый пароль", - "40da072004086c9ec00d125165da91eaade7f541": "", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "Да", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "Нет", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "Управлять ролью", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "Имя пользователя", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "Роль", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "Действия", - "4d92a0395dd66778a931460118626c5794a3fc7a": "Добавить пользователей", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "Редактировать роль", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "Линии:", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "Смотреть меньше.", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "См. подробнее.", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "Перейти к подписке", - "5656a06f17c24b2d7eae9c221567b209743829a9": "Открыть файл в новой вкладке", - "ccf5ea825526ac490974336cb5c24352886abc07": "Открыть файл", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "Автогенерируемый", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "Очистить журналы", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "Использовать роль по умолчанию", - "632e8b20c98e8eec4059a605a4b011bb476137af": "Редактировать пользователя", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "Удалить пользователя", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "Очистить все загрузки", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "Фильтр поиска", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "База поиска", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "Связать учетные данные", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "Привязать DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "URL-адрес LDAP", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "Внутренний", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "Метод авторизации", - "db6c192032f4cab809aad35215f0aa4765761897": "Истечение срока действия логина", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "Уровень журнала", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "Выберите агент загрузки", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "Автоматическая загрузка чата Twitch", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "Также известен как идентификатор клиента.", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Ключ API Twitch", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "Используйте API Twitch", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "Это удалит ваш старый ключ API!", - "fb35145bfb84521e21b6385363d59221f436a573": "Убить все загрузки", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "Включить метаданные", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "Включить уменьшенное изображение", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "Категории", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "Глобальные пользовательские аргументы", - "1148fd45287ff09955b938756bc302042bcb29c7": "Путь является относительным по отношению к вышеуказанным путям загрузки. Не включайте расширение.", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "Вывод файлов по умолчанию", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "Повторная загрузка свежих загрузок", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "Иногда новые видео загружаются до полной обработки. Эта настройка означает, что новые видео будут проверяться на наличие версии более высокого качества на следующий день.", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "Произошла ошибка", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "Загрузка прошла успешно", - "dad95154dcef3509b8cc705046061fd24994bbb7": "просмотры", - "792dc6a57f28a1066db283f2e736484f066005fd": "Скачать Чат Twitch", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "Добавить новое правило", - "2489eefea00931942b91f4a1ae109514b591e2e1": "Правила", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "Категория редактирования", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "Приостановлено", - "3697f8583ea42868aa269489ad366103d94aece7": "Редактирование", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "Видео не найдено.", - "d02888c485d3aeab6de628508f4a00312a722894": "Мои видео", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "Обратный порядок", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "Обычный порядок", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "Добавить содержание", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "ПРИМЕЧАНИЕ: Загрузка новых файлов cookie отменяет предыдущие файлы cookie. Также обратите внимание, что файлы cookie используются в масштабах всего экземпляра, а не каждого пользователя.", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "Категория:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(Пауза)", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "Максимальное качество", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "Видео", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "Аудио", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "Тип" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.ru.xlf b/src/assets/i18n/messages.ru.xlf index db59ed7..98528a4 100644 --- a/src/assets/i18n/messages.ru.xlf +++ b/src/assets/i18n/messages.ru.xlf @@ -1,4 +1,4 @@ - + @@ -744,8 +744,8 @@ Allow subscriptions setting - Subscriptions base path - Базовый путь подписки + Base bath for subscriptions + Базовый путь для подписок app/settings/settings.component.html 72 @@ -2584,6 +2584,598 @@ Type select + + Share file + Поделиться файлом + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + Перезагрузить сервер + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + Не удалось получить информацию о базе данных. Проверьте журналы сервера для получения дополнительной информации. + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + Передача БД в + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + Строка тестового подключения + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + Пример: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + Строка подключения MongoDB + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + Записи в одной таблице + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + Расположение базы данных: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + Разрешить категоризацию плейлистов + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + При включении этой настройки, если одно видео соответствует категории, весь список воспроизведения получит эту категорию. + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + База данных + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + Случайный порядок при проигрывании + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + Обрезать до (секунд) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + Обрезать от (секунд) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + Обрезать файл + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + + + Installation type: + Тип установки: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Watch content + Смотреть контент + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Rate limits your downloads to the specified amount. Ex: 200K + Ограничить скорость загрузки, например 200К + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Download for has been queued! + Загрузка для выла добавлена в очередь! + + src/app/main/main.component.ts + 469 + + + + Replace args + Поменять аргументы + + src/app/main/main.component.html + 116,117 + + Replace args + + + Autoplay + Автопроигрывание + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Both + Обa + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + File type + Тип файла + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Video only + Только видео + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + Только аудио + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + You must enable multi-user mode to access this tab. + Вы должны включить многопользовательский режим для доступа к этой вкладке. + + src/app/settings/settings.component.ts + 48 + + + + Use SponsorBlock API + Использовать SponsorBlock API + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Download rate limit + Ограничение скорости загрузки + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Max concurrent downloads + Максимальное количество одновременных загрузок + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + Ограничивает количество одновременных загрузок. Используйте -1 для безлимитной загрузки. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Generate NFO files + Генерировать файлы NFO + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Allow autoplay + Разрешить автопроигрывание + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Build date: + Дата постройки: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Clear + Стереть + + src/app/components/downloads/downloads.component.ts + 131 + + + + Complete + Закончено + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + Очистить законченны загрузки + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + Хотите ли вы очистить завершённые загрузки? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Downloading file + Загружается файл + + src/app/components/downloads/downloads.component.ts + 60 + + + + Creating download + Готовится загрузка + + src/app/components/downloads/downloads.component.ts + 58 + + + + Date + Дата + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + Название + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Clear + Стереть + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Close + Закрыть + + src/app/components/downloads/downloads.component.ts + 241 + + + + Pause + Пауза + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Show error + Показать ошибку + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Clear finished downloads + Очистить законченные загрузки + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + Restart + Перезапустить + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Progress + Прогресс + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Error for + Ошибка для + + src/app/components/downloads/downloads.component.ts + 238 + + + + Subscription + Подписка + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + Этап + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Actions + Действия + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Resume + Возобновить + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Resume all downloads + Возобновить все загрузки + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Pause all downloads + Приостановить все загрузки + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Enables a button to skip ads when viewing supported videos. + Включает кнопку для пропуска рекламы при просмотре поддерживаемых видео. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Generates NFO files with every download, primarily used by Kodi. + Генерирует файлы NFO при каждой загрузке, в основном используется Kodi. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Docker tag: + Тег Docker: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Copy to clipboard + Скопировать в буфер обмена + + src/app/components/downloads/downloads.component.ts + 240 + + + + Copied to clipboard! + Скопировано в буфер обмена! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Getting info + Получение информации + + src/app/components/downloads/downloads.component.ts + 59 + + + + Add to playlist + Добавить в плейлист + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Skip ad + Пропустить рекламу + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Commit hash: + Хэш коммита: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + diff --git a/src/assets/i18n/messages.te.xlf b/src/assets/i18n/messages.te.xlf new file mode 100644 index 0000000..aba533f --- /dev/null +++ b/src/assets/i18n/messages.te.xlf @@ -0,0 +1,3040 @@ + + + + + + About + గురించి + + src/app/app.component.html + 32 + + About menu label + + + Profile + ప్రొఫైల్ + + src/app/app.component.html + 19 + + Profile menu label + + + Dark + చీకటి + + src/app/app.component.html + 23 + + + src/app/settings/settings.component.html + 67 + + Dark mode toggle label + + + Home + ఇల్లు + + src/app/app.component.html + 43 + + Navigation menu Home Page title + + + Login + లాగిన్ + + src/app/app.component.html + 44 + + + src/app/components/login/login.component.html + 34 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 20 + + Navigation menu Login Page title + + + Subscriptions + సభ్యత్వాలు + + src/app/app.component.html + 45 + + Navigation menu Subscriptions Page title + + + Downloads + డౌన్‌లోడ్‌లు + + src/app/app.component.html + 46 + + Navigation menu Downloads Page title + + + Settings + సెట్టింగులు + + src/app/app.component.html + 49 + + + src/app/settings/settings.component.html + 1 + + Settings menu label + + + Download for has been queued! + కోసం డౌన్‌లోడ్ క్యూలో ఉంచబడింది! + + src/app/main/main.component.ts + 469 + + + + Only Audio + ధ్వని మాత్రమే + + src/app/main/main.component.html + 65,66 + + Only Audio checkbox + + + Download + డౌన్‌లోడ్ + + src/app/main/main.component.html + 79,80 + + Main download button + + + Quality + నాణ్యత + + src/app/main/main.component.html + 19,20 + + Quality select label + + + Use URL + URLని ఉపయోగించండి + + src/app/main/main.component.html + 51 + + YT search Use URL button for searched video + + + View + వీక్షించు + + src/app/main/main.component.html + 55,56 + + YT search View button for searched video + + + Autoplay + స్వీయ ప్లే + + src/app/main/main.component.html + 70,71 + + Autoplay checkbox + + + Cancel + రద్దుచేయి + + src/app/main/main.component.html + 84,85 + + Cancel download button + + + Advanced + ఆధునిక + + src/app/main/main.component.html + 96,97 + + Advanced download mode panel + + + Use custom args + కస్టమ్ ఆర్గ్‌లను ఉపయోగించండి + + src/app/main/main.component.html + 110,111 + + Use custom args checkbox + + + Replace args + ఆర్గ్‌లను భర్తీ చేయి + + src/app/main/main.component.html + 116,117 + + Replace args + + + Custom args + కస్టమ్ ఆర్గ్స్ + + src/app/main/main.component.html + 120 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 57 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 44 + + Custom args placeholder + + + No need to include URL, just everything after. Args are delimited using two commas like so: ,, + URLని చేర్చాల్సిన అవసరం లేదు, తర్వాత ప్రతిదీ. రెండు కామాలను ఉపయోగించి ఆర్గ్‌లు వేరు చేయబడ్డాయి: ,, + + src/app/main/main.component.html + 123,124 + + Custom Args input hint + + + Use custom output + కస్టమ్ అవుట్‌పుట్‌ని ఉపయోగించండి + + src/app/main/main.component.html + 131,132 + + Use custom output checkbox + + + Custom output + కస్టమ్ అవుట్‌పుట్‌ + + src/app/main/main.component.html + 135 + + Custom output placeholder + + + Documentation + దస్తావేజుల పట్టిక + + src/app/main/main.component.html + 137 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 69 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 56 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 47 + + + src/app/settings/settings.component.html + 117 + + Youtube-dl output template documentation link + + + Path is relative to the config download path. Don't include extension. + మార్గం కాన్ఫిగర్ డౌన్‌లోడ్ పాత్‌కి సంబంధించింది. పొడిగింపును చేర్చవద్దు. + + src/app/main/main.component.html + 138 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 70 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 57 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 48 + + Custom Output input hint + + + Crop file + ఫైల్‌ను కత్తిరించండి + + src/app/main/main.component.html + 160,161 + + Crop video checkbox + + + Simulated command: + అనుకరణ కమాండ్: + + src/app/main/main.component.html + 102,103 + + Simulated command label + + + Use authentication + ప్రమాణీకరణను ఉపయోగించండి + + src/app/main/main.component.html + 145,146 + + Use authentication checkbox + + + Username + వినియోగదారు పేరు + + src/app/main/main.component.html + 149 + + YT Username placeholder + + + Password + గుర్తింపు పదము + + src/app/main/main.component.html + 154 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 11 + + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 10 + + YT Password placeholder + + + Crop from (seconds) + (సెకన్లు) నుండి కత్తిరించు + + src/app/main/main.component.html + 164 + + Crop from placeholder + + + Crop to (seconds) + (సెకన్లు) వరకు కత్తిరించండి + + src/app/main/main.component.html + 169 + + Crop to placeholder + + + Create a playlist + ప్లేజాబితాను సృష్టించండి + + src/app/create-playlist/create-playlist.component.html + 1 + + Create a playlist dialog title + + + Name + పేరు + + src/app/create-playlist/create-playlist.component.html + 6 + + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 8 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 5 + + Playlist name placeholder + + + Type + రకం + + src/app/create-playlist/create-playlist.component.html + 11 + + Type select + + + Audio + ధ్వని + + src/app/create-playlist/create-playlist.component.html + 12 + + Audio + + + Video + వీడియో + + src/app/create-playlist/create-playlist.component.html + 13 + + Video + + + Audio files + ధ్వని ఫైల్స్ + + src/app/create-playlist/create-playlist.component.html + 19 + + Audio files title + + + Videos + వీడియోలు + + src/app/create-playlist/create-playlist.component.html + 20 + + + src/app/subscription/subscription/subscription.component.html + 29 + + Videos title + + + Subscribe to playlist or channel + ప్లేజాబితా లేదా ఛానెల్‌కు సభ్యత్వం పొందండి + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 1 + + Subscribe dialog title + + + URL + URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 8 + + + src/app/settings/settings.component.html + 10 + + Subscription URL input placeholder + + + The playlist or channel URL + ప్లేజాబితా లేదా ఛానెల్ URL + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 9 + + Subscription URL input hint + + + Custom name + కస్టమ్ పేరు + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 19 + + Subscription custom name placeholder + + + Download all uploads + అన్ని అప్‌లోడ్‌లను డౌన్‌లోడ్ చేయండి + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 23 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 10 + + Download all uploads subscription setting + + + Max quality + గరిష్ట నాణ్యత + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 40 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 32 + + Max quality placeholder + + + Audio-only mode + ధ్వని-మాత్రమే మోడ్ + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 47 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 27 + + Streaming-only mode + + + Streaming-only mode + స్ట్రీమింగ్-మాత్రమే మోడ్ + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 52 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 39 + + Streaming-only mode + + + These are added after the standard args. + ఇవి ప్రామాణిక ఆర్గ్‌ల తర్వాత జోడించబడతాయి. + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 60 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 47 + + Custom args hint + + + Custom file output + కస్టమ్ ఫైల్ అవుట్‌పుట్ + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 66 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 53 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 44 + + Subscription custom file output placeholder + + + Cancel + రద్దుచేయి + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 79 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 84 + + + src/app/dialogs/confirm-dialog/confirm-dialog.component.html + 16 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 66 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 54 + + + src/app/settings/settings.component.html + 490 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/downloads/downloads.component.html + 61 + + + src/app/components/modify-users/modify-users.component.html + 61 + + Subscribe cancel button + + + Subscribe + సభ్యత్వం పొందండి + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + Subscribe button + + + Download videos uploaded in the last + చివరిగా అప్‌లోడ్ చేసిన వీడియోలను డౌన్‌లోడ్ చేయండి + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 26 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 13 + + Download time range prefix + + + Type: + రకం: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 5 + + Subscription type property + + + URL: + URL: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 9 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 9 + + Subscription URL property + + + ID: + ID: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 13 + + + src/app/file-card/file-card.component.html + 7 + + + src/app/download-item/download-item.component.html + 4 + + Subscription ID property + + + Close + మూసివేయి + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 23 + + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 35 + + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 17 + + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 18 + + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 40 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 70 + + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 29 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 27 + + + src/app/components/manage-user/manage-user.component.html + 30 + + + src/app/components/manage-role/manage-role.component.html + 18 + + Close subscription info button + + + Export Archive + ఆర్కైవ్ ని ఎగుమతిచేయి + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 24 + + Export Archive button + + + Unsubscribe + సభ్యత్వాన్ని నిష్క్రమించండి + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 26 + + Unsubscribe button + + + (Paused) + (పాజ్ చేయబడింది) + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 1 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + + src/app/subscriptions/subscriptions.component.html + 12 + + + src/app/subscriptions/subscriptions.component.html + 34 + + + src/app/subscription/subscription/subscription.component.html + 5 + + Paused suffix + + + Archive: + ఆర్కైవ్: + + src/app/dialogs/subscription-info-dialog/subscription-info-dialog.component.html + 17 + + Subscription ID property + + + Name: + పేరు: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 5 + + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 6 + + Video name property + + + Uploader: + అప్‌లోడర్: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 13 + + Video ID property + + + File size: + ఫైల్ పరిమాణం: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 17 + + Video file size property + + + Path: + మార్గం: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 21 + + Video path property + + + Upload Date: + అప్‌లోడ్ తేదీ: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 25 + + Video upload date property + + + Category: + వర్గం: + + src/app/dialogs/video-info-dialog/video-info-dialog.component.html + 29 + + Category property + + + Modify youtube-dl args + యూట్యూబ్-dl ఆర్గ్‌లను సవరించండి + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 1 + + Modify args title + + + Simulated new args + కొత్త ఆర్గ్‌లను అనుకరించారు + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 8 + + Simulated args title + + + Add an arg + ఒక ఆర్గ్ జోడించండి + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 34 + + Add arg card title + + + Search by category + వర్గం వారీగా శోధించండి + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 60 + + Search args by category button + + + Use arg value + ఆర్గ్ విలువను ఉపయోగించండి + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 64 + + Use arg value checkbox + + + Add arg + ఆర్గ్ జోడించండి + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 73 + + Search args by category button + + + Modify + సవరించు + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 85 + + Arg modifier modify button + + + Arg value + ఆర్గ్ విలువ + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 68 + + Arg value placeholder + + + Updater + అప్‌డేటర్ + + src/app/dialogs/update-progress-dialog/update-progress-dialog.component.html + 1 + + Update progress dialog title + + + Register a user + వినియోగదారుని నమోదు చేయండి + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 1 + + Register user dialog title + + + User name + వినియోగదారు పేరు + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 6 + + User name placeholder + + + Register + నమోదుచేయండి + + src/app/dialogs/add-user-dialog/add-user-dialog.component.html + 17 + + + src/app/components/login/login.component.html + 38 + + Register user button + + + Upload new cookies + కొత్త కుక్కీలను అప్‌లోడ్ చేయండి + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 1 + + Cookies uploader dialog title + + + NOTE: Uploading new cookies will override your previous cookies. Also note that cookies are instance-wide, not per-user. + గమనిక: కొత్త కుక్కీలను అప్‌లోడ్ చేయడం వలన మీ మునుపటి కుక్కీలు భర్తీ చేయబడతాయి. కుక్కీలు ఇన్‌స్టాన్స్-వైడ్ అని కూడా గమనించండి, ఒక్కో యూజర్ కాదు. + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 20 + + Cookies upload warning + + + Drag and Drop + డ్రాగ్ మరియు డ్రాప్ + + src/app/dialogs/cookies-uploader-dialog/cookies-uploader-dialog.component.html + 11 + + Drag and Drop + + + Modify playlist + ప్లేజాబితాను సవరించండి + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 1 + + Modify playlist dialog title + + + Save + సేవ్ + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 43 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 68 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 56 + + + src/app/settings/settings.component.html + 487 + + + src/app/components/modify-users/modify-users.component.html + 58 + + Save + + + Randomize order when playing + ప్లే అవుతున్నపుడు క్రమాన్ని యాదృచ్ఛికంగా మార్చండి + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Add content + కంటెంట్‌ని జోడించండి + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 24 + + Add content + + + Normal order + సాధారణ క్రమం + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 18 + + Normal order + + + Reverse order + రివర్స్ క్రమం + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 19 + + Reverse order + + + My videos + నా వీడియోలు + + src/app/components/recent-videos/recent-videos.component.html + 20 + + My videos title + + + Search + శోధన + + src/app/components/recent-videos/recent-videos.component.html + 24 + + + src/app/components/modify-users/modify-users.component.html + 7 + + + src/app/subscription/subscription/subscription.component.html + 33 + + Files search placeholder + + + File type + ఫైల్ రకం + + src/app/components/recent-videos/recent-videos.component.html + 52 + + File type + + + Both + రెండు + + src/app/components/recent-videos/recent-videos.component.html + 54 + + Both + + + Video only + వీడియో మాత్రమే + + src/app/components/recent-videos/recent-videos.component.html + 55 + + Video only + + + Audio only + ధ్వని మాత్రమే + + src/app/components/recent-videos/recent-videos.component.html + 56 + + Audio only + + + No videos found. + వీడియోలు ఏవీ కనుగొనబడలేదు. + + src/app/components/recent-videos/recent-videos.component.html + 38 + + No videos found + + + Editing + సవరించుతుంది + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 1 + + Edit subscription dialog title prefix + + + Paused + పాజ్ చేయబడింది + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 7 + + Paused subscription setting + + + Editing category + వర్గాన్ని సవరించుతుంది + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 1 + + Editing category dialog title + + + Rules + నియమాలు + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 10 + + Rules + + + Add new rule + కొత్త నియమాన్ని జోడించండి + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 39 + + Add new rule tooltip + + + Download Twitch Chat + ట్విచ్ చాట్‌ని డౌన్‌లోడ్ చేయండి + + src/app/components/twitch-chat/twitch-chat.component.html + 10 + + Download Twitch Chat button + + + Edit + సవరించు + + src/app/file-card/file-card.component.html + 19 + + + src/app/components/unified-file-card/unified-file-card.component.html + 43 + + Playlist edit button + + + Delete + తొలగించు + + src/app/file-card/file-card.component.html + 20 + + + src/app/file-card/file-card.component.html + 25 + + + src/app/components/unified-file-card/unified-file-card.component.html + 39 + + + src/app/components/unified-file-card/unified-file-card.component.html + 45 + + Delete playlist + + + Info + సమాచారం + + src/app/file-card/file-card.component.html + 24 + + + src/app/components/unified-file-card/unified-file-card.component.html + 24 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 7 + + Video info button + + + Count: + సంఖ్య: + + src/app/file-card/file-card.component.html + 8 + + Playlist video count + + + Delete and blacklist + తొలగించి బ్లాక్‌లిస్ట్ చేయండి + + src/app/file-card/file-card.component.html + 26 + + + src/app/components/unified-file-card/unified-file-card.component.html + 40 + + Delete and blacklist video button + + + views + వీక్షణలు + + src/app/player/player.component.html + 16 + + View count label + + + The download was successful + డౌన్‌లోడ్ విజయవంతమైంది + + src/app/download-item/download-item.component.html + 8 + + + src/app/download-item/download-item.component.html + 8 + + download successful tooltip + + + An error has occurred + ఒక లోపము సంభవించినది + + src/app/download-item/download-item.component.html + 9 + + + src/app/download-item/download-item.component.html + 9 + + download error tooltip + + + Details + వివరాలు + + src/app/download-item/download-item.component.html + 18 + + Details + + + An error has occurred: + ఒక లోపము సంభవించినది: + + src/app/download-item/download-item.component.html + 27 + + Error label + + + Download start: + డౌన్‌లోడ్ ప్రారంభం: + + src/app/download-item/download-item.component.html + 32 + + Download start label + + + Download end: + డౌన్‌లోడ్ ముగింపు: + + src/app/download-item/download-item.component.html + 35 + + Download end label + + + File path(s): + ఫైల్ మార్గం(ఎస్): + + src/app/download-item/download-item.component.html + 38 + + File path(s) label + + + Your subscriptions + మీ సభ్యత్వాలు + + src/app/subscriptions/subscriptions.component.html + 3 + + Subscriptions title + + + Channels + ఛనల్స్ + + src/app/subscriptions/subscriptions.component.html + 8 + + Subscriptions channels title + + + Playlists + ప్లేజాబితాలు + + src/app/subscriptions/subscriptions.component.html + 30 + + Subscriptions playlists title + + + Name not available. Channel retrieval in progress. + పేరు అందుబాటులో లేదు. ఛానెల్ పునరుద్ధరణ పురోగతిలో ఉంది. + + src/app/subscriptions/subscriptions.component.html + 14 + + Subscription playlist not available text + + + You have no channel subscriptions. + మీకు ఛానెల్ సభ్యత్వాలు లేవు. + + src/app/subscriptions/subscriptions.component.html + 27 + + No channel subscriptions text + + + Name not available. Playlist retrieval in progress. + పేరు అందుబాటులో లేదు. ప్లేజాబితా పునరుద్ధరణ ప్రోగ్రెస్‌లో ఉంది. + + src/app/subscriptions/subscriptions.component.html + 36 + + Subscription playlist not available text + + + You have no playlist subscriptions. + మీకు ప్లేజాబితా సభ్యత్వాలు లేవు. + + src/app/subscriptions/subscriptions.component.html + 46 + + No playlist subscriptions text + + + You must enable multi-user mode to access this tab. + ఈ ట్యాబ్‌ని యాక్సెస్ చేయడానికి మీరు తప్పనిసరిగా బహుళ-వినియోగదారు మోడ్‌ను ప్రారంభించాలి. + + src/app/settings/settings.component.ts + 48 + + + + Main + ప్రధాన + + src/app/settings/settings.component.html + 4 + + Main settings label + + + Downloader + డౌన్‌లోడర్ + + src/app/settings/settings.component.html + 94 + + Downloader settings label + + + Extra + అదనపు + + src/app/settings/settings.component.html + 198 + + Extra settings label + + + Database + డేటాబేస్ + + src/app/settings/settings.component.html + 303 + + Database settings label + + + Advanced + ఆధునిక + + src/app/settings/settings.component.html + 339 + + Host settings label + + + Logs + లాగ్స్ + + src/app/settings/settings.component.html + 476 + + + src/app/settings/settings.component.html + 476 + + Logs settings label + + + URL this app will be accessed from, without the port. + URL ఈ యాప్ పోర్ట్ లేకుండా యాక్సెస్ చేయబడుతుంది. + + src/app/settings/settings.component.html + 11 + + URL setting input hint + + + Port + పోర్ట్ + + src/app/settings/settings.component.html + 16 + + Port input placeholder + + + The desired port. Default is 17442. + కావలసిన పోర్ట్. డిఫాల్ట్ 17442. + + src/app/settings/settings.component.html + 17 + + Port setting input hint + + + Multi-user mode + బహుళ-వినియోగదారు మోడ్ + + src/app/settings/settings.component.html + 26 + + Multi user mode setting + + + Users base path + వినియోగదారుల ఆధార మార్గం + + src/app/settings/settings.component.html + 30 + + Users base path placeholder + + + Base path for users and their downloaded videos. + వినియోగదారులు మరియు వారి డౌన్‌లోడ్ చేసిన వీడియోల కోసం ఆధార మార్గం. + + src/app/settings/settings.component.html + 31 + + Users base path hint + + + Allow subscriptions + సభ్యత్వాలను అనుమతించండి + + src/app/settings/settings.component.html + 40 + + Allow subscriptions setting + + + Subscriptions base path + సభ్యత్వాల ఆధార మార్గం + + src/app/settings/settings.component.html + 44 + + Subscriptions base path input setting placeholder + + + Base path for videos from your subscribed channels and playlists. It is relative to YTDL-Material's root folder. + మీ సభ్యత్వం పొందిన ఛానెల్‌లు మరియు ప్లేజాబితాల నుండి వీడియోల కోసం ప్రాథమిక మార్గం. ఇది YTDL-పదార్ధాలు యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. + + src/app/settings/settings.component.html + 45 + + Subscriptions base path setting input hint + + + Check interval + ఇంటర్వెల్ తనిఖీ చేయండి + + src/app/settings/settings.component.html + 50 + + Check interval input setting placeholder + + + Unit is seconds, only include numbers. + యూనిట్ సెకన్లు, సంఖ్యలను మాత్రమే చేర్చండి. + + src/app/settings/settings.component.html + 51 + + Check interval setting input hint + + + Sometimes new videos are downloaded before being fully processed. This setting will mean new videos will be checked for a higher quality version the following day. + కొన్నిసార్లు పూర్తిగా ప్రాసెస్ చేయడానికి ముందే కొత్త వీడియోలు డౌన్‌లోడ్ చేయబడతాయి. ఈ సెట్టింగ్ అంటే కొత్త వీడియోలు మరుసటి రోజు అధిక నాణ్యత వెర్షన్ కోసం తనిఖీ చేయబడతాయని అర్థం. + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads tooltip + + + Redownload fresh uploads + తాజా అప్‌లోడ్‌లను మళ్లీ డౌన్‌లోడ్ చేయండి + + src/app/settings/settings.component.html + 55 + + Redownload fresh uploads + + + Theme + థీమ్ + + src/app/settings/settings.component.html + 64 + + Theme select label + + + Default + డిఫాల్ట్ + + src/app/settings/settings.component.html + 66 + + Default theme label + + + Allow theme change + థీమ్ మార్పును అనుమతించండి + + src/app/settings/settings.component.html + 72 + + Allow theme change setting + + + Language + భాష + + src/app/settings/settings.component.html + 81 + + Language select label + + + Audio folder path + ధ్వని ఫోల్డర్ మార్గం + + src/app/settings/settings.component.html + 101 + + Audio folder path input placeholder + + + Path for audio only downloads. It is relative to YTDL-Material's root folder. + ఆడియో మాత్రమే డౌన్‌లోడ్‌ల కోసం మార్గం. ఇది YTDL-పదార్ధాలు యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. + + src/app/settings/settings.component.html + 102 + + Aduio path setting input hint + + + Video folder path + వీడియో ఫోల్డర్ మార్గం + + src/app/settings/settings.component.html + 108 + + Video folder path input placeholder + + + Path for video downloads. It is relative to YTDL-Material's root folder. + వీడియో డౌన్‌లోడ్‌ల కోసం మార్గం. ఇది YTDL-మెటీరియల్స్ యొక్క రూట్ ఫోల్డర్‌కు సంబంధించింది. + + src/app/settings/settings.component.html + 109 + + Video path setting input hint + + + Default file output + డిఫాల్ట్ ఫైల్ అవుట్‌పుట్ + + src/app/settings/settings.component.html + 115 + + Default file output placeholder + + + Path is relative to the above download paths. Don't include extension. + పై డౌన్‌లోడ్ మార్గము సంబంధించి మార్గం ఉంది. పొడిగింపును చేర్చవద్దు. + + src/app/settings/settings.component.html + 118 + + Custom Output input hint + + + Global custom args + గ్లోబల్ కస్టమ్ ఆర్గ్స్ + + src/app/settings/settings.component.html + 125 + + Custom args input placeholder + + + Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, + ఇల్లు పేజీలో డౌన్‌లోడ్‌ల కోసం గ్లోబల్ కస్టమ్ ఆర్గ్‌లు. రెండు కామాలను ఉపయోగించి ఆర్గ్‌లు వేరు చేయబడ్డాయి: ,, + + src/app/settings/settings.component.html + 126 + + Custom args setting input hint + + + Categories + వర్గాలు + + src/app/settings/settings.component.html + 136 + + Categories + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + ఈ సెట్టింగ్ ప్రారంభించబడితే, ఒక వీడియో ఒక వర్గానికి సరిపోలితే, మొత్తం ప్లేజాబితా ఆ వర్గాన్ని స్వీకరిస్తుంది. + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting tooltip + + + Allow playlist categorization + ప్లేజాబితా వర్గీకరణను అనుమతించండి + + src/app/settings/settings.component.html + 150 + + Allow playlist categorization setting label + + + Use youtube-dl archive + youtube-dl ఆర్కైవ్‌ని ఉపయోగించండి + + src/app/settings/settings.component.html + 158 + + Use youtubedl archive setting + + + Include thumbnail + సూక్ష్మచిత్రాన్ని చేర్చండి + + src/app/settings/settings.component.html + 162 + + Include thumbnail setting + + + Include metadata + మెటాడేటాను చేర్చండి + + src/app/settings/settings.component.html + 166 + + Include metadata setting + + + Max concurrent downloads + గరిష్టంగా ఏకకాల డౌన్‌లోడ్‌లు + + src/app/settings/settings.component.html + 175 + + Max concurrent downloads + + + Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. + ఏకకాలంలో డౌన్‌లోడ్ చేయగల డౌన్‌లోడ్‌ల పరిమాణాన్ని పరిమితం చేస్తుంది. పరిమితి లేకుండా -1 ఉపయోగించండి. + + src/app/settings/settings.component.html + 176 + + Max concurrent downloads input hint + + + Download rate limit + డౌన్‌లోడ్ రేట్ పరిమితి + + src/app/settings/settings.component.html + 181 + + Download rate limit input placeholder + + + Rate limits your downloads to the specified amount. Ex: 200K + రేట్ మీ డౌన్‌లోడ్‌లను పేర్కొన్న మొత్తానికి పరిమితం చేస్తుంది. ఉదా: 200K + + src/app/settings/settings.component.html + 182 + + Download rate limit input hint + + + Kill all downloads + అన్ని డౌన్‌లోడ్‌లను చంపండి + + src/app/settings/settings.component.html + 191 + + Kill all downloads button + + + Top title + అగ్ర శీర్షిక + + src/app/settings/settings.component.html + 204 + + Top title input placeholder + + + File manager enabled + ఫైల్ మేనేజర్ ప్రారంభించబడింది + + src/app/settings/settings.component.html + 209 + + File manager enabled setting + + + Downloads manager enabled + డౌన్‌లోడ్‌ల మేనేజర్ ప్రారంభించబడింది + + src/app/settings/settings.component.html + 212 + + Downloads manager enabled setting + + + Allow quality select + నాణ్యత ఎంపికను అనుమతించండి + + src/app/settings/settings.component.html + 215 + + Allow quality seelct setting + + + Download only mode + డౌన్‌లోడ్ మోడ్ మాత్రమే + + src/app/settings/settings.component.html + 218 + + Download only mode setting + + + Allow autoplay + స్వయం ప్లేను అనుమతించండి + + src/app/settings/settings.component.html + 221 + + Allow autoplay setting + + + Enable Public API + ప్రజా APIని ప్రారంభించండి + + src/app/settings/settings.component.html + 229 + + Enable Public API key setting + + + Public API Key + ప్రజా API తాళం + + src/app/settings/settings.component.html + 234 + + Public API Key setting placeholder + + + View documentation + డాక్యుమెంటేషన్‌ని వీక్షించండి + + src/app/settings/settings.component.html + 235 + + View API docs setting hint + + + This will delete your old API key! + ఇది మీ పాత API తాళంని తొలగిస్తుంది! + + src/app/settings/settings.component.html + 239 + + delete api key tooltip + + + Generate + ఉత్పత్తి + + src/app/settings/settings.component.html + 239 + + Generate key button + + + Use YouTube API + యూట్యూబ్ APIని ఉపయోగించండి + + src/app/settings/settings.component.html + 248 + + Use YouTube API setting + + + Youtube API Key + యూట్యూబ్ API తాళం + + src/app/settings/settings.component.html + 252 + + Youtube API Key setting placeholder + + + Generating a key is easy! + తాళంని రూపొందించడం సులభం! + + src/app/settings/settings.component.html + 253 + + + src/app/settings/settings.component.html + 265 + + Youtube API Key setting hint + + + Use Twitch API + ట్విచ్ APIని ఉపయోగించండి + + src/app/settings/settings.component.html + 257 + + Use Twitch API setting + + + Twitch API Key + ట్విచ్ API తాళం + + src/app/settings/settings.component.html + 264 + + Twitch API Key setting placeholder + + + Also known as a Client ID. + క్లయింట్ ID అని కూడా అంటారు. + + src/app/settings/settings.component.html + 265 + + Twitch API Key setting hint AKA preamble + + + Enables a button to skip ads when viewing supported videos. + మద్దతు ఉన్న వీడియోలను వీక్షిస్తున్నప్పుడు ప్రకటనలను దాటవేయడానికి బటన్‌ను ప్రారంభిస్తుంది. + + src/app/settings/settings.component.html + 269 + + SponsorBlock API tooltip + + + Use SponsorBlock API + పోషక సంస్థ బ్లాక్ APIని ఉపయోగించండి + + src/app/settings/settings.component.html + 269 + + Use SponsorBlock API setting + + + Generates NFO files with every download, primarily used by Kodi. + ప్రతి డౌన్‌లోడ్‌తో NFO ఫైల్‌లను రూపొందిస్తుంది, ప్రధానంగా కోడి ద్వారా ఉపయోగించబడుతుంది. + + src/app/settings/settings.component.html + 272 + + Generate NFO files tooltip + + + Generate NFO files + NFO ఫైల్‌లను రూపొందించు + + src/app/settings/settings.component.html + 272 + + Generate NFO files setting + + + Auto-download Twitch Chat + ట్విచ్ చాట్‌ని స్వయం-డౌన్‌లోడ్ చేయండి + + src/app/settings/settings.component.html + 260 + + Auto download Twitch Chat setting + + + Click here + ఇక్కడ నొక్కండి + + src/app/settings/settings.component.html + 281 + + + src/app/settings/settings.component.html + 287 + + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + Chrome ext click here + + + to download the official YoutubeDL-Material Chrome extension manually. + అధికారిక యూట్యూబ్DL-పదార్ధాలు క్రోమ్ పొడిగింపును మాన్యువల్‌గా డౌన్‌లోడ్ చేయడానికి.. + + src/app/settings/settings.component.html + 281 + + Chrome click here suffix + + + You must manually load the extension and modify the extension's settings to set the frontend URL. + ఫ్రంటెండ్ URLని సెట్ చేయడానికి మీరు తప్పనిసరిగా పొడగింపును మాన్యువల్‌గా లోడ్ చేయాలి మరియు పొడగింపు సెట్టింగ్‌లను సవరించాలి. + + src/app/settings/settings.component.html + 282 + + Chrome setup suffix + + + to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. + అధికారిక యూట్యూబ్DL-పదార్ధాలు ఫైర్‌ఫాక్స్ పొడిగింపును ఫైర్‌ఫాక్స్ పొడిగింపుల పేజీ నుండి ఇన్‌స్టాల్ చేయడానికి. + + src/app/settings/settings.component.html + 287 + + Firefox click here suffix + + + Detailed setup instructions. + వివరణాత్మక సెటప్ సూచనలు. + + src/app/settings/settings.component.html + 288 + + Firefox setup prefix link + + + Not much is required other than changing the extension's settings to set the frontend URL. + ఫ్రంటెండ్ URLని సెట్ చేయడానికి ఎక్స్‌టెన్షన్ సెట్టింగ్‌లను మార్చడం మినహా ఎక్కువ అవసరం లేదు. + + src/app/settings/settings.component.html + 288 + + Firefox setup suffix + + + Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. + దిగువ లింక్‌ను మీ బుక్‌మార్క్‌లకు లాగండి మరియు ఇంకా పని చేయడానికి సిద్ధం! మీరు డౌన్‌లోడ్ చేయాలనుకుంటున్న యూట్యూబ్ వీడియోకి నావిగేట్ చేసి, బుక్‌మార్క్‌పై నొక్కండి. + + src/app/settings/settings.component.html + 293 + + Bookmarklet instructions + + + Generate 'audio only' bookmarklet + 'ధ్వని మాత్రమే' బుక్‌మార్క్‌లెట్‌ని రూపొందించండి + + src/app/settings/settings.component.html + 294 + + Generate audio only bookmarklet checkbox + + + Database location: + డేటాబేస్ స్థానం: + + src/app/settings/settings.component.html + 309 + + Database location label + + + Records per table + ఒకో పట్టికకు రికార్డులు + + src/app/settings/settings.component.html + 310 + + Records per table label + + + MongoDB Connection String + మొంగోDB కనెక్షన్ స్ట్రింగ్ + + src/app/settings/settings.component.html + 318 + + MongoDB Connection String + + + Example: + ఉదాహరణ: + + src/app/settings/settings.component.html + 319 + + MongoDB Connection String setting hint AKA preamble + + + Test connection string + పరీక్ష కనెక్షన్ స్ట్రింగ్ + + src/app/settings/settings.component.html + 323 + + Test connection string button + + + Transfer DB to + ఇక్కడికి DBని బదిలీ చేయండి + + src/app/settings/settings.component.html + 327 + + Transfer DB button + + + Database information could not be retrieved. Check the server logs for more information. + డేటాబేస్ సమాచారాన్ని తిరిగి పొందడం సాధ్యం కాలేదు. మరింత సమాచారం కోసం సర్వర్ లాగ్‌లను తనిఖీ చేయండి. + + src/app/settings/settings.component.html + 331 + + Database info not retrieved error message + + + Select a downloader + డౌన్‌లోడర్‌ను ఎంచుకోండి + + src/app/settings/settings.component.html + 345 + + Default downloader select label + + + Use default downloading agent + డిఫాల్ట్ డౌన్‌లోడ్ ఏజెంట్‌ని ఉపయోగించండి + + src/app/settings/settings.component.html + 354 + + Use default downloading agent setting + + + Select a download agent + డౌన్‌లోడ్ ఏజెంట్‌ను ఎంచుకోండి + + src/app/settings/settings.component.html + 358 + + Custom downloader select label + + + Log Level + లాగ్ స్థాయి + + src/app/settings/settings.component.html + 372 + + Log Level label + + + Login expiration + లాగిన్ గడువు + + src/app/settings/settings.component.html + 384 + + Login expiration select label + + + Allow advanced download + అధునాతన డౌన్‌లోడ్‌ను అనుమతించండి + + src/app/settings/settings.component.html + 395 + + Allow advanced downloading setting + + + Use Cookies + కుక్కీలను ఉపయోగించండి + + src/app/settings/settings.component.html + 403 + + Use cookies setting + + + Set Cookies + కుకీలను సెట్ చేయండి + + src/app/settings/settings.component.html + 404 + + Set cookies button + + + Restart server + సర్వర్ ను పనఃప్రారంభించండి + + src/app/settings/settings.component.html + 416 + + Restart server button + + + Users + వినియోగదారులు + + src/app/settings/settings.component.html + 425 + + Users settings label + + + Allow user registration + వినియోగదారు నమోదును అనుమతించండి + + src/app/settings/settings.component.html + 431 + + Allow registration setting + + + Auth method + ప్రమాణీకరణ పద్ధతి + + src/app/settings/settings.component.html + 435 + + Auth method select + + + Internal + అంతర్గత + + src/app/settings/settings.component.html + 437 + + Internal auth method + + + LDAP + LDAP + + src/app/settings/settings.component.html + 440 + + LDAP auth method + + + LDAP URL + LDAP URL + + src/app/settings/settings.component.html + 447 + + LDAP URL + + + Bind DN + బైండ్ DN + + src/app/settings/settings.component.html + 452 + + Bind DN + + + Bind Credentials + పరిచయ పత్రాలను బైండ్ చేయండి + + src/app/settings/settings.component.html + 457 + + Bind Credentials + + + Search Base + శోధన బేస్ + + src/app/settings/settings.component.html + 462 + + Search Base + + + Search Filter + శోధన ఫిల్టర్ + + src/app/settings/settings.component.html + 467 + + Search Filter + + + About YoutubeDL-Material + యూట్యూబ్DL-పదార్థం గురించి + + src/app/dialogs/about-dialog/about-dialog.component.html + 1 + + About dialog title + + + is an open-source YouTube downloader built under Google's Material Design specifications. You can seamlessly download your favorite videos as video or audio files, and even subscribe to your favorite channels and playlists to keep updated with their new videos. + గూగుల్ యొక్క పదార్ధం డిజైన్ స్పెసిఫికేషన్‌ల క్రింద రూపొందించబడిన ఓపెన్ సోర్స్ యూట్యూబ్ డౌన్‌లోడ్. మీరు మీకు ఇష్టమైన వీడియోలను వీడియో లేదా ధ్వని ఫైల్‌లుగా సజావుగా డౌన్‌లోడ్ చేసుకోవచ్చు మరియు మీకు ఇష్టమైన ఛానెల్‌లు మరియు ప్లేజాబితాల కొత్త వీడియోలతో అప్‌డేట్ అవ్వడానికి సభ్యత్వం చేసుకోవచ్చు. + + src/app/dialogs/about-dialog/about-dialog.component.html + 12 + + About first paragraph + + + has some awesome features included! An extensive API, Docker support, and localization (translation) support. Read up on all the supported features by clicking on the GitHub icon above. + కొన్ని అద్భుతమైన లక్షణాలను కలిగి ఉంది! విస్తృతమైన API, డాకర్ మద్దతు మరియు స్థానికీకరణ (అనువాదం) మద్దతు. ఎగువన ఉన్న గిట్ హబ్ చిహ్నంపై క్లిక్ చేయడం ద్వారా అన్ని మద్దతు ఉన్న ఫీచర్‌లను చదవచ్చు. + + src/app/dialogs/about-dialog/about-dialog.component.html + 15 + + About second paragraph + + + Installed version: + ఇన్‌స్టాల్ చేసిన వెర్షన్: + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Version label + + + Installation type: + ఇన్‌స్టాల్ రకం: + + src/app/dialogs/about-dialog/about-dialog.component.html + 25 + + Installation type + + + Commit hash: + కమిట్ హాష్: + + src/app/dialogs/about-dialog/about-dialog.component.html + 31 + + Commit hash + + + Build date: + నిర్మాణ తేదీ: + + src/app/dialogs/about-dialog/about-dialog.component.html + 33 + + Build date + + + Found a bug or have a suggestion? + సమస్య కనుగొంనారా లేదా ఏదైనా సూచన ఉందా? + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug prefix + + + to create an issue! + జారిను సృష్టించడానికి! + + src/app/dialogs/about-dialog/about-dialog.component.html + 36 + + About bug suffix + + + Checking for updates... + నవీకరణల కోసం తనిఖీ చేస్తోంది... + + src/app/dialogs/about-dialog/about-dialog.component.html + 20 + + Checking for updates text + + + Update available + నవీకరణ అందుబాటులో ఉంది + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + View latest update + + + You can update from the settings menu. + మీరు సెట్టింగ్‌ల మెను నుండి నవీకరించవచ్చు. + + src/app/dialogs/about-dialog/about-dialog.component.html + 21 + + Update through settings menu hint + + + Docker tag: + డాకర్ ట్యాగ్: + + src/app/dialogs/about-dialog/about-dialog.component.html + 28 + + Docker tag + + + Select a version: + సంస్కరణను ఎంచుకోండి: + + src/app/updater/updater.component.html + 3 + + Select a version + + + Enable sharing + భాగస్వామ్యాన్ని ప్రారంభించండి + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 9 + + Enable sharing checkbox + + + Use timestamp + సమయం స్టాంప్ ఉపయోగించండి + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 12 + + Use timestamp + + + Seconds + క్షణాలు + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 14 + + Seconds + + + Copy to clipboard + క్లిప్‌బోర్డ్‌కి కాపీ చేయండి + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 23 + + Copy to clipboard button + + + Share playlist + ప్లేజాబితాను భాగస్వామ్యం చేయండి + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 2 + + Share playlist dialog title + + + Share file + ఫైళ్లను భాగస్వామ్యం చేయండి + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Creating download + డౌన్‌లోడ్ సృష్టిస్తోంది + + src/app/components/downloads/downloads.component.ts + 58 + + + + Getting info + సమాచారాన్ని పొందుతోంది + + src/app/components/downloads/downloads.component.ts + 59 + + + + Downloading file + ఫైల్‌ని డౌన్‌లోడ్ చేస్తోంది + + src/app/components/downloads/downloads.component.ts + 60 + + + + Complete + పూర్తయింది + + src/app/components/downloads/downloads.component.ts + 61 + + + + Clear finished downloads + పూర్తయిన డౌన్‌లోడ్‌లను క్లియర్ చేయండి + + src/app/components/downloads/downloads.component.ts + 129 + + + + Would you like to clear your finished downloads? + మీరు పూర్తయిన మీ డౌన్‌లోడ్‌లను క్లియర్ చేయాలనుకుంటున్నారా? + + src/app/components/downloads/downloads.component.ts + 130 + + + + Clear + క్లియర్ + + src/app/components/downloads/downloads.component.ts + 131 + + + + Error for + కోసం లోపం + + src/app/components/downloads/downloads.component.ts + 238 + + + + Copy to clipboard + క్లిప్‌బోర్డ్‌కి కాపీ చేయండి + + src/app/components/downloads/downloads.component.ts + 240 + + + + Close + మూసివేయి + + src/app/components/downloads/downloads.component.ts + 241 + + + + Copied to clipboard! + క్లిప్‌బోర్డ్‌కి కాపీ చేయబడింది! + + src/app/components/downloads/downloads.component.ts + 249 + + + + Date + తేది + + src/app/components/downloads/downloads.component.html + 7 + + Date + + + Title + శీర్షిక + + src/app/components/downloads/downloads.component.html + 13 + + Title + + + Subscription + సభ్యత్వం + + src/app/components/downloads/downloads.component.html + 23 + + Subscription + + + Stage + వేదిక + + src/app/components/downloads/downloads.component.html + 36 + + Stage + + + Progress + పురోగతి + + src/app/components/downloads/downloads.component.html + 42 + + Progress + + + Actions + చర్యలు + + src/app/components/downloads/downloads.component.html + 55 + + Actions + + + Clear + క్లియర్ + + src/app/components/downloads/downloads.component.html + 68 + + + src/app/components/downloads/downloads.component.html + 68 + + Clear + + + Pause + పాజ్ + + src/app/components/downloads/downloads.component.html + 59 + + + src/app/components/downloads/downloads.component.html + 59 + + Pause + + + Resume + పునఃప్రారంభించ్చు + + src/app/components/downloads/downloads.component.html + 60 + + + src/app/components/downloads/downloads.component.html + 60 + + Resume + + + Watch content + కంటెంట్‌ని చూడండి + + src/app/components/downloads/downloads.component.html + 64 + + + src/app/components/downloads/downloads.component.html + 64 + + Watch content + + + Show error + లోపం చూపించు + + src/app/components/downloads/downloads.component.html + 65 + + + src/app/components/downloads/downloads.component.html + 65 + + Show error + + + Restart + పునఃప్రారంభించండి + + src/app/components/downloads/downloads.component.html + 66 + + Restart + + + Pause all downloads + అన్ని డౌన్‌లోడ్‌లను పాజ్ చేయండి + + src/app/components/downloads/downloads.component.html + 83 + + Pause all downloads + + + Resume all downloads + అన్ని డౌన్‌లోడ్‌లను పునఃప్రారంభించండి + + src/app/components/downloads/downloads.component.html + 84 + + Resume all downloads + + + Clear finished downloads + పూర్తయిన డౌన్‌లోడ్‌లను క్లియర్ చేయండి + + src/app/components/downloads/downloads.component.html + 85 + + Clear finished downloads + + + No downloads available! + డౌన్‌లోడ్‌లు ఏవీ అందుబాటులో లేవు! + + src/app/components/downloads/downloads.component.html + 90 + + No downloads label + + + Your Profile + మీ ప్రొఫైల్ + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 1 + + User profile dialog title + + + Logout + లాగ్అవుట్ + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 28 + + Logout + + + UID: + UID: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 9 + + UID + + + Created: + సృష్టించబడింది: + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 12 + + Created + + + You are not logged in. + మీరు లాగిన్ కాలేదు. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 19 + + Not logged in notification + + + Create admin account + నిర్వాహక ఖాతాను సృష్టించండి + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 1 + + Create admin account dialog title + + + No default admin account detected. This will create and set the password for an admin account with the user name as 'admin'. + డిఫాల్ట్ అడ్మిన్ ఖాతా కనుగొనబడలేదు. ఇది వినియోగదారు పేరు 'అడ్మిన్'గా అడ్మిన్ ఖాతా కోసం పాస్‌వర్డ్‌ను సృష్టించి, సెట్ చేస్తుంది. + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 5 + + No default admin detected explanation + + + Create + సృష్టించు + + src/app/dialogs/set-default-admin-dialog/set-default-admin-dialog.component.html + 17 + + Create + + + Add Users + వినియోగదారులను జోడించండి + + src/app/components/modify-users/modify-users.component.html + 90 + + Add users button + + + Edit Role + పాత్రను సవరించండి + + src/app/components/modify-users/modify-users.component.html + 95 + + Edit role + + + User name + వినియోగదారు పేరు + + src/app/components/modify-users/modify-users.component.html + 17 + + Username users table header + + + Role + పాత్ర + + src/app/components/modify-users/modify-users.component.html + 35 + + Role users table header + + + Actions + చర్యలు + + src/app/components/modify-users/modify-users.component.html + 55 + + Actions users table header + + + Manage user + వినియోగదారుని నిర్వహించండి + + src/app/components/modify-users/modify-users.component.html + 70 + + + src/app/components/manage-user/manage-user.component.html + 1 + + manage user action button tooltip + + + Delete user + వినియోగదారుని తొలగించండి + + src/app/components/modify-users/modify-users.component.html + 73 + + delete user action button tooltip + + + Edit user + వినియోగదారుని సవరించండి + + src/app/components/modify-users/modify-users.component.html + 66 + + edit user action button tooltip + + + User UID: + వినియోగదారు UID: + + src/app/components/manage-user/manage-user.component.html + 4 + + User UID + + + New password + కొత్త గుర్తింపు పదం + + src/app/components/manage-user/manage-user.component.html + 8 + + New password placeholder + + + Set new password + కొత్త గుర్తింపు పదాన్ని సెట్ చేయండి + + src/app/components/manage-user/manage-user.component.html + 10 + + Set new password + + + Use role default + డిఫాల్ట్‌ పాత్రని ఉపయోగించండి + + src/app/components/manage-user/manage-user.component.html + 19 + + Use role default + + + Yes + అవును + + src/app/components/manage-user/manage-user.component.html + 20 + + + src/app/components/manage-role/manage-role.component.html + 9 + + Yes + + + No + కాదు + + src/app/components/manage-user/manage-user.component.html + 21 + + + src/app/components/manage-role/manage-role.component.html + 10 + + No + + + Manage role + పాత్రను నిర్వహించండి + + src/app/components/manage-role/manage-role.component.html + 1 + + Manage role dialog title + + + Lines: + గీతలు: + + src/app/components/logs-viewer/logs-viewer.component.html + 22 + + Label for lines select in logger view + + + Clear logs + లాగ్‌లను క్లియర్ చేయండి + + src/app/components/logs-viewer/logs-viewer.component.html + 34 + + Clear logs button + + + Auto-generated + స్వయంచాలకంగా రూపొందించబడింది + + src/app/components/unified-file-card/unified-file-card.component.html + 5 + + Auto-generated label + + + Open file + ఫైలును తెరవండి + + src/app/components/unified-file-card/unified-file-card.component.html + 18 + + Open file button + + + Open file in new tab + ఫైల్‌ని కొత్త ట్యాబ్‌లో తెరవండి + + src/app/components/unified-file-card/unified-file-card.component.html + 19 + + Open file in new tab + + + Go to subscription + సభ్యత్వానికి వెళ్లండి + + src/app/components/unified-file-card/unified-file-card.component.html + 25 + + Go to subscription menu item + + + Add to playlist + ప్లేజాబితాకు చేర్చు + + src/app/components/unified-file-card/unified-file-card.component.html + 26 + + Add to playlist menu item + + + Delete and redownload + తొలగించి మళ్లీ డౌన్‌లోడ్ చేయండి + + src/app/components/unified-file-card/unified-file-card.component.html + 34 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 8 + + Delete and redownload subscription video button + + + Delete forever + శాశ్వతంగా తొలగించండి + + src/app/components/unified-file-card/unified-file-card.component.html + 37 + + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 9 + + Delete forever subscription video button + + + See more. + ఎక్కువ చూడండి. + + src/app/components/see-more/see-more.component.html + 5,6 + + See more + + + See less. + తక్కువ చూడండి. + + src/app/components/see-more/see-more.component.html + 8,9 + + See less + + + Skip ad + ప్రకటనను దాటవేయండి + + src/app/components/skip-ad-button/skip-ad-button.component.html + 1 + + Skip ad button + + + Length: + పొడపు: + + src/app/subscription/subscription-file-card/subscription-file-card.component.html + 3 + + Video duration label + + + + diff --git a/src/assets/i18n/messages.zh.json b/src/assets/i18n/messages.zh.json deleted file mode 100644 index 683f6b9..0000000 --- a/src/assets/i18n/messages.zh.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "17f0ea5d2d7a262b0e875acc70475f102aee84e6": "创建播放列表", - "cff1428d10d59d14e45edec3c735a27b5482db59": "名称", - "f47e2d56dd8a145b2e9599da9730c049d52962a2": "音频文件", - "a52dae09be10ca3a65da918533ced3d3f4992238": "视频文件", - "d9e83ac17026e70ef6e9c0f3240a3b2450367f40": "修改youtube-dl参数", - "7fc1946abe2b40f60059c6cd19975d677095fd19": "模拟新参数", - "0b71824ae71972f236039bed43f8d2323e8fd570": "添加参数", - "c8b0e59eb491f2ac7505f0fbab747062e6b32b23": "按类别搜索", - "9eeb91caef5a50256dd87e1c4b7b3e8216479377": "使用参数值", - "25d8ad5eba2ec24e68295a27d6a4bb9b49e3dacd": "参数值", - "7de2451ed3fb8d8b847979bd3f0c740b970f167b": "添加参数", - "d7b35c384aecd25a516200d6921836374613dfe7": "取消", - "b2623aee44b70c9a4ba1fce16c8a593b0a4c7974": "修改", - "038ebcb2a89155d90c24fa1c17bfe83dbadc3c20": "Youtube下载器", - "a38ae1082fec79ba1f379978337385a539a28e73": "质量", - "4be966a9dcfbc9b54dfcc604b831c0289f847fa4": "使用URL", - "d3f02f845e62cebd75fde451ab8479d2a8ad784d": "查看", - "4a9889d36910edc8323d7bab60858ab3da6d91df": "仅音频", - "96a01fafe135afc58b0f8071a4ab00234495ce18": "多下载模式", - "6a21ba5fb0ac804a525bf9ab168038c3ee88e661": "下载", - "6a3777f913cf3f288664f0632b9f24794fdcc24e": "取消", - "322ed150e02666fe2259c5b4614eac7066f4ffa0": "高级", - "b7ffe7c6586d6f3f18a9246806a7c7d5538ab43e": "模拟命令:", - "4e4c721129466be9c3862294dc40241b64045998": "使用自定义参数", - "ad2f8ac8b7de7945b80c8e424484da94e597125f": "自定义参数", - "a6911c2157f1b775284bbe9654ce5eb30cf45d7f": "不必指定URL,仅需指定其后的部分。参数用两个逗号分隔:,,", - "3a92a3443c65a52f37ca7efb8f453b35dbefbf29": "使用自定义输出", - "d9c02face477f2f9cdaae318ccee5f89856851fb": "自定义输出", - "fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7": "文档", - "19d1ae64d94d28a29b2c57ae8671aace906b5401": "该路径是相对于配置下载路径的,省略文件扩展名", - "8fad10737d3e3735a6699a4d89cbf6c20f6bb55f": "使用身份验证", - "08c74dc9762957593b91f6eb5d65efdfc975bf48": "用户名", - "c32ef07f8803a223a83ed17024b38e8d82292407": "密码", - "4a0dada6e841a425de3e5006e6a04df26c644fa5": "音频", - "9779715ac05308973d8f1c8658b29b986e92450f": "您的音频文件在这里", - "47546e45bbb476baaaad38244db444c427ddc502": "播放列表", - "78bd81adb4609b68cfa4c589222bdc233ba1faaa": "没有可用的播放列表。 通过单击蓝色加号按钮从您下载的音频文件创建一个。", - "9d2b62bb0b91e2e17fb4177a7e3d6756a2e6ee33": "视频", - "960582a8b9d7942716866ecfb7718309728f2916": "您的视频文件在这里", - "0f59c46ca29e9725898093c9ea6b586730d0624e": "没有可用的播放列表。 通过单击蓝色加号按钮,从下载的视频文件中创建一个。", - "616e206cb4f25bd5885fc35925365e43cf5fb929": "名称:", - "c52db455cca9109ee47e1a612c3f4117c09eb71b": "URL:", - "c6eb45d085384903e53ab001a3513d1de6a1dbac": "上传者:", - "109c6f4a5e46efb933612ededfaf52a13178b7e0": "文件大小:", - "bd630d8669b16e5f264ec4649d9b469fe03e5ff4": "路径:", - "a67e7d843cef735c79d5ef1c8ba4af3e758912bb": "上传日期:", - "f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8": "关闭", - "4f389e41e4592f7f9bb76abdd8af4afdfb13f4f1": "修改播放列表", - "ca3dbbc7f3e011bffe32a10a3ea45cc84f30ecf1": "ID:", - "e684046d73bcee88e82f7ff01e2852789a05fc32": "数量:", - "28f86ffd419b869711aa13f5e5ff54be6d70731c": "编辑", - "826b25211922a1b46436589233cb6f1a163d89b7": "删除", - "321e4419a943044e674beb55b8039f42a9761ca5": "详情", - "34504b488c24c27e68089be549f0eeae6ebaf30b": "删除并拉黑", - "ebadf946ae90f13ecd0c70f09edbc0f983af8a0f": "上传新Cookies", - "98a8a42e5efffe17ab786636ed0139b4c7032d0e": "拖放", - "85e0725c870b28458fd3bbba905397d890f00a69": "注意:加载新的Cookies将覆盖您以前的Cookie。并且Cookies的范围是整个实例,而不是每个用户单独分开的。", - "121cc5391cd2a5115bc2b3160379ee5b36cd7716": "设置", - "801b98c6f02fe3b32f6afa3ee854c99ed83474e6": "URL", - "54c512cca1923ab72faf1a0bd98d3d172469629a": "设置访问URL,无需端口。", - "cb2741a46e3560f6bc6dfd99d385e86b08b26d72": "端口", - "22e8f1d0423a3b784fe40fab187b92c06541b577": "设置目标端口。默认为17442。", - "d4477669a560750d2064051a510ef4d7679e2f3e": "多用户模式", - "2eb03565fcdce7a7a67abc277a936a32fcf51557": "用户文件路径", - "a64505c41150663968e277ec9b3ddaa5f4838798": "用户及其下载视频的文件路径。", - "cbe16a57be414e84b6a68309d08fad894df797d6": "使用加密(SSL)", - "0c1875a79b7ecc792cc1bebca3e063e40b5764f9": "证书文件路径", - "736551b93461d2de64b118cf4043eee1d1c2cb2c": "密钥文件路径", - "4e3120311801c4acd18de7146add2ee4a4417773": "允许订阅", - "4bee2a4bef2d26d37c9b353c278e24e5cd309ce3": "订阅文件路径", - "bc9892814ee2d119ae94378c905ea440a249b84a": "订阅频道和播放列表中视频的文件路径(相对于根文件夹而言)。", - "5bef4b25ba680da7fff06b86a91b1fc7e6a926e3": "检查间隔", - "0f56a7449b77630c114615395bbda4cab398efd8": "单位是秒,只包含数字。", - "78e49b7339b4fa7184dd21bcaae107ce9b7076f6": "使用youtube-dl存档", - "fa9fe4255231dd1cc6b29d3d254a25cb7c764f0f": "根据youtube-dl的存档功能", - "09006404cccc24b7a8f8d1ce0b39f2761ab841d8": "从您的订阅下载的视频会记录在订阅存档子目录中的文本文件中。", - "29ed79a98fc01e7f9537777598e31dbde3aa7981": "这样一来,您无需取消订阅便可以从订阅中永久删除视频。并且它还可以在数据丢失的情况下记录已经下载了哪些视频。", - "27a56aad79d8b61269ed303f11664cc78bcc2522": "主题", - "ff7cee38a2259526c519f878e71b964f41db4348": "默认", - "adb4562d2dbd3584370e44496969d58c511ecb63": "暗黑", - "7a6bacee4c31cb5c0ac2d24274fb4610d8858602": "允许更改主题", - "fe46ccaae902ce974e2441abe752399288298619": "语言", - "82421c3e46a0453a70c42900eab51d58d79e6599": "常规", - "ab2756805742e84ad0cc0468f4be2d8aa9f855a5": "音频文件夹路径", - "c2c89cdf45d46ea64d2ed2f9ac15dfa4d77e26ca": "音频下载的文件路径。相对于YTDL-Material的根文件夹。", - "46826331da1949bd6fb74624447057099c9d20cd": "视频文件夹路径", - "17c92e6d47a213fa95b5aa344b3f258147123f93": "视频下载的文件路径。相对于YTDL-Material的根文件夹。", - "6b995e7130b4d667eaab6c5f61b362ace486d26d": "开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,,", - "d01715b75228878a773ae6d059acc639d4898a03": "安全下载覆盖", - "0ba25ad86a240576c4f20a2fada4722ebba77b1e": "下载程序", - "61f8fd90b5f8cb20c70371feb2ee5e1fac5a9095": "首页标题", - "78d3531417c0d4ba4c90f0d4ae741edc261ec8df": "启用文件管理", - "a5a1be0a5df07de9eec57f5d2a86ed0204b2e75a": "启用下载管理", - "c33bd5392b39dbed36b8e5a1145163a15d45835f": "允许选择下载质量", - "bda5508e24e0d77debb28bcd9194d8fefb1cfb92": "仅下载模式", - "09d31c803a7252658694e1e3176b97f5655a3fe3": "开启多下载模式", - "d8b47221b5af9e9e4cd5cb434d76fc0c91611409": "使用PIN码保护设置", - "f5ec7b2cdf87d41154f4fcbc86e856314409dcb9": "设置新PIN码", - "1c4dbce56d96b8974aac24a02f7ab2ee81415014": "启用公共API", - "23bd81dcc30b74d06279a26d7a42e8901c1b124e": "公共API密钥", - "41016a73d8ad85e6cb26dffa0a8fab9fe8f60d8e": "查看文档", - "1b258b258b4cc475ceb2871305b61756b0134f4a": "生成", - "d5d7c61349f3b0859336066e6d453fc35d334fe5": "使用YouTube API", - "ce10d31febb3d9d60c160750570310f303a22c22": "Youtube API密钥", - "8602e313cdfa7c4cc475ccbe86459fce3c3fd986": "生成密钥很简单!", - "9b3cedfa83c6d7acb3210953289d1be4aab115c7": "点击这里", - "7f09776373995003161235c0c8d02b7f91dbc4df": "来手动下载官方的YoutubeDL-Material Chrome扩展程序。", - "5b5296423906ab3371fdb2b5a5aaa83acaa2ee52": "您必须手动安装扩展,并且在扩展的设置中输入下载器URL。", - "9a2ec6da48771128384887525bdcac992632c863": "直接从Firefox扩展商店安装官方的YoutubeDL-Material Firefox扩展程序。", - "eb81be6b49e195e5307811d1d08a19259d411f37": "详细的扩展说明。", - "cb17ff8fe3961cf90f44bee97c88a3f3347a7e55": "只需在扩展的设置中输入前端URL。", - "61b81b11aad0b9d970ece2fce18405f07eac69c2": "只需将下面的链接拖放到书签栏中。在YouTube页面上您只需单击书签即可下载视频。", - "c505d6c5de63cc700f0aaf8a4b31fae9e18024e5": "生成“仅音频”书签", - "d5f69691f9f05711633128b5a3db696783266b58": "额外", - "5fab47f146b0a4b809dcebf3db9da94df6299ea1": "使用默认下载程序", - "ec71e08aee647ea4a71fd6b7510c54d84a797ca6": "选择下载器", - "00e274c496b094a019f0679c3fab3945793f3335": "选择日志级别", - "dc3d990391c944d1fbfc7cfb402f7b5e112fb3a8": "开启高级下载选项", - "431e5f3a0dde88768d1074baedd65266412b3f02": "使用Cookies", - "80651a7ad1229ea6613557d3559f702cfa5aecf5": "设置Cookies", - "bc2e854e111ecf2bd7db170da5e3c2ed08181d88": "高级", - "37224420db54d4bc7696f157b779a7225f03ca9d": "允许用户注册", - "4d13a9cd5ed3dcee0eab22cb25198d43886942be": "用户", - "eb3d5aefff38a814b76da74371cbf02c0789a1ef": "日志", - "52c9a103b812f258bcddc3d90a6e3f46871d25fe": "保存", - "fe8fd36dbf5deee1d56564965787a782a66eba44": "{VAR_SELECT, select, true {关} false {取消} other {其他} }", - "cec82c0a545f37420d55a9b6c45c20546e82f94e": "关于 YoutubeDL-Material", - "199c17e5d6a419313af3c325f06dcbb9645ca618": "是根据Google的Material Design规范构建的开源YouTube下载器。您可以将喜欢的视频下载为视频或音频文件,并且可以订阅喜欢的频道和播放列表,以便及时下载他们的新视频。", - "bc0ad0ee6630acb7fcb7802ec79f5a0ee943c1a7": "包含很多很棒的功能!支持API,Docker和本地化。在Github上查找所有受支持的功能。", - "a45e3b05f0529dc5246d70ef62304c94426d4c81": "安装版本:", - "e22f3a5351944f3a1a10cfc7da6f65dfbe0037fe": "检查更新...", - "a16e92385b4fd9677bb830a4b796b8b79c113290": "更新可用", - "189b28aaa19b3c51c6111ad039c4fd5e2a22e370": "您可以从设置菜单进行更新。", - "b33536f59b94ec935a16bd6869d836895dc5300c": "发现了一个错误或有一些建议?", - "e1f398f38ff1534303d4bb80bd6cece245f24016": "创建新issue!", - "42ff677ec14f111e88bd6cdd30145378e994d1bf": "您的个人资料", - "ac9d09de42edca1296371e4d801349c9096ac8de": "UID:", - "a5ed099ffc9e96f6970df843289ade8a7d20ab9f": "创建日期:", - "fa96f2137af0a24e6d6d54c598c0af7d5d5ad344": "您尚未登录。", - "6765b4c916060f6bc42d9bb69e80377dbcb5e4e9": "登录", - "bb694b49d408265c91c62799c2b3a7e3151c824d": "注销", - "a1dbca87b9f36d2b06a5cbcffb5814c4ae9b798a": "创建管理员帐户", - "2d2adf3ca26a676bca2269295b7455a26fd26980": "未检测到默认管理员帐户。即将创建一个名为admin的管理员帐户并设置密码。", - "70a67e04629f6d412db0a12d51820b480788d795": "创建", - "994363f08f9fbfa3b3994ff7b35c6904fdff18d8": "个人资料", - "004b222ff9ef9dd4771b777950ca1d0e4cd4348a": "关于", - "92eee6be6de0b11c924e3ab27db30257159c0a7c": "首 页", - "357064ca9d9ac859eb618e28e8126fa32be049e2": "订 阅", - "822fab38216f64e8166d368b59fe756ca39d301b": "下 载", - "a249a5ae13e0835383885aaf697d2890cc3e53e9": "分享播放列表", - "15da89490e04496ca9ea1e1b3d44fb5efd4a75d9": "分享视频", - "1d540dcd271b316545d070f9d182c372d923aadd": "分享音频", - "1f6d14a780a37a97899dc611881e6bc971268285": "启用共享", - "6580b6a950d952df847cb3d8e7176720a740adc8": "使用时间戳", - "4f2ed9e71a7c981db3e50ae2fedb28aff2ec4e6c": "秒", - "3a6e5a6aa78ca864f6542410c5dafb6334538106": "复制到剪贴板", - "5b3075e8dc3f3921ec316b0bd83b6d14a06c1a4f": "保存更改", - "4f8b2bb476981727ab34ed40fde1218361f92c45": "详细", - "e9aff8e6df2e2bf6299ea27bb2894c70bc48bd4d": "发生错误:", - "77b0c73840665945b25bd128709aa64c8f017e1c": "下载开始:", - "08ff9375ec078065bcdd7637b7ea65fce2979266": "下载结束:", - "ad127117f9471612f47d01eae09709da444a36a4": "文件路径:", - "a9806cf78ce00eb2613eeca11354a97e033377b8": "订阅播放列表或频道", - "93efc99ae087fc116de708ecd3ace86ca237cf30": "播放列表或频道URL", - "08f5d0ef937ae17feb1b04aff15ad88911e87baf": "自定义名称", - "ea30873bd3f0d5e4fb2378eec3f0a1db77634a28": "下载所有音视频", - "28a678e9cabf86e44c32594c43fa0e890135c20f": "下载最近多久的视频", - "c76a955642714b8949ff3e4b4990864a2e2cac95": "仅音频模式", - "408ca4911457e84a348cecf214f02c69289aa8f1": "仅视频模式", - "f432e1a8d6adb12e612127978ce2e0ced933959c": "这些是在标准参数之后添加的。", - "98b6ec9ec138186d663e64770267b67334353d63": "自定义文件输出", - "d0336848b0c375a1c25ba369b3481ee383217a4f": "订阅", - "e78c0d60ac39787f62c9159646fe0b3c1ed55a1d": "类型:", - "a44d86aa1e6c20ced07aca3a7c081d8db9ded1c6": "存档:", - "8efc77bf327659c0fec1f518cf48a98cdcd9dddf": "导出存档", - "3042bd3ad8dffcfeca5fd1ae6159fd1047434e95": "取消订阅", - "e2319dec5b4ccfb6ed9f55ccabd63650a8fdf547": "您的订阅", - "807cf11e6ac1cde912496f764c176bdfdd6b7e19": "频道", - "29b89f751593e1b347eef103891b7a1ff36ec03f": "名称不可用。正在检索频道...", - "4636cd4a1379c50d471e98786098c4d39e1e82ad": "您尚未订阅任何频道。", - "2e0a410652cb07d069f576b61eab32586a18320d": "名称不可用。正在检索播放列表...", - "587b57ced54965d8874c3fd0e9dfedb987e5df04": "您尚未订阅任何播放列表。", - "7e892ba15f2c6c17e83510e273b3e10fc32ea016": "搜索", - "2054791b822475aeaea95c0119113de3200f5e1c": "长度:", - "94e01842dcee90531caa52e4147f70679bac87fe": "删除并重新下载", - "2031adb51e07a41844e8ba7704b054e98345c9c1": "永久删除", - "91ecce65f1d23f9419d1c953cd6b7bc7f91c110e": "更新程序", - "1372e61c5bd06100844bd43b98b016aabc468f62": "选择版本:", - "cfc2f436ec2beffb042e7511a73c89c372e86a6c": "注册", - "a1ad8b1be9be43b5183bd2c3186d4e19496f2a0b": "会话ID:", - "eb98135e35af26a9a326ee69bd8ff104d36dd8ec": "(当前)", - "7117fc42f860e86d983bfccfcf2654e5750f3406": "没有下载可用!", - "b7ff2e2b909c53abe088fe60b9f4b6ac7757247f": "注册用户", - "024886ca34a6f309e3e51c2ed849320592c3faaa": "用户名", - "2bd201aea09e43fbfd3cd15ec0499b6755302329": "管理用户", - "29c97c8e76763bb15b6d515648fa5bd1eb0f7510": "用户UID:", - "e70e209561583f360b1e9cefd2cbb1fe434b6229": "新密码", - "6498fa1b8f563988f769654a75411bb8060134b9": "设置新密码", - "40da072004086c9ec00d125165da91eaade7f541": "使用默认值", - "4f20f2d5a6882190892e58b85f6ccbedfa737952": "是", - "3d3ae7deebc5949b0c1c78b9847886a94321d9fd": "否", - "57c6c05d8ebf4ef1180c2705033c044f655bb2c4": "管理用户", - "746f64ddd9001ac456327cd9a3d5152203a4b93c": "用户名", - "52c1447c1ec9570a2a3025c7e566557b8d19ed92": "身份", - "59a8c38db3091a63ac1cb9590188dc3a972acfb3": "动作", - "4d92a0395dd66778a931460118626c5794a3fc7a": "添加用户", - "b0d7dd8a1b0349622d6e0c6e643e24a9ea0efa1d": "编辑用户", - "fd59fb984749fcdb5e386ae85faec82f8e5ac098": "日志将出现在这里", - "5009630cdf32ab4f1c78737b9617b8773512c05a": "行:", - "ffc19f32b1cba0daefc0e5668f89346db1db83ad": "包括缩略图", - "f61c6867295f3b53d23557021f2f4e0aa1d0b8fc": "类型", - "2d1ea268a6a9f483dbc2cbfe19bf4256a57a6af4": "视频", - "f0baeb8b69d120073b6d60d34785889b0c3232c8": "音频", - "ccf5ea825526ac490974336cb5c24352886abc07": "打开文件", - "8a0bda4c47f10b2423ff183acefbf70d4ab52ea2": "清空日志", - "95b95a9c79e4fd9ed41f6855e37b3b06af25bcab": "删除用户", - "632e8b20c98e8eec4059a605a4b011bb476137af": "编辑用户", - "b6c453e0e61faea184bbaf5c5b0a1e164f4de2a2": "清空所有下载", - "080cc6abcba236390fc22e79792d0d3443a3bd2a": "绑定凭证", - "f50fa6c09c8944aed504f6325f2913ee6c7a296a": "绑定DN", - "1db9789b93069861019bd0ccaa5d4706b00afc61": "LDAP链接", - "fa548cee6ea11c160a416cac3e6bdec0363883dc": "认证方式", - "e3d7c5f019e79a3235a28ba24df24f11712c7627": "LDAP认证", - "4f56ced9d6b85aeb1d4346433361d47ea72dac1a": "内部身份验证", - "db6c192032f4cab809aad35215f0aa4765761897": "登录到期", - "0c43af932e6a4ee85500e28f01b3538b4eb27bc4": "日志等级", - "00a94f58d9eb2e3aa561440eabea616d0c937fa2": "这将删除您的旧API密钥!", - "384de8f8f112c9e6092eb2698706d391553f3e8d": "包含元数据", - "a8b7b9c168fd936a75e500806a8c0d7755ef1198": "注意:加载新的Cookies将覆盖您以前的Cookie。并且Cookies的范围是整个实例,而不是每个用户单独分开的。", - "511b600ae4cf037e4eb3b7a58410842cd5727490": "添加更多内容", - "d02888c485d3aeab6de628508f4a00312a722894": "我的视频", - "a0720c36ee1057e5c54a86591b722485c62d7b1a": "前往订阅", - "5656a06f17c24b2d7eae9c221567b209743829a9": "在新标签页打开文件", - "348cc5d553b18e862eb1c1770e5636f6b05ba130": "出现错误", - "4d8a18b04a1f785ecd8021ac824e0dfd5881dbfc": "下载成功", - "e01d54ecc1a0fcf9525a3c100ed8b83d94e61c23": "搜索过滤器", - "cfa67d14d84fe0e9fadf251dc51ffc181173b662": "搜索起点", - "544e09cdc99a8978f48521d45f62db0da6dcf742": "使用角色预设", - "3697f8583ea42868aa269489ad366103d94aece7": "编辑中", - "fb35145bfb84521e21b6385363d59221f436a573": "取消所有下载", - "56a2a773fbd5a6b9ac2e6b89d29d70a2ed0f3227": "查看更少", - "c776eb4992b6c98f58cd89b20c1ea8ac37888521": "选择一个下载程序", - "d641b8fa5ac5e85114c733b1f7de6976bd091f70": "最高画质", - "ddc31f2885b1b33a7651963254b0c197f2a64086": "查看更多...", - "5fb1e0083c9b2a40ac8ae7dcb2618311c291b8b9": "自动下载Twitch弹幕", - "84ffcebac2709ca0785f4a1d5ba274433b5beabc": "也称为客户ID", - "8ae23bc4302a479f687f4b20a84c276182e2519c": "Twitch API 密钥", - "d162f9fcd6a7187b391e004f072ab3da8377c47d": "使用Twitch API", - "04201f9d27abd7d6f58a4328ab98063ce1072006": "分类", - "ef418d4ece7c844f3a5e431da1aa59bedd88da7b": "全局自定义变量", - "1148fd45287ff09955b938756bc302042bcb29c7": "路径相对于上述下载路径,不包括扩展名。", - "cfe829634b1144bc44b6d38cf5584ea65db9804f": "默认输出文件夹", - "3d1a47dc18b7bd8b5d9e1eb44b235ed9c4a2b513": "重新下载新上传的内容", - "13759b09a7f4074ceee8fa2f968f9815fdf63295": "有时新视频会在完全处理前下载。这项设置指新视频会在第二天检查视频是否有更高画质。", - "dad95154dcef3509b8cc705046061fd24994bbb7": "浏览", - "792dc6a57f28a1066db283f2e736484f066005fd": "下载Twitch弹幕", - "e4eeb9106dbcbc91ca1ac3fb4068915998a70f37": "添加新规则", - "2489eefea00931942b91f4a1ae109514b591e2e1": "规则", - "c3b0b86523f1d10e84a71f9b188d54913a11af3b": "编辑类别", - "07db550ae114d9faad3a0cbb68bcc16ab6cd31fc": "暂停", - "73423607944a694ce6f9e55cfee329681bb4d9f9": "找不到视频", - "29376982b1205d9d6ea3d289e8e2f8e1ac2839b1": "倒序", - "33026f57ea65cd9c8a5d917a08083f71a718933a": "正序", - "5caadefa4143cf6766a621b0f54f91f373a1f164": "添加内容", - "0cc1dec590ecd74bef71a865fb364779bc42a749": "类别:", - "303e45ffae995c9817e510e38cb969e6bb3adcbf": "(暂停)", - "24dc3ecf7ec2c2144910c4f3d38343828be03a4c": "自动生成的" -} \ No newline at end of file diff --git a/src/assets/i18n/messages.zh.xlf b/src/assets/i18n/messages.zh.xlf index a0b6008..be003db 100644 --- a/src/assets/i18n/messages.zh.xlf +++ b/src/assets/i18n/messages.zh.xlf @@ -1,4 +1,4 @@ - + @@ -902,8 +902,8 @@ Video path setting input hint - Global custom args for downloads on the home page. Args are delimited using two commas like so: ,, - 开始页面上用于下载的全局自定义参数。参数由两个逗号分隔:,, + Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, + 开始页面上用于下载的全局自定义参数。(单独为每个订阅设置订阅参数!) 参数由两个逗号分隔:,, app/settings/settings.component.html 146 @@ -2573,6 +2573,150 @@ Auto-generated label + + Share file + 共享文件 + + src/app/dialogs/share-media-dialog/share-media-dialog.component.html + 3 + + Share video dialog title + + + Restart server + 重新启动服务器 + + src/app/settings/settings.component.html + 397 + + Restart server button + + + Database information could not be retrieved. Check the server logs for more information. + 无法获取数据库信息。更多信息请查看服务器日志。 + + src/app/settings/settings.component.html + 312 + + Database info not retrieved error message + + + Transfer DB to + 数据库转移到 + + src/app/settings/settings.component.html + 308 + + Transfer DB button + + + Test connection string + 测试连接字符串 + + src/app/settings/settings.component.html + 304 + + Test connection string button + + + Example: + 示例: + + src/app/settings/settings.component.html + 300 + + MongoDB Connection String setting hint AKA preamble + + + MongoDB Connection String + MongoDB 连接字符串 + + src/app/settings/settings.component.html + 299 + + MongoDB Connection String + + + Records per table + 每张表的记录数 + + src/app/settings/settings.component.html + 291 + + Records per table label + + + Database location: + 数据库位置: + + src/app/settings/settings.component.html + 290 + + Database location label + + + Allow playlist categorization + 允许播放列表分类 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting label + + + With this setting enabled, if a single video matches a category, the entire playlist will receive that category. + 启用此设置后,如果单个视频匹配某个类别,则整个播放列表将收到该类别。 + + src/app/settings/settings.component.html + 158 + + Allow playlist categorization setting tooltip + + + Database + 数据库 + + src/app/settings/settings.component.html + 284 + + Database settings label + + + Randomize order when playing + 播放时随机排序 + + src/app/dialogs/modify-playlist/modify-playlist.component.html + 13 + + Randomize order when playing checkbox label + + + Crop to (seconds) + 裁剪终点 (秒) + + src/app/main/main.component.html + 164 + + Crop to placeholder + + + Crop from (seconds) + 裁剪起始点 (秒) + + src/app/main/main.component.html + 159 + + Crop from placeholder + + + Crop file + 裁剪文件 + + src/app/main/main.component.html + 155,156 + + Crop video checkbox + diff --git a/src/polyfills.ts b/src/polyfills.ts index c81bace..85b03e5 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -20,44 +20,14 @@ import '@angular/localize/init'; /*************************************************************************************************** * BROWSER POLYFILLS - */ - -/** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; -// import 'core-js/es6/object'; -// import 'core-js/es6/function'; -// import 'core-js/es6/parse-int'; -// import 'core-js/es6/parse-float'; -// import 'core-js/es6/number'; -// import 'core-js/es6/math'; -// import 'core-js/es6/string'; -// import 'core-js/es6/date'; -// import 'core-js/es6/array'; -// import 'core-js/es6/regexp'; -// import 'core-js/es6/map'; -// import 'core-js/es6/weak-map'; -// import 'core-js/es6/set'; - -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** IE10 and IE11 requires the following to support `@angular/animation`. */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - - -/** Evergreen browsers require these. **/ -// import 'core-js/es6/reflect'; - - -/** ALL Firefox browsers require the following to support `@angular/animation`. **/ -import 'web-animations-js'; // Run `npm install --save web-animations-js`. + */ // Run `npm install --save web-animations-js`. /*************************************************************************************************** * Zone JS is required by Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js'; // Included with Angular CLI. diff --git a/src/postbuild.mjs b/src/postbuild.mjs new file mode 100644 index 0000000..8bc6d71 --- /dev/null +++ b/src/postbuild.mjs @@ -0,0 +1,54 @@ +import fs from 'fs-extra'; +import path from 'path'; +import xliffToJSON from 'xliff-to-json'; + +async function recFindByExt(base,ext,files,result) +{ + files = files || (await fs.readdir(base)) + result = result || [] + + for (const file of files) { + var newbase = path.join(base,file) + if ( (await fs.stat(newbase)).isDirectory() ) + { + result = await recFindByExt(newbase,ext,await fs.readdir(newbase),result) + } + else + { + if ( file.substr(-1*(ext.length+1)) == '.' + ext ) + { + result.push(newbase) + } + } + } + return result +} + +// outputs array of supported locales +async function createLocalizationJSON() { + xliffToJSON.convert('src/assets/i18n'); + const files = await recFindByExt(path.join('src', 'assets', 'i18n'), 'json'); + const locales = []; + + for (let i = 0; i < files.length; i++) { + const file = path.basename(files[i]); + const file_parts = file.split('.'); + if (file_parts.length !== 3 || file_parts[1] === 'en') continue; + try { + const locale_json = fs.readJSONSync(files[i]); + const locale_json_keys = Object.keys(locale_json); + let has_defined_keys = false; + for (let i = 0; i < locale_json_keys.length; i++) { + if (locale_json[locale_json_keys[i]] !== '') has_defined_keys = true; + } + if (has_defined_keys) locales.push(file_parts[1]); + } catch (err) { + console.error(err); + } + } + + fs.unlinkSync('src/assets/i18n/messages.en.json'); + fs.writeJSONSync('src/assets/i18n/supported_locales.json', {supported_locales: locales}); +} + +createLocalizationJSON(); \ No newline at end of file diff --git a/src/test.ts b/src/test.ts index cd612ee..4738de2 100644 --- a/src/test.ts +++ b/src/test.ts @@ -22,7 +22,9 @@ __karma__.loaded = function () {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: false } +} ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/);