From 568cc243f0ad03a1928e6643ae21ecc5793c65b7 Mon Sep 17 00:00:00 2001 From: "Tran, Alex" Date: Thu, 3 Feb 2022 10:06:44 -0600 Subject: [PATCH] Transfer repository from Gitlab --- mobile/.gitignore | 46 + mobile/.metadata | 10 + mobile/README.md | 16 + mobile/analysis_options.yaml | 29 + mobile/android/.gitignore | 13 + mobile/android/app/build.gradle | 68 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 38 + .../com/example/immich_mobile/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + mobile/android/build.gradle | 31 + mobile/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + mobile/android/settings.gradle | 11 + mobile/assets/immich-logo-no-outline.png | Bin 0 -> 147005 bytes mobile/assets/immich-logo.png | Bin 0 -> 287149 bytes mobile/assets/immich-logo.svg | 98 + mobile/ios/.gitignore | 34 + mobile/ios/Flutter/AppFrameworkInfo.plist | 26 + mobile/ios/Flutter/Debug.xcconfig | 2 + mobile/ios/Flutter/Release.xcconfig | 2 + mobile/ios/Podfile | 41 + mobile/ios/Podfile.lock | 50 + mobile/ios/Runner.xcodeproj/project.pbxproj | 551 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + mobile/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + mobile/ios/Runner/Base.lproj/Main.storyboard | 26 + mobile/ios/Runner/Info.plist | 49 + mobile/ios/Runner/Runner-Bridging-Header.h | 1 + mobile/lib/constants/hive_box.dart | 11 + mobile/lib/main.dart | 92 + .../models/store_model_here.txt | 0 .../providers/store_providers_here.txt | 0 .../services/store_services_here.txt | 0 .../lib/module_template/ui/store_ui_here.txt | 0 .../views/store_views_here.txt | 0 .../models/get_all_asset_respose.model.dart | 113 + .../home/providers/asset.provider.dart | 60 + .../modules/home/services/asset.service.dart | 38 + mobile/lib/modules/home/ui/image_grid.dart | 26 + .../modules/home/ui/immich_sliver_appbar.dart | 105 + .../lib/modules/home/ui/profile_drawer.dart | 72 + .../lib/modules/home/ui/thumbnail_image.dart | 52 + mobile/lib/modules/home/views/home_page.dart | 165 + .../models/authentication_state.model.dart | 93 + .../login/models/login_response.model.dart | 61 + .../providers/authentication.provider.dart | 127 + mobile/lib/modules/login/ui/login_form.dart | 124 + .../lib/modules/login/views/login_page.dart | 16 + mobile/lib/routing/auth_guard.dart | 22 + mobile/lib/routing/router.dart | 22 + mobile/lib/routing/router.gr.dart | 122 + .../lib/shared/models/backup_state.model.dart | 77 + .../lib/shared/models/device_info.model.dart | 100 + .../models/image_viewer_page_data.model.dart | 11 + .../lib/shared/models/immich_asset.model.dart | 131 + .../lib/shared/models/server_info.model.dart | 98 + .../shared/providers/app_state.provider.dart | 13 + .../lib/shared/providers/backup.provider.dart | 137 + .../lib/shared/services/backup.service.dart | 124 + .../shared/services/device_info.service.dart | 30 + .../services/local_storage.service.dart | 18 + .../lib/shared/services/network.service.dart | 89 + .../shared/services/server_info.service.dart | 15 + .../shared/views/backup_controller_page.dart | 232 + .../lib/shared/views/image_viewer_page.dart | 64 + mobile/lib/utils/dio_http_interceptor.dart | 17 + mobile/lib/utils/files_helper.dart | 33 + mobile/makefile | 5 + mobile/pubspec.lock | 845 +++ mobile/pubspec.yaml | 39 + mobile/test/widget_test.dart | 30 + mobile/web/favicon.png | Bin 0 -> 917 bytes mobile/web/icons/Icon-192.png | Bin 0 -> 5292 bytes mobile/web/icons/Icon-512.png | Bin 0 -> 8252 bytes mobile/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes mobile/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes mobile/web/index.html | 104 + mobile/web/manifest.json | 35 + server/.env.example | 14 + server/.eslintrc.js | 26 + server/.gitignore | 40 + server/.prettierrc | 5 + server/README.md | 11 + server/nest-cli.json | 4 + server/package.json | 100 + server/src/api-v1/asset/asset.controller.ts | 85 + server/src/api-v1/asset/asset.module.ts | 35 + server/src/api-v1/asset/asset.service.ts | 105 + .../src/api-v1/asset/dto/create-asset.dto.ts | 31 + .../asset/dto/get-all-asset-query.dto.ts | 6 + .../asset/dto/get-all-asset-response.dto.ts | 7 + server/src/api-v1/asset/dto/get-asset.dto.ts | 6 + server/src/api-v1/asset/dto/serve-file.dto.ts | 16 + .../src/api-v1/asset/dto/update-asset.dto.ts | 4 + .../src/api-v1/asset/entities/asset.entity.ts | 54 + server/src/api-v1/auth/auth.controller.ts | 29 + server/src/api-v1/auth/auth.module.ts | 16 + server/src/api-v1/auth/auth.service.ts | 84 + server/src/api-v1/auth/dto/jwt-payload.dto.ts | 9 + .../api-v1/auth/dto/login-credential.dto.ts | 9 + server/src/api-v1/auth/dto/sign-up.dto.ts | 9 + .../device-info/device-info.controller.ts | 22 + .../api-v1/device-info/device-info.module.ts | 12 + .../api-v1/device-info/device-info.service.ts | 63 + .../device-info/dto/create-device-info.dto.ts | 13 + .../device-info/dto/update-device-info.dto.ts | 6 + .../entities/device-info.entity.ts | 32 + .../api-v1/server-info/dto/server-info.dto.ts | 9 + .../server-info/server-info.controller.ts | 19 + .../api-v1/server-info/server-info.module.ts | 9 + .../api-v1/server-info/server-info.service.ts | 54 + server/src/api-v1/user/dto/create-user.dto.ts | 1 + server/src/api-v1/user/dto/update-user.dto.ts | 4 + .../src/api-v1/user/entities/user.entity.ts | 19 + server/src/api-v1/user/user.controller.ts | 34 + server/src/api-v1/user/user.module.ts | 12 + server/src/api-v1/user/user.service.ts | 41 + server/src/app.module.ts | 49 + server/src/config/app.config.ts | 19 + server/src/config/database.config.ts | 27 + server/src/config/jwt.config.ts | 7 + server/src/config/multer-option.config.ts | 38 + server/src/constants/jwt.constant.ts | 1 + server/src/decorators/auth-user.decorator.ts | 21 + server/src/main.ts | 11 + .../src/middlewares/app-logger.middleware.ts | 22 + .../image-optimize/image-optimize.module.ts | 36 + .../image-optimize.processor.ts | 60 + .../image-optimize/image-optimize.service.ts | 29 + .../machine-learning.processor.ts | 39 + .../immich-jwt/guards/jwt-auth.guard.ts | 5 + .../modules/immich-jwt/immich-jwt.module.ts | 14 + .../modules/immich-jwt/immich-jwt.service.ts | 14 + .../immich-jwt/strategies/jwt.strategy.ts | 33 + server/test/app.e2e-spec.ts | 24 + server/test/jest-e2e.json | 9 + server/tsconfig.build.json | 4 + server/tsconfig.json | 23 + server/yarn.lock | 6625 +++++++++++++++++ 177 files changed, 13300 insertions(+) create mode 100644 mobile/.gitignore create mode 100644 mobile/.metadata create mode 100644 mobile/README.md create mode 100644 mobile/analysis_options.yaml create mode 100644 mobile/android/.gitignore create mode 100644 mobile/android/app/build.gradle create mode 100644 mobile/android/app/src/debug/AndroidManifest.xml create mode 100644 mobile/android/app/src/main/AndroidManifest.xml create mode 100644 mobile/android/app/src/main/kotlin/com/example/immich_mobile/MainActivity.kt create mode 100644 mobile/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 mobile/android/app/src/main/res/drawable/launch_background.xml create mode 100644 mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 mobile/android/app/src/main/res/values-night/styles.xml create mode 100644 mobile/android/app/src/main/res/values/styles.xml create mode 100644 mobile/android/app/src/profile/AndroidManifest.xml create mode 100644 mobile/android/build.gradle create mode 100644 mobile/android/gradle.properties create mode 100644 mobile/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 mobile/android/settings.gradle create mode 100644 mobile/assets/immich-logo-no-outline.png create mode 100644 mobile/assets/immich-logo.png create mode 100644 mobile/assets/immich-logo.svg create mode 100644 mobile/ios/.gitignore create mode 100644 mobile/ios/Flutter/AppFrameworkInfo.plist create mode 100644 mobile/ios/Flutter/Debug.xcconfig create mode 100644 mobile/ios/Flutter/Release.xcconfig create mode 100644 mobile/ios/Podfile create mode 100644 mobile/ios/Podfile.lock create mode 100644 mobile/ios/Runner.xcodeproj/project.pbxproj create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 mobile/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 mobile/ios/Runner/AppDelegate.swift create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 mobile/ios/Runner/Base.lproj/Main.storyboard create mode 100644 mobile/ios/Runner/Info.plist create mode 100644 mobile/ios/Runner/Runner-Bridging-Header.h create mode 100644 mobile/lib/constants/hive_box.dart create mode 100644 mobile/lib/main.dart create mode 100644 mobile/lib/module_template/models/store_model_here.txt create mode 100644 mobile/lib/module_template/providers/store_providers_here.txt create mode 100644 mobile/lib/module_template/services/store_services_here.txt create mode 100644 mobile/lib/module_template/ui/store_ui_here.txt create mode 100644 mobile/lib/module_template/views/store_views_here.txt create mode 100644 mobile/lib/modules/home/models/get_all_asset_respose.model.dart create mode 100644 mobile/lib/modules/home/providers/asset.provider.dart create mode 100644 mobile/lib/modules/home/services/asset.service.dart create mode 100644 mobile/lib/modules/home/ui/image_grid.dart create mode 100644 mobile/lib/modules/home/ui/immich_sliver_appbar.dart create mode 100644 mobile/lib/modules/home/ui/profile_drawer.dart create mode 100644 mobile/lib/modules/home/ui/thumbnail_image.dart create mode 100644 mobile/lib/modules/home/views/home_page.dart create mode 100644 mobile/lib/modules/login/models/authentication_state.model.dart create mode 100644 mobile/lib/modules/login/models/login_response.model.dart create mode 100644 mobile/lib/modules/login/providers/authentication.provider.dart create mode 100644 mobile/lib/modules/login/ui/login_form.dart create mode 100644 mobile/lib/modules/login/views/login_page.dart create mode 100644 mobile/lib/routing/auth_guard.dart create mode 100644 mobile/lib/routing/router.dart create mode 100644 mobile/lib/routing/router.gr.dart create mode 100644 mobile/lib/shared/models/backup_state.model.dart create mode 100644 mobile/lib/shared/models/device_info.model.dart create mode 100644 mobile/lib/shared/models/image_viewer_page_data.model.dart create mode 100644 mobile/lib/shared/models/immich_asset.model.dart create mode 100644 mobile/lib/shared/models/server_info.model.dart create mode 100644 mobile/lib/shared/providers/app_state.provider.dart create mode 100644 mobile/lib/shared/providers/backup.provider.dart create mode 100644 mobile/lib/shared/services/backup.service.dart create mode 100644 mobile/lib/shared/services/device_info.service.dart create mode 100644 mobile/lib/shared/services/local_storage.service.dart create mode 100644 mobile/lib/shared/services/network.service.dart create mode 100644 mobile/lib/shared/services/server_info.service.dart create mode 100644 mobile/lib/shared/views/backup_controller_page.dart create mode 100644 mobile/lib/shared/views/image_viewer_page.dart create mode 100644 mobile/lib/utils/dio_http_interceptor.dart create mode 100644 mobile/lib/utils/files_helper.dart create mode 100644 mobile/makefile create mode 100644 mobile/pubspec.lock create mode 100644 mobile/pubspec.yaml create mode 100644 mobile/test/widget_test.dart create mode 100644 mobile/web/favicon.png create mode 100644 mobile/web/icons/Icon-192.png create mode 100644 mobile/web/icons/Icon-512.png create mode 100644 mobile/web/icons/Icon-maskable-192.png create mode 100644 mobile/web/icons/Icon-maskable-512.png create mode 100644 mobile/web/index.html create mode 100644 mobile/web/manifest.json create mode 100644 server/.env.example create mode 100644 server/.eslintrc.js create mode 100644 server/.gitignore create mode 100644 server/.prettierrc create mode 100644 server/README.md create mode 100644 server/nest-cli.json create mode 100644 server/package.json create mode 100644 server/src/api-v1/asset/asset.controller.ts create mode 100644 server/src/api-v1/asset/asset.module.ts create mode 100644 server/src/api-v1/asset/asset.service.ts create mode 100644 server/src/api-v1/asset/dto/create-asset.dto.ts create mode 100644 server/src/api-v1/asset/dto/get-all-asset-query.dto.ts create mode 100644 server/src/api-v1/asset/dto/get-all-asset-response.dto.ts create mode 100644 server/src/api-v1/asset/dto/get-asset.dto.ts create mode 100644 server/src/api-v1/asset/dto/serve-file.dto.ts create mode 100644 server/src/api-v1/asset/dto/update-asset.dto.ts create mode 100644 server/src/api-v1/asset/entities/asset.entity.ts create mode 100644 server/src/api-v1/auth/auth.controller.ts create mode 100644 server/src/api-v1/auth/auth.module.ts create mode 100644 server/src/api-v1/auth/auth.service.ts create mode 100644 server/src/api-v1/auth/dto/jwt-payload.dto.ts create mode 100644 server/src/api-v1/auth/dto/login-credential.dto.ts create mode 100644 server/src/api-v1/auth/dto/sign-up.dto.ts create mode 100644 server/src/api-v1/device-info/device-info.controller.ts create mode 100644 server/src/api-v1/device-info/device-info.module.ts create mode 100644 server/src/api-v1/device-info/device-info.service.ts create mode 100644 server/src/api-v1/device-info/dto/create-device-info.dto.ts create mode 100644 server/src/api-v1/device-info/dto/update-device-info.dto.ts create mode 100644 server/src/api-v1/device-info/entities/device-info.entity.ts create mode 100644 server/src/api-v1/server-info/dto/server-info.dto.ts create mode 100644 server/src/api-v1/server-info/server-info.controller.ts create mode 100644 server/src/api-v1/server-info/server-info.module.ts create mode 100644 server/src/api-v1/server-info/server-info.service.ts create mode 100644 server/src/api-v1/user/dto/create-user.dto.ts create mode 100644 server/src/api-v1/user/dto/update-user.dto.ts create mode 100644 server/src/api-v1/user/entities/user.entity.ts create mode 100644 server/src/api-v1/user/user.controller.ts create mode 100644 server/src/api-v1/user/user.module.ts create mode 100644 server/src/api-v1/user/user.service.ts create mode 100644 server/src/app.module.ts create mode 100644 server/src/config/app.config.ts create mode 100644 server/src/config/database.config.ts create mode 100644 server/src/config/jwt.config.ts create mode 100644 server/src/config/multer-option.config.ts create mode 100644 server/src/constants/jwt.constant.ts create mode 100644 server/src/decorators/auth-user.decorator.ts create mode 100644 server/src/main.ts create mode 100644 server/src/middlewares/app-logger.middleware.ts create mode 100644 server/src/modules/image-optimize/image-optimize.module.ts create mode 100644 server/src/modules/image-optimize/image-optimize.processor.ts create mode 100644 server/src/modules/image-optimize/image-optimize.service.ts create mode 100644 server/src/modules/image-optimize/machine-learning.processor.ts create mode 100644 server/src/modules/immich-jwt/guards/jwt-auth.guard.ts create mode 100644 server/src/modules/immich-jwt/immich-jwt.module.ts create mode 100644 server/src/modules/immich-jwt/immich-jwt.service.ts create mode 100644 server/src/modules/immich-jwt/strategies/jwt.strategy.ts create mode 100644 server/test/app.e2e-spec.ts create mode 100644 server/test/jest-e2e.json create mode 100644 server/tsconfig.build.json create mode 100644 server/tsconfig.json create mode 100644 server/yarn.lock diff --git a/mobile/.gitignore b/mobile/.gitignore new file mode 100644 index 0000000000..0fa6b675c0 --- /dev/null +++ b/mobile/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/mobile/.metadata b/mobile/.metadata new file mode 100644 index 0000000000..fd70cabc06 --- /dev/null +++ b/mobile/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b + channel: stable + +project_type: app diff --git a/mobile/README.md b/mobile/README.md new file mode 100644 index 0000000000..9304b780e2 --- /dev/null +++ b/mobile/README.md @@ -0,0 +1,16 @@ +# immich_mobile + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +Few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml new file mode 100644 index 0000000000..61b6c4de17 --- /dev/null +++ b/mobile/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/mobile/android/.gitignore b/mobile/android/.gitignore new file mode 100644 index 0000000000..6f568019d3 --- /dev/null +++ b/mobile/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle new file mode 100644 index 0000000000..d7a11558d8 --- /dev/null +++ b/mobile/android/app/build.gradle @@ -0,0 +1,68 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.immich_mobile" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/mobile/android/app/src/debug/AndroidManifest.xml b/mobile/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..610629c0c1 --- /dev/null +++ b/mobile/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mobile/android/app/src/main/AndroidManifest.xml b/mobile/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..71267f848f --- /dev/null +++ b/mobile/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + diff --git a/mobile/android/app/src/main/kotlin/com/example/immich_mobile/MainActivity.kt b/mobile/android/app/src/main/kotlin/com/example/immich_mobile/MainActivity.kt new file mode 100644 index 0000000000..520f053b5c --- /dev/null +++ b/mobile/android/app/src/main/kotlin/com/example/immich_mobile/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.immich_mobile + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/mobile/android/app/src/main/res/drawable-v21/launch_background.xml b/mobile/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000000..f74085f3f6 --- /dev/null +++ b/mobile/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mobile/android/app/src/main/res/drawable/launch_background.xml b/mobile/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..304732f884 --- /dev/null +++ b/mobile/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/mobile/android/app/src/main/res/values-night/styles.xml b/mobile/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000000..3db14bb539 --- /dev/null +++ b/mobile/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mobile/android/app/src/main/res/values/styles.xml b/mobile/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..d460d1e921 --- /dev/null +++ b/mobile/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/mobile/android/app/src/profile/AndroidManifest.xml b/mobile/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..610629c0c1 --- /dev/null +++ b/mobile/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/mobile/android/build.gradle b/mobile/android/build.gradle new file mode 100644 index 0000000000..4256f91736 --- /dev/null +++ b/mobile/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/mobile/android/gradle.properties b/mobile/android/gradle.properties new file mode 100644 index 0000000000..94adc3a3f9 --- /dev/null +++ b/mobile/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/mobile/android/gradle/wrapper/gradle-wrapper.properties b/mobile/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..bc6a58afdd --- /dev/null +++ b/mobile/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/mobile/android/settings.gradle b/mobile/android/settings.gradle new file mode 100644 index 0000000000..44e62bcf06 --- /dev/null +++ b/mobile/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/mobile/assets/immich-logo-no-outline.png b/mobile/assets/immich-logo-no-outline.png new file mode 100644 index 0000000000000000000000000000000000000000..d4e7085f125b64dd053be71b9616f600feea5c00 GIT binary patch literal 147005 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°D%YtQTXO5y?v7Ir&{5T_9~G{z@loK`8KCw!FU zEQ~PT`*wqd>Y>%o0VF9RW?*x}%ei|RStZi7 zp%cUK_eq#}tx$mO0!MT-=YR2?t?bin^{n*st6mocJ4&qQ9z72F=smg#)Wbmb_V$$> z2s3eMS+WnEGTs8`rCJ8lqLO)y-}+pA&v%epQoNJD*W0S&uH;D7MUgdl^Uyjw?gNau zWPUB^+4_X9k$XlD2Hf_)P%0BOqPSGszLGXa(%=C4U-IacszZ74!du0V)J6W z23IJvY>6ZlQh50*j`|fDHJwz}yKz#aKQDDMRHn#ZimF-WR=5g9i9jh=fG!yLyuB=yV{UmFLsHziaU!i!XIM z_w%gH?p>)sBt=N=8UK!}fZrB^c&5+OemlNQ+R2zhWt0nRO&&7jn;qN9#GynyCcZqF z%YN4&u6G~13>BibkZzJ5=Sy*HTdA2NSrs%g4x3a|T2rd6&BXnwr#N2hQJAPwaPC47 zeaQmZGn98d$f>U+IiL_k%fz(MY?!6eY%Of99vFK~$C7;K!mDM?s)9k$+10-7;+CqM zGhbZMWQd{`-Ola~Y85ACq($racfX{bRyZ-3oRJ6_Uhx^cQ7*L>Fr*EAY4&?85_fVX z9}2K=RFo=$qFWUfiuulDxfCii&IsIGk)RBaRtp4)Ceg1J3! ze(C?rpxVLz@TkT-e-1+gj6<$6Xq>SewP%35bm`}GL5%c7DV_$ z;>KG|H2P^G^gms7gpZLu?#o@C*J<fQnR9Q-yUGOWFau}M_?c5%$^!5M$+P;p_s9^PyhWFwTgZcY<@HfuU!xt~4>rzcsTrP#Rq5^4mxyhH5<+@zSqtAvleRt??x8p!cOf0CV_9T%D>E_o05gt}6oF=h#D zF2m(b^tWz3t2aMLUZq8}CDE`%w=6fpCO;W;?y1$latD2G)HEi=RMMGYj3 z^>oy4W=Vcn;y-@Kwob8-)CE%+d0#5@o}^{xPbGY;y^9KJ6dk16gN-rOA1NBAHSc!| z7%q zER$seA*scq6Z+l(*vQ-TdTf(HRZ|)hurg(p%_j`(`~;h$d>inXA^g-bEc|WQ)4vF_m*(i^`)dDTbr$-c>DgW-vlx$a7dZTUokT$#|A(-)=n&JorZN=7BdQ85wg zQ6l4wvv!N8C6(_;vK*=4YZpReQra@wo~r+rl;2cy8lym7%3=3Z$f;v*!%m*_w$$B% z!4T>RwCw?bk(hU@)1mEbmx*XDx_!MXeENHQ8D;kmj#M<1-|nvw83 z$$La0rsPy&B1zQ4HVy)ukqs|c{Cw;s$A2ttt(IvtK28`cjkC0IQ8FozkA?~JaI{22 zQ76uVVYFXOpWA?uv$yRcc0biBEH^kydgUzpWPV|8xz?-BrT%4wHrSg@o|ZT11r6Fe z*IK-!hr|3!8|pLcV}38L>B;P9?E^CE*z3hKNb4&+?S{Ai_{=%4Dn)~lB9wZab#rdR zwNinpRF@_pu8t19r51fRQU8kgvxH@vDpY67YKoC!PGiBsyyU}jr)YWy=%IV$RvPr) zj2L5gN-S8#s?r!GL%l7<)gvfhDb~BoAF-YrB91b-N2LLl9iYU8;h5Ptb zIG2TCE_wucjJx}<5}E5dlVvom(2sesdC_quc6@T<)Ve|VVLT3Xf{va4-zg6d3%`X~ z#a{>u-#Ke}>MeC_^^W2M_O@aB>L%eE1F~iH$QrTYx7J~6=vdDyd`3l2q`laO3VOb? zy@B;w0jaC_dxq^Wd>Rx+3pPZ>jn~7y`;T?^EZo8qj;EcY=k$xXcgp#oqi|ViyXLem zV2NmQ8ig}EkvmmWc$F+$_G3y3km*GkuGOAZ~L#ud^wT-rlB{cWXXOu3zh+f`N zPYPMt6XLwz5J)D|@Nj@+GRWmvKPP?1c_r7nH5AUtOXg-x@k`P%QuQH-GIdyZYnM6H zHf~kqyYh>9ejVbY40ozo*Kd4CwNN)EusmBHIf>(sJa!Mf%vG^L>`Ti@jI6Jz^k8eq zsjVFhx8sK;ND%RJ64&aE92izjnrKE84bWw0n)Fs_Q;aP4^wuYjz`?LgI{7g+PgTar zs9FfFiV`$Q@r=T^x8vG%2a`ldHV{&j6=<)-{;EaU@{1}?ReY?c!g`htdCL~)pdTrfw~73>~9o*!lW zX3bE|hT7)y3R849N1v4Q%_N2}#X9mqqjv4ngw3M~MJ3R)x4j{lsJ5_h-o7R5P!3Bj z-w$gvItNE7b^@2);ABVCI(6kgGLByH<4A}m=~-yhqX}}X>+6{a<^Ofom?iqFM(X2S z@Xi}J+>tp!3vTJZN1@(p?(b?*w~H{Hxb_5F%KRY0-*>~fYATtuMTIEb^Y~T+ zkxfPq&cByIea4MD*QA01=MWUQ;pc)H)h=&(!ofk9XU{Q4y8Epy*uT2Cq-PU`ti0}t zz~i&J%_1k#M3lO?9!M+Bm)0NH+A+}aSB33XMI5IHQETe?e!K3?9!e)rzO?PpI)W#^o@x2e;$TOW6l|4v)XwbujLGEHKJ z_Y6qEEi0NQyDV}s%D7|K@e?XMVEHca>v8yb>aN8&Wl6`pGIZvZ-;{UUGlgqH_#`FH zJXWzJ@fSLhTPW-I9bTkP8otSY#`;3R>1(rVAsQAD2`s&VNmQb8T*jVSXvT~MH%q?! zd%fZV{x#316lhu6zOIk%8B;PBbhvjO?9O=HL7&QG+qVwX*8|=AS;jV$`8hTQ=ezO}JgmZUuVWx2P&lCGqEmzSp9e<2&w zg=0}3;?E#{MbNN|XpH!I>6oYR#r1l@5`9X`5t_JRn{)Xx774xG4-R-6$;Su`F2OSSaoP^$B4e#=1 zdU^L1?cu$M?jj*QrDtphD%NqUrWax6t1tL?VJZw9|=PBQ`8%AUkbdPI<9>(#`hFLzgeI^(q6Un zBdeSG<3_NS1#kCxWxdFH>dCt4wnwblY`uq%!%P%a=twcGEfb&Pm4758wOBu83@@kH zP2v)6aY}JnoE;n7c59TSgrW9ZolkCe5q|?)(NMU|r7-zd3~9)%aqOveYT|=4>YFRB zH*YiVi$6~ZL;7ck4z$5&Ki>Q$3T}O8w2`zmMi2f^0wu5%z)~#be-nXk6*^pd41qpJ%BM zLQn<(Q}o~@%4_!dNRW@M3KFFQFO!Ot)-URFwRummwSF#Krr;x1=8oI$Z93Xar3#Gm zqZ6PZ2lS@CZ0%WDXvNvhBOQ}fIe^Q9X!4gA1sT=hs|M{mw37SBuD|T7M~FIJhnz?5 zFKap$Z&L+}r2hNqi*!D6farbtO|H!(h?YoLc=3{g{CsJ}lkmE^ZJo?yXBJANvgkf* zh!GhU+duQ^cHXz3-!sH5>!W_tyDAq!o2;(`*XpcRG#E*vR=q?01Po!8Y3oJ*>_xRH` z4^AzSq449&ev>%#_IGv3-~WY&N9i>lV`({Yno@r^a>rReqc9W#qqfL6d2Jpw^E^(j z{AMgmBUZxs3PA-fd8BL@U$gtuXm*_)85}xgNFf~07z5WtJcIumg{KJc2 zz~zfHVlh8UL^-3A6i?kIz(Tv@5`q_%f9jT1BK`z5b%|R-;#JbNnGe~F0Ow%Am!>^~ zZn9Gvja%`wKaxd%)Y5EYJdagQ+RT{WaceE9pM;tgF)vR?zp`T|ZxEAHJf3OO5j zYFofN=z&buF8xK>Dv!$J=-0pzb5V01k9AYhvCh_@x9bKZ1;gpU>_UH}g3?2mRZB|`NYIIL zh}~kKUh12y=Rr^I%Bnx4GvPdxdsK8)w{*FbrP`!1_XElJ!j6ImZP0_e1u8hu_q$ff zrppu9D+^MvaS(Z}y?&~N8P`?`_Z-7ABciT-ML+SiL--G1KraTFu)lL+-l?(>wlcI6 zI;s&{Ky(>#_m`m`Nr^v|XuG1Og0uIaKCw8vRYCrYaP+~ehFeI8&8|TY2bWJ*_c`g9 zh{{j7@e+urmI^AMYkqS4nj@`G2y8z+(|RqbC|ByekXyd~K55gno>yPZF@T5kc{_!Z zGZVA5r)5|DQn=iQM%TLT!3;8wvO%1`Q8+3r+-5l=a0H$tN4xW=-^K6pQOvJ!%5#_c zied-6@*nxU%_QJ}ew$w>djIc%=D6j44^v_S#qsiGXNDGnh#IT_dVXZPhEVT>gTg<} z%fPG=N5BlZZeOOp@MEdm{hLiyuF+IMi^_I(Hb)UX@78~DV78WAd|e^pDim_nWYuF= zRUXE_{Cx_UnZBDZ1XJT?mMg%=cr}?_4lr=K$s{RZmc$eC;jTU!?Rf8GFvu!@{xIOT znQyCy6bK{_Cs!vrrKRS^O9Z;n=349YZ<%Y^=&CJ`|qyK(UdFqelMl3YFo`n0P z;XgNM1hNX0Uw}G&D=1uA-w@O{km>$R$sc=dR$!&vx&kfP#lUh3>S>qS=+h?g3~arD z7z?C9o*g`|YSd+g`O>DxO)KP-AHN-yNlVMv?OnjLuZ7;s<2kGBu0m0gr$17XkJYgX znWkCUd(&D0AnP+A$tcr+lgP~Y-5!qWhP^OSObQ;TqbI?vazsc&O_)ijfK0h9i|3$Z zWw+ZWX=x*ey$jlPmLtKOu2a>+MB3$3rlVbO9mW6N5dej?8;aee;5C?WmlU&yn^3lj zN=U==yAWy|&R+U}9_YSv{w(tL3YI%#qB*O(*ETVo3ILXi7qgwikX1;}YIhradzRw0N0Lid zFIoHhx*nqA{#%LalBXd?F8|GtHO1#IJ|&}8;K&0MWi;3(A+h;!{gi#Njyj!6EEbIT z*sGP=_sBI@73(<55$~qh*M{|(JYkhl;?y)xY`470pOZrI>(&Cp58NU-V9!5Y+qP3? z(ukDh0goKZG?ayMS zLORsQsH`hwz>B6Dpc!3^>uy;{4|jiUPhi@)oeWL^w<-Xq!i%$q`Qjf)hVes$f>Mv_HY-A zqO=6qntJ;tR=7L1@M=Yzi5;&jEo)nEiB9H{Xy^yfV>^w%)!yVG ze7+1SE1yvxzz7}2M&=Lro)w^(X5p0WwkAT}K9YiP&db{4g0zJBYj>of^a&ns^DcdxHCpb#h9im<{Jxb5Y-|`F=*YN!QFgewyLZXIT za++5kSfq=X+Dv?o%S!@IjJQja$Y@$zK$Op>Wcw*8g`zxYr3yLVZjpAPS3p?~|tDYxZ1rX?D~gB@|B!7k_b{XDp~? zXxJ56cBC3#NC|b$r1X{>vNVQIqWffj+K;aE!|I#0cSZ{??kYY9Yng*bxYibpYDqx;e{Bza?G)-uSR? z^`CT_#d5f3@J&0i5Yi{B_^Y{*r#5Ch49b;?DKVa3xmO>i5R{_E-aztRD5`{K_ave| zUy0s+V5-Y5{mYf|)R~SR0GeYlyeC5>Y9nGXxv$<s#rv zriL3wol)a>r`vG7-y5=u^Q5s8>a|wDo|3Tss;9~k)89FKNM6p1CsF)GWKPRK^i~Ar~Hys zIOu^O(OV`t5IQIWnbD_5Y%jQAHZw7v5if)Mw!O5>NUW}#B1Bg`<<{^0&(_KFjf(#V zvgDqFdtQ27a+aNECHx_nL&vejDKl9mF%w-u9&8DQV@kcPdjnb$XFDN8i0Yc0nEYY= zPnsLKvZl10iA0T9zGq2@DlG{T?Ve(S`2MoTqr0rap)T^`p z_MvQZOYj)8F_Doqv^?sQriBEe90Yoy>}I#u%l?iCiKdn8=mibskN?KzIoNe?|C}S2 z#r)*Q=edKD#0@kDvbp=hY{Vt2K?FgPlmcBhdlDIcMTl9{F1l8cVluj{m=PZ+J*#SU znu!{AIAOy({4U5cl!!MX&blG@pa|l|*FB3~U$LEong3Mt=Jh^42KK~s!y980XOUHH zU{zLlGmYT&a=i)-z)A&4Z|?Mvl4!rx&i444)b`wN|4So8qB*%XSUGCuqG$#<;xFUN z=G_`UKIfxnPb4JOLNI&7fEGVa-AwjkS%J8R_zbVUm0Q+n?Y(4 z3~8{?U#Fn){0cB&y2pkJF3U?7)&<+E;OMSHjks}5NREIrx;rgy@?KLeM*jG}N7$Ef zPKr$*T;U9cF%a2>6k;luUYxYKP|B#(>hPd?N?UBIDQ6k-b|-L zd?Em0wP(ZxfUn{aJ(K1H6FKl_Trr;JPpC5HK07`5x&Z5_>FphHXIXLi_XzIyVldZ8 z7u-;RRU{WOuBZqeN|McoKo`h&7~Fm3O2>PTe{y2Zv4mXtahB{C33BSSvI@XgpExp{ z?J-n{e1oxPWg6Ay88T`O%mp^Y&3rbmDt>5iBFmC{uAQ_6(f9xixW>iYB1&|x< z*!n&wm*Uvvk+q&qqH$+`ZzLoY&@{C=oLH5ns^eh{9a5QDxE70+3k5!)I}NW*MtOJ# zjZSVbe2_j#%kT`7A<}UHq0;+$c>Qh6IQ}ruuK&raB?8hVe?A2%omC?y94WHgUS)Zj z6mzj6!}%2AruEMvx8HvuyQF<~&Y2jMfYCmE2)OxoNBI8Z1d)uZ7BnFle%M4A-3K=3 zS7rga;x0ME&X3?%~1g_7W^ae!osFpr)JtySSG)+lH#s zJ~Y7nHyEn{0vG4}Lllzwsl)yU0Rb#Ey$>(7swJo55si9ht$Y2M1f=PZW9&R_w?$x( zlB2i4$~%`ujA*9_6?s;T5r||qUE7;ocsG{^ocTHDE?mx4B^Os z=-l{4N{Zp+8-4El8Ow^SLXFV8ndZmI3bvo&TN_&ZR6?EZf-(fTO1~Zd0gg!n5>z{E zJ)H@+DC_MO9x5ICTy!$@`4bJA5it1B`|HH#Mt6eV|Jj!&Xm6h!bmmo z6iHeigEQ##xmLr1x5Vq{ebT9-`Pb)~4k5?Jhk1{zdW%e2Uw`}M(Li;4y!TLS;E%#p z{Ev#6bC!;wfTOg0Qv5D7Vs8Q=`BKmS%}4`Lh%bos5kagoLtq!g9brs*v9$EA&Vsaa z+j7?<(rBjCY_p`R$j&L)F4czPqdFt^OW~MA+6TdLXrC;(x(8S`WQV*NHI)AgKZdmam5o zzgp&gm7!!rd|)ta^f~EGWk9SC-sq7aJDEVAw9jUYI@@J!dUkr|N<17BHQ?kKOf_S` z>52UZ|F1Ws;XIy1OW=FUD&Ft>tG^w~3ItzvZxZUB{5V zrd;tb?BgF*JYaLABdB0jJk{LzRQyB9e=nOq0J;p>*QI-N+o)b^ zV6No|eJ~=ZkhM;5_|b<^fSel7!42fXR)j|#8u<_-=0grWwa?gXz&x%{m$G~H7-G=P-gfsh4_t5^cq_MGE;8@vEoBAUhIkGC+1$@<*)g7~o#X`YG~)3NVW3jO)Cb^?JMNH` z<*FM~*}~4p9S8)IoihJ>l<@ zKlLD`eC1rn2?Wye1aI-~@EwSwfBYn}Yz&doZ`2vWTTaX0A}H>aX1vzi#~H4v0I=!F zV}-ZB0TJ@)IiM}51C?;{?@f3CUV;|4t2gObJw*U|O!1kx<(*sF)W}X`?pFme>O)|{ zlw6e^X^`diV`pC*I(#YKkB@;lwV)m6H?el0Aw4aE$&>7I42_H z2ZYEIvEO#Y8nLNwlt~a=B`Z<%6^{nb;%I$@-^L$7}~o%jcq+{F9oSMGy<&MUUgKaXbygrGOhm-f)}) zBF!YPN~&`x;<6YVjy>zdyy`m-WpbL{02TM>#U|ST>2z!OEI+(}$TZ{pN$cDVR}BTE z`{gRW9o&b#!BO&yW$EV|9!&R6AT}ED*{QVbdtx*?i1I4LnGeXP*uR*Bd_2uo=m?BM z&e<-@Zf8Pv(%g!_)PN}DDLJ*+l_Kkb{IkiO9%FD^j7YvS1`*=V=~azbAtbFz=CTan z^gY1oTyVh-^1wl-d?W*8XG;)nqT(s__$E!{ZO1bpz+9*k(($;7nh6Hk zk~kBwcUwcbM=O`CY<*n=`F3@@z8ZY@MM7E=$4`-B>i!#z41D!_90~CysGX61MM5M< znW?s(>FC>zP&s{4Hb_Co3DbKmmHE`AJ%!88b6mV|KRBs-LSp|N$GpZ^!>D^h+~fYz&}qk0$$;rjuYas2jeh!IkaJzZ@oXfp|T2o<*U zc`R=PULtRPPvPsadA4-LNt+w&4~ZLoA1GMktlVrqVkfYl^b8f?4T3er-R;l+o}WKy zPD_j&Ssm{~RdbzIv>akr-v0dae{yT(=GoujLp|=|zv|!pdZKHt@3YNcfLa%J=Z)`w zyLt&x*F2$=u?$8o_tE}%JRJNDr%qEp=>TO zRy{tI@(x8+9H@Gpl`>9M(KYsh(i6v&JjCKbXl2J2aC=$B`}tQ(3yGQen!Q+d&)H*kr(n>q2celKwYQKek~VPW)$YkgZ1DP3q7a*Q zYm&LN)xSzyklfEEeJ@EdEPpI0@#P)lV33zj4bR$s#J4jffqa>@WJ16?$tpgJo$n(E zrONu?C$oj7EK2i{49(Ix`%OxB(gQc+4G)S9n9WwYdP#yXYH# zxv)<{rMM;LE~_WM*>f2W6cI!zgQCZP6mz8MYJ%A1|L!9qghDsi+@k3u7bSJ`!Wc|4 zr&&2=qw~Jqu|K}y!MhJMe|Ep|LOc#9d^wPuTOww-Bq(=YZ{4zoU^ni6HXiHY!1Q{4 zGe1Xy*i0Hh;!^%09FZ}&lTG>ZVI1mNvG%&$=%_%Cu@gmHu6h$H74oK-F1R~!EE9d! zgBc}UFzIn!Q}H7UE5Sq`^DbWhAeNZ0;|V7Ea3yzHn)F>1A+!|@4n=vBQD27~0cVie z1u+)HA_WY!$ZnDws9tHj-y4F22#E(BYLZS~`7vCe2zUAMOalavCsE=gkyF+OlCYDFYS^rA+6?h}sdr!VS zeWZ%8srPZz*WsyaSV&3^xByO|H1qr>)b@SqhP{{7LP4SZkqowIrKLeTuZ{Mp;ra~( ziQzfv5jXkdi5~Ga?8vV>PDF7pv^)7yG-8a`X0`~2yz2l)kSptci?~KHwI==akvyRw zf-53e%KIde_UgNd=L&jWBmitvXAa~{+XPL&zEq>0$m4>l0|Bw|ExkNfltq@Xr7&N6 z;j;fYX~^6z9_NpEq|x~NUN7mMXDfAoy;ooX2a%4V)gLA2wj1d^PF zQzhqP$ML~CP%TyxmQ;0n>>=wD*TH{yEt5vr^n4aP7z?bBmiDcK z%pg4r?9m-s!=#vb=etmi~f=YL;O6iE|Qkm@M+oSl#F<+xZe8v#i)g| zK`ulg5pc_PSftoP;`<~aImWjNYM4#6(uR14d zO6Gs#*x=6r2{P8Z<7IuE+`y8O2oWS+PzFr3ptQup(GR4-xhG2*g6l}1e%9)bIM7M> zTlmTk5>U6R#F-F?nZCU2`Ww%rEp}^@|0uv$aW7@n^vuzAv??{l2qQl)R0p`W^d0rT zM7L3Ywmmnessly9o|UxxHnm#7do={)Ua7UVe=k4{cz9!HTxXJ)9fFzPu76rAz8PT` z-YmE^>9L$lL^X56x)?EO+;GiIw2JxCENtGU$U`pScZ{aH!T!w?^8#a`-peq+XwH!a4yD{BF3jdrL zO|ZEOGn*Aj2k*z{D^{OYq*}oJS@g@waWe@J;E?;I%!N}x_O4gKeDvnRUX{U+2Av6Dj`&Rq(479Gd-BnQgiW-Iy$Nr3r=I{T9 z3lCqx>iYkAkfJ8pa0*F*yHLX5NfhUvJ|zv>lc?dF;j6J_gn~VqUv_-ri4urU<$raC zy)z)J5DF)+>JzQ!1JRGF2Xtf@vbd8)5U8Bb85e@ zxpwgPmzULpOF~o+A%tme<2f{zf^(jw2n<2M@Mo;=u5C0a#sRJvk9LRpYlgdRq|-FM z3_Om}5lO%Uz?Nw+r}vhE9-S|)8Ug`t8c+1*r1-LDNx5l89(~{MAzYRi28sMSt|Ry~ zP!BT7(=)omfe>fGFF%ADw7$);ol@@T;71k=IQ}=azv6#u%sw=YXM#*RHopv0D(w)1 zH(N_H^C*cEMrZwLN$9~d1gRcx;0cK)`8U2dqzq!JM1~};I(PZA$pg#u4{ox;FLM9) zQFLZ-+s{HVD1F~q(;)FKr9haU2@Zu(&6qK!=gA%*NGz|l*@7FS(XNBeLfktS(D(e1 zLrVlJ(MA9+y`BNTV7`my2Q(QQ06Wj*`<)r{LNa~}582i$LRU`DxH&5cL@ zn|2kHx|=esuT(ak{_;7X9yWCTrv<2HxdY3WtBfmnikb>pur4?Cfy;q>;~_3@om85B z+{ph_^|E9Qw^Rm4ew;eExM}x^lIt5hdE;_nuA^ojy{0NYG?!fn%fbHoDT9kpaERcm z^K9st(TGO6fjYqO3~g^c5c`)wgA@M(l2blW_?WpgE)rA8G&6S|_@eO8rK8UIsddiy z&-iu~ppGJuu7Q3sT%ydW>poDG(QTUO;xtKyyy0%LkA4CX=TfKj&fP^DjiA7oO3*qq z_Pc$Q&t=5owx8JR5vsp|`oo^?IOo+=;4@WaN9dhCR6;lI)PCHgLAbgMN`G8nu%bir z{)!LK+XY&{e}z-Gi#Qk(A_q2181*4|fVmYx`T>~3Y8~0?Qzff)FO;8x^a5J8n`>r? zW*#cQp>p+l^w+z9f^G-*=!50jTMBhkXTyTqa>%jS<4N@gg|&1u&yvpXZT6SpeuEO{ z_Aoep2-dHm`Es%?e#CsjI5U-6mQvJQXZs;Lx}$*&>K4B z3byn|8erD&-Ir@*$Z`b)?0f@8bRR{(dq#&#!x*N07?!Ts&=*$-G-J@mEhf(4BQ*j&@Y$!d(gOM7E^6*RV#`l zhh@ZPJw5=iq zf8-#W<N}+rH>*kahB_ZJ6oz2`Ubq5+}k2+XLSl z>hP=ekZ*tO-SAijawu&!Z@v?n1&=w1LTS;YI%YY!xsSmK?c%N9-PxoI|D-Ge0Yr3^ zWu*U#_QL*ZkEn?SoGlK3n;LQP5gDe z4g};MJ45@GEC`kT89tw4cnF6EA`f@6dZljPe717Mz93n+#1s^S{qfS`PTm9b8cHrVP0n9c-yO4%p*R=IEY+o7Ul6 z0QGd`1;NB%Ni(iW|0{^dsOuzC;r(AH3QtG?1Kv0CCI>MABA8+cdYCE7fuiwC-?L34 zg`U^^-ge|?rY)mxs`O{1h*OLxdKRwQ1!trv0R3k$mUPjMKP*&qsi~q{d)u%1Ss?4x ztB$CwRQPS$!};W4Soqbu1>$B!Z8wVvkSZT@pWb0L|DzkE7#Ds0y#QP#9E4dQ{+pI) zF_61zGYhBq`z;{eH=O1rb)jaY`JK7*5x3GKAp%v~LmDqK0FqAUdl@|?{MC{aTW*hG z_VOx#-EgIf$j;0*17Od_k2PgL_fm=}ZYDwej!-dP{7>dY8b%&|ItoOC>c$NLXt+F2 zD}15(y8HQuCI1_s zxn8cjBa~_KfPdf}`m&bufT~;Z{;Ggbp?xW+q-m*4_iIJ+0?56>!{7Z)YS%`vy+=@F zy{#LBC*_C6*K#eXmfdeQc^rPtt%d57H(e>^_jrp?P$wj;6J@_ODQhzHJ}NOXw;yQQ zeC=97iIzBLm{`c6YPB%AF!Bk~W<7Kz>X|O3pVG#ae}4(K{}jj9zsg&PeI$x3^E1Nn z>i z-H(9eEi*Gx%I&kTerlyvfqIi5otGO@qYWp`|1OLpPj#Z})2n=w;-mtA2!Ax!H&TS4 zRF9lod39blAbp6DNMl~n${t)rne13fx~c6>CH=5F{P=FIw^Uat_)Yvi0X9HV;EKpu zT-aSP)3o_nab{kwbN0;$^&lF=4>R~zrB;o{0wlmIUWyVT%T8tS2jzf*3<)lL#>sZL zgt|n?7DQ7_^*>$tPpA|Yv6+n^9$)jN?DP&K@iH+Xt%j1A;i!#M@GO!X4)$CTF;i^W z{VLMu({7P`_bm0tD(5{EvI6%q{#ns}=`gsMoD^xOhf?Ogey2CJjt8uTAyhJ~PH*S) zKo2oY`r6~3@yB&G>r$2q127h*H)&rnF$KJjoG!sn3HwK8y_?(!*If8>MfkFS@0y`( z>#eK5bRVqn)eVRFeT;Hxz47da@VJXp+&@K%^t*vI_ne5et^67u-U9ryaO?-{D#-WS zSvN2@lJ|phLic9qnK3F82QU;#C?&MYxb4;oLXGYJ(kPl-XwLpvrE7{oZWzKTo0N8t z96$U0_=Kw@yeIUs4DwqCcyFx>|6{IKwo_d*7?u`84*$57$5;4tHnPxRHRdQ zQt~QM0!0JdaD1u!ORO*ehv)+@*G{&%EVh@_il&Wi$+Vm&@nFMN22~Vq!}?#s*Im~R z{Lx7-b(2L`IWYy`%%@g|7M-X5pvv-lUQr;0Q7HS4_Bo|BPa7v}geU8@Ohd+hEJ7~hNZQVOU{?fu3sg+H`AK&!RX zVU@YNv z3%N@LzT63VFm_HD`(z2(g-zGJoNp& z358$xJC($bnyu}@FhCmy`M-|8Z#XK#8(3XkHqNjPoqP zsTE#w62$Rv54PpQItbcM*%_hLk{?*6ZuyFyZf#E4n-10I-xvC>6O+H`;t+c`upjV} zDL1X6%1FQT2Y={aOq(4@%t`fi2QRBT3s2GvSyI7) zNMfI5Xqa#5Lh{bxnF?3r6bk&7Z}v=Wk`3w8s-sH`-S$my7i0#(T2iN+L^K^zG@nn; z2-)p(&nyclMCef`X{=>ozYMO;$b3bsNWALjx4*Jlf3U)`6q&yQJ3}6|&%IN6e{1_* znSl?6`3ng0Y;`8J?29})Q{7ND<^AqsDb0%yVK2G?a}y0| z8%Q_KbxyW*huAILzvSiD3W@`@_d(G+LI%wKlkm=47i#&`8gWZe|3^1!Dkd5yn*CQ% zTIk9y%<-%w&R!I|p7Ll!dnq&|uli6z#e_`WJ|ADM9w7PkxIy@mj5nla_rERNfA0ym z2n)cCj0ac7gg>)!`apN$=E(E{O5~;z1!n)05fbdzFSOLB)HH7!DnBuZ?Qq3Ww_gSSbk+?0& z@mKmI{(({tE(gZ6Fe82N)EzKyUW_op%FFHM?tHGM{3A+R1XrhsoFd;&;OkVXOjT0l zKVvmra37&DO=_W<4snxon`|+|+=E>^l>gblxyMAV%!^QbJkC_sP9RK zd`RNLa~HNRJT;q6Oz<|s85bHiP`zi8bTY8XGFyZe{d>i*syV4WsA|pRQF!uAZhd)6 z!2N}dhI!yS%bc%oi5nAygR(}I&K&8x1|i0Pq{;ROz=Y6vmqPzpC8g`{KOA=_K|lTG zMV>l7y%d^1u9uu%8SSkntSO1ieuMg?RbPuNG=5AsVwKdXH3K#`ZKTF{0~f>UEt*H$Du$p^&jtiB0|&+k+f=p06}KPe04B*`=;Y zhTmYgOy-&0e_n1I4Dt-~;^n%G-%^DdA_M-)m4$f<~qF4Uja;pP{yo)nHgi{|^TEsrcc&h#yLTW~}P-&wOLG zzqi-?oTXT!hR=6?yL0h==JSb?05-;hsn=xfWM%oxBhX2}T~c3*Ih1%906ZZ@0CjKZ zpiydo3Toh*Rc{+m!f!m@zc%L_L^RzGu1VV}Gt)N(F9-;WN6b!CMG^9Td4N5||NIs;@%JkrVRF}D5C8TgMDdcw)~-eOFxBh~pyQ9#huVEn z-_Hw%1?vI^^2}KriMNgG#>En<)lF-|_Qz1?bW2CEb|tj7_}OTEtEJ@VJ!vcN2cub)4_^WVxM5Mhn=^;sYoA%0DRIcS0{7JAFqvK!dJ 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

oYf6f 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 + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/.gitignore b/mobile/ios/.gitignore new file mode 100644 index 0000000000..7a7f9873ad --- /dev/null +++ b/mobile/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/mobile/ios/Flutter/AppFrameworkInfo.plist b/mobile/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000000..8d4492f977 --- /dev/null +++ b/mobile/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/mobile/ios/Flutter/Debug.xcconfig b/mobile/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000000..ec97fc6f30 --- /dev/null +++ b/mobile/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/mobile/ios/Flutter/Release.xcconfig b/mobile/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000000..c4855bfe20 --- /dev/null +++ b/mobile/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/mobile/ios/Podfile b/mobile/ios/Podfile new file mode 100644 index 0000000000..1e8c3c90a5 --- /dev/null +++ b/mobile/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock new file mode 100644 index 0000000000..296e770b67 --- /dev/null +++ b/mobile/ios/Podfile.lock @@ -0,0 +1,50 @@ +PODS: + - device_info_plus (0.0.1): + - Flutter + - Flutter (1.0.0) + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - path_provider_ios (0.0.1): + - Flutter + - photo_manager (1.0.0): + - Flutter + - FlutterMacOS + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + +DEPENDENCIES: + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - Flutter (from `Flutter`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + - photo_manager (from `.symlinks/plugins/photo_manager/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + +SPEC REPOS: + trunk: + - FMDB + +EXTERNAL SOURCES: + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + Flutter: + :path: Flutter + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + photo_manager: + :path: ".symlinks/plugins/photo_manager/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + +SPEC CHECKSUMS: + device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 + photo_manager: 84fa94fbeb82e607333ea9a13c43b58e0903a463 + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + +PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c + +COCOAPODS: 1.10.1 diff --git a/mobile/ios/Runner.xcodeproj/project.pbxproj b/mobile/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..0309944ddd --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,551 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + D218389C4A4C4693F141F7D1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 886774DBDDE6B35BF2B4F2CD /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2E3441B73560D0F6FD25E04F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 886774DBDDE6B35BF2B4F2CD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E0E99CDC17B3EB7FA8BA2332 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F7101BB0391A314774615E89 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D218389C4A4C4693F141F7D1 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0FB772A5B9601143383626CA /* Pods */ = { + isa = PBXGroup; + children = ( + 2E3441B73560D0F6FD25E04F /* Pods-Runner.debug.xcconfig */, + E0E99CDC17B3EB7FA8BA2332 /* Pods-Runner.release.xcconfig */, + F7101BB0391A314774615E89 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 1754452DD81DA6620E279E51 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 886774DBDDE6B35BF2B4F2CD /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 0FB772A5B9601143383626CA /* Pods */, + 1754452DD81DA6620E279E51 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 4044AF030EF7D8721844FFBA /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 4044AF030EF7D8721844FFBA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + D218A34AEE62BC1EF119F5B0 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = C24486LLLU; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.immichMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = C24486LLLU; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.immichMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = C24486LLLU; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.immichMobile; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000000..c87d15a335 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata b/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..21a3cc14c7 --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..f9b0d7c5ea --- /dev/null +++ b/mobile/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/mobile/ios/Runner/AppDelegate.swift b/mobile/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000000..70693e4a8c --- /dev/null +++ b/mobile/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..d36b1fab2d --- /dev/null +++ b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/mobile/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000000..89c2725b70 --- /dev/null +++ b/mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard b/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..f2e259c7c9 --- /dev/null +++ b/mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner/Base.lproj/Main.storyboard b/mobile/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..f3c28516fb --- /dev/null +++ b/mobile/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mobile/ios/Runner/Info.plist b/mobile/ios/Runner/Info.plist new file mode 100644 index 0000000000..db89cddaa1 --- /dev/null +++ b/mobile/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Immich Mobile + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + immich_mobile + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSPhotoLibraryUsageDescription + App need your agree, can visit your album + + \ No newline at end of file diff --git a/mobile/ios/Runner/Runner-Bridging-Header.h b/mobile/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000000..308a2a560b --- /dev/null +++ b/mobile/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/mobile/lib/constants/hive_box.dart b/mobile/lib/constants/hive_box.dart new file mode 100644 index 0000000000..61b6fb93ae --- /dev/null +++ b/mobile/lib/constants/hive_box.dart @@ -0,0 +1,11 @@ +// Access token +const String userInfoBox = "immichBoxUserInfo"; // Box +const String accessTokenKey = "immichBoxAccessTokenKey"; // Key 1 +const String deviceIdKey = 'immichBoxDeviceIdKey'; // Key 2 + +// SERVER ENDPOINT +const String serverEndpointKey = 'immichBoxServerEndpoint'; + +// KEY +const String hiveAllAsssetKey = "allAssets"; +const String hiveBackupProgressKey = "backupProgressAssets"; diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart new file mode 100644 index 0000000000..753dba5dbe --- /dev/null +++ b/mobile/lib/main.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/shared/providers/app_state.provider.dart'; +import 'constants/hive_box.dart'; +import 'package:google_fonts/google_fonts.dart'; + +void main() async { + await Hive.initFlutter(); + await Hive.openBox(userInfoBox); + // Hive.registerAdapter(ImmichBackUpAssetAdapter()); + // Hive.deleteBoxFromDisk(hiveImmichBox); + + runApp(const ProviderScope(child: ImmichApp())); +} + +class ImmichApp extends ConsumerStatefulWidget { + const ImmichApp({Key? key}) : super(key: key); + + @override + _ImmichAppState createState() => _ImmichAppState(); +} + +class _ImmichAppState extends ConsumerState with WidgetsBindingObserver { + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + debugPrint("[APP STATE] resumed"); + ref.read(appStateProvider.notifier).state = AppStateEnum.resumed; + break; + case AppLifecycleState.inactive: + debugPrint("[APP STATE] inactive"); + ref.read(appStateProvider.notifier).state = AppStateEnum.inactive; + break; + case AppLifecycleState.paused: + debugPrint("[APP STATE] paused"); + ref.read(appStateProvider.notifier).state = AppStateEnum.paused; + break; + case AppLifecycleState.detached: + debugPrint("[APP STATE] detached"); + ref.read(appStateProvider.notifier).state = AppStateEnum.detached; + break; + } + } + + Future initApp() async { + // ! TOBE DELETE + // Simulate Sign In And Register/Get Device ID + // await ref.read(authenticationProvider.notifier).login(); + // ref.read(backupProvider.notifier).getBackupInfo(); + // WidgetsBinding.instance?.addObserver(this); + } + + @override + initState() { + super.initState(); + initApp().then((_) => debugPrint("App Init Completed")); + } + + @override + void dispose() { + WidgetsBinding.instance?.removeObserver(this); + super.dispose(); + } + + final _immichRouter = AppRouter(); + + @override + Widget build(BuildContext context) { + return MaterialApp.router( + title: 'Immich', + debugShowCheckedModeBanner: false, + theme: ThemeData( + primarySwatch: Colors.indigo, + textTheme: GoogleFonts.workSansTextTheme( + Theme.of(context).textTheme.apply(fontSizeFactor: 1.0), + ), + scaffoldBackgroundColor: const Color(0xFFf6f8fe), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.white, + foregroundColor: Colors.indigo, + elevation: 1, + centerTitle: true, + ), + ), + routeInformationParser: _immichRouter.defaultRouteParser(), + routerDelegate: _immichRouter.delegate(), + ); + } +} diff --git a/mobile/lib/module_template/models/store_model_here.txt b/mobile/lib/module_template/models/store_model_here.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/module_template/providers/store_providers_here.txt b/mobile/lib/module_template/providers/store_providers_here.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/module_template/services/store_services_here.txt b/mobile/lib/module_template/services/store_services_here.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/module_template/ui/store_ui_here.txt b/mobile/lib/module_template/ui/store_ui_here.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/module_template/views/store_views_here.txt b/mobile/lib/module_template/views/store_views_here.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mobile/lib/modules/home/models/get_all_asset_respose.model.dart b/mobile/lib/modules/home/models/get_all_asset_respose.model.dart new file mode 100644 index 0000000000..8338405ca7 --- /dev/null +++ b/mobile/lib/modules/home/models/get_all_asset_respose.model.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +import 'package:flutter/foundation.dart'; +import 'package:immich_mobile/shared/models/immich_asset.model.dart'; + +class ImmichAssetGroupByDate { + final String date; + List assets; + ImmichAssetGroupByDate({ + required this.date, + required this.assets, + }); + + ImmichAssetGroupByDate copyWith({ + String? date, + List? assets, + }) { + return ImmichAssetGroupByDate( + date: date ?? this.date, + assets: assets ?? this.assets, + ); + } + + Map toMap() { + return { + 'date': date, + 'assets': assets.map((x) => x.toMap()).toList(), + }; + } + + factory ImmichAssetGroupByDate.fromMap(Map map) { + return ImmichAssetGroupByDate( + date: map['date'] ?? '', + assets: List.from(map['assets']?.map((x) => ImmichAsset.fromMap(x))), + ); + } + + String toJson() => json.encode(toMap()); + + factory ImmichAssetGroupByDate.fromJson(String source) => ImmichAssetGroupByDate.fromMap(json.decode(source)); + + @override + String toString() => 'ImmichAssetGroupByDate(date: $date, assets: $assets)'; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ImmichAssetGroupByDate && other.date == date && listEquals(other.assets, assets); + } + + @override + int get hashCode => date.hashCode ^ assets.hashCode; +} + +class GetAllAssetResponse { + final int count; + final List data; + final String nextPageKey; + GetAllAssetResponse({ + required this.count, + required this.data, + required this.nextPageKey, + }); + + GetAllAssetResponse copyWith({ + int? count, + List? data, + String? nextPageKey, + }) { + return GetAllAssetResponse( + count: count ?? this.count, + data: data ?? this.data, + nextPageKey: nextPageKey ?? this.nextPageKey, + ); + } + + Map toMap() { + return { + 'count': count, + 'data': data.map((x) => x.toMap()).toList(), + 'nextPageKey': nextPageKey, + }; + } + + factory GetAllAssetResponse.fromMap(Map map) { + return GetAllAssetResponse( + count: map['count']?.toInt() ?? 0, + data: List.from(map['data']?.map((x) => ImmichAssetGroupByDate.fromMap(x))), + nextPageKey: map['nextPageKey'] ?? '', + ); + } + + String toJson() => json.encode(toMap()); + + factory GetAllAssetResponse.fromJson(String source) => GetAllAssetResponse.fromMap(json.decode(source)); + + @override + String toString() => 'GetAllAssetResponse(count: $count, data: $data, nextPageKey: $nextPageKey)'; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is GetAllAssetResponse && + other.count == count && + listEquals(other.data, data) && + other.nextPageKey == nextPageKey; + } + + @override + int get hashCode => count.hashCode ^ data.hashCode ^ nextPageKey.hashCode; +} diff --git a/mobile/lib/modules/home/providers/asset.provider.dart b/mobile/lib/modules/home/providers/asset.provider.dart new file mode 100644 index 0000000000..6eca6f1326 --- /dev/null +++ b/mobile/lib/modules/home/providers/asset.provider.dart @@ -0,0 +1,60 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/home/models/get_all_asset_respose.model.dart'; +import 'package:immich_mobile/modules/home/services/asset.service.dart'; + +class AssetNotifier extends StateNotifier> { + final imagePerPage = 100; + final AssetService _assetService = AssetService(); + + AssetNotifier() : super([]); + late String? nextPageKey = ""; + bool isFetching = false; + + getImmichAssets() async { + GetAllAssetResponse? res = await _assetService.getAllAsset(); + nextPageKey = res?.nextPageKey; + + if (res != null) { + for (var assets in res.data) { + state = [...state, assets]; + } + } + } + + getMoreAsset() async { + if (nextPageKey != null && !isFetching) { + isFetching = true; + GetAllAssetResponse? res = await _assetService.getMoreAsset(nextPageKey); + + if (res != null) { + nextPageKey = res.nextPageKey; + + List previousState = state; + List currentState = []; + + for (var assets in res.data) { + currentState = [...currentState, assets]; + } + + if (previousState.last.date == currentState.first.date) { + previousState.last.assets = [...previousState.last.assets, ...currentState.first.assets]; + state = [...previousState, ...currentState.sublist(1)]; + } else { + state = [...previousState, ...currentState]; + } + } + + isFetching = false; + } + } + + clearAllAsset() { + state = []; + } +} + +final currentLocalPageProvider = StateProvider((ref) => 0); + +final assetProvider = StateNotifierProvider>((ref) { + return AssetNotifier(); +}); diff --git a/mobile/lib/modules/home/services/asset.service.dart b/mobile/lib/modules/home/services/asset.service.dart new file mode 100644 index 0000000000..63a99b4028 --- /dev/null +++ b/mobile/lib/modules/home/services/asset.service.dart @@ -0,0 +1,38 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:immich_mobile/modules/home/models/get_all_asset_respose.model.dart'; +import 'package:immich_mobile/shared/services/network.service.dart'; + +class AssetService { + final NetworkService _networkService = NetworkService(); + + Future getAllAsset() async { + var res = await _networkService.getRequest(url: "asset/all"); + try { + Map decodedData = jsonDecode(res.toString()); + + GetAllAssetResponse result = GetAllAssetResponse.fromMap(decodedData); + return result; + } catch (e) { + debugPrint("Error getAllAsset ${e.toString()}"); + } + } + + Future getMoreAsset(String? nextPageKey) async { + try { + var res = await _networkService.getRequest( + url: "asset/all?nextPageKey=$nextPageKey", + ); + + Map decodedData = jsonDecode(res.toString()); + + GetAllAssetResponse result = GetAllAssetResponse.fromMap(decodedData); + if (result.count != 0) { + return result; + } + } catch (e) { + debugPrint("Error getAllAsset ${e.toString()}"); + } + } +} diff --git a/mobile/lib/modules/home/ui/image_grid.dart b/mobile/lib/modules/home/ui/image_grid.dart new file mode 100644 index 0000000000..e5e0411e6e --- /dev/null +++ b/mobile/lib/modules/home/ui/image_grid.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:immich_mobile/modules/home/ui/thumbnail_image.dart'; +import 'package:immich_mobile/shared/models/immich_asset.model.dart'; + +class ImageGrid extends StatelessWidget { + final List assetGroup; + + const ImageGrid({Key? key, required this.assetGroup}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SliverGrid( + gridDelegate: + const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, crossAxisSpacing: 5.0, mainAxisSpacing: 5), + delegate: SliverChildBuilderDelegate( + (BuildContext context, int index) { + return GestureDetector( + onTap: () {}, + child: ThumbnailImage(asset: assetGroup[index]), + ); + }, + childCount: assetGroup.length, + ), + ); + } +} diff --git a/mobile/lib/modules/home/ui/immich_sliver_appbar.dart b/mobile/lib/modules/home/ui/immich_sliver_appbar.dart new file mode 100644 index 0000000000..ed54d1f931 --- /dev/null +++ b/mobile/lib/modules/home/ui/immich_sliver_appbar.dart @@ -0,0 +1,105 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/home/providers/asset.provider.dart'; + +import 'package:immich_mobile/routing/router.dart'; +import 'package:immich_mobile/shared/models/backup_state.model.dart'; +import 'package:immich_mobile/shared/providers/backup.provider.dart'; + +class ImmichSliverAppBar extends ConsumerWidget { + const ImmichSliverAppBar({ + Key? key, + required this.imageGridGroup, + }) : super(key: key); + + final List imageGridGroup; + + @override + Widget build(BuildContext context, WidgetRef ref) { + final BackUpState _backupState = ref.watch(backupProvider); + + return SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 5), + sliver: SliverAppBar( + centerTitle: true, + floating: true, + pinned: false, + snap: false, + backgroundColor: Colors.grey[200], + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(5))), + leading: Builder( + builder: (BuildContext context) { + return IconButton( + icon: const Icon(Icons.account_circle_rounded), + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip, + ); + }, + ), + title: Text( + 'IMMICH', + style: GoogleFonts.snowburstOne( + textStyle: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Theme.of(context).primaryColor, + ), + ), + ), + actions: [ + Stack( + alignment: AlignmentDirectional.center, + children: [ + _backupState.backupProgress == BackUpProgressEnum.inProgress + ? Positioned( + top: 10, + right: 12, + child: SizedBox( + height: 8, + width: 8, + child: CircularProgressIndicator( + strokeWidth: 1, + valueColor: AlwaysStoppedAnimation(Theme.of(context).primaryColor), + ), + ), + ) + : Container(), + IconButton( + icon: const Icon(Icons.backup_rounded), + tooltip: 'Backup Controller', + onPressed: () async { + var onPop = await AutoRouter.of(context).push(const BackupControllerRoute()); + + // Fetch new image + if (onPop == true) { + // Remove and force getting new widget again + if (imageGridGroup.isNotEmpty) { + ref.read(assetProvider.notifier).getMoreAsset(); + } else { + ref.read(assetProvider.notifier).getImmichAssets(); + } + } + }, + ), + _backupState.backupProgress == BackUpProgressEnum.inProgress + ? Positioned( + bottom: 5, + child: Text( + _backupState.backingUpAssetCount.toString(), + style: const TextStyle(fontSize: 9, fontWeight: FontWeight.bold), + ), + ) + : Container() + ], + ), + ], + systemOverlayStyle: SystemUiOverlayStyle.dark, + ), + ); + } +} diff --git a/mobile/lib/modules/home/ui/profile_drawer.dart b/mobile/lib/modules/home/ui/profile_drawer.dart new file mode 100644 index 0000000000..03b96d2d7f --- /dev/null +++ b/mobile/lib/modules/home/ui/profile_drawer.dart @@ -0,0 +1,72 @@ +import 'package:auto_route/annotations.dart'; +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/home/providers/asset.provider.dart'; +import 'package:immich_mobile/modules/login/models/authentication_state.model.dart'; +import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; +import 'package:immich_mobile/routing/router.dart'; + +class ProfileDrawer extends ConsumerWidget { + const ProfileDrawer({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + AuthenticationState _authState = ref.watch(authenticationProvider); + + return Drawer( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topRight: Radius.circular(5), + bottomRight: Radius.circular(5), + ), + ), + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + decoration: BoxDecoration( + color: Colors.grey[200], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Image( + image: AssetImage('assets/immich-logo-no-outline.png'), + width: 50, + filterQuality: FilterQuality.high, + ), + const Padding(padding: EdgeInsets.all(8)), + Text( + _authState.userEmail, + style: TextStyle(color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold), + ) + ], + ), + ), + ListTile( + tileColor: Colors.grey[100], + leading: const Icon( + Icons.logout_rounded, + color: Colors.black54, + ), + title: const Text( + "Sign Out", + style: TextStyle(color: Colors.black54, fontSize: 14), + ), + onTap: () async { + bool res = await ref.read(authenticationProvider.notifier).logout(); + ref.read(assetProvider.notifier).clearAllAsset(); + + if (res) { + AutoRouter.of(context).popUntilRoot(); + } + }, + ) + ], + ), + ); + } +} diff --git a/mobile/lib/modules/home/ui/thumbnail_image.dart b/mobile/lib/modules/home/ui/thumbnail_image.dart new file mode 100644 index 0000000000..257ad20ffc --- /dev/null +++ b/mobile/lib/modules/home/ui/thumbnail_image.dart @@ -0,0 +1,52 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; +import 'package:immich_mobile/shared/models/immich_asset.model.dart'; +import 'package:immich_mobile/routing/router.dart'; +import 'package:transparent_image/transparent_image.dart'; + +class ThumbnailImage extends StatelessWidget { + final ImmichAsset asset; + + const ThumbnailImage({Key? key, required this.asset}) : super(key: key); + + @override + Widget build(BuildContext context) { + var box = Hive.box(userInfoBox); + var thumbnailRequestUrl = + '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}&isThumb=true'; + + return GestureDetector( + onTap: () { + AutoRouter.of(context).push( + ImageViewerRoute( + imageUrl: + '${box.get(serverEndpointKey)}/asset/file?aid=${asset.deviceAssetId}&did=${asset.deviceId}&isThumb=false', + heroTag: asset.id, + thumbnailUrl: thumbnailRequestUrl, + ), + ); + }, + onLongPress: () {}, + child: Hero( + tag: asset.id, + child: CachedNetworkImage( + width: 300, + height: 300, + memCacheHeight: 250, + fit: BoxFit.cover, + imageUrl: thumbnailRequestUrl, + httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"}, + fadeInDuration: const Duration(milliseconds: 250), + progressIndicatorBuilder: (context, url, downloadProgress) => Transform.scale( + scale: 0.2, + child: CircularProgressIndicator(value: downloadProgress.progress), + ), + errorWidget: (context, url, error) => const Icon(Icons.error), + ), + ), + ); + } +} diff --git a/mobile/lib/modules/home/views/home_page.dart b/mobile/lib/modules/home/views/home_page.dart new file mode 100644 index 0000000000..ad4142891a --- /dev/null +++ b/mobile/lib/modules/home/views/home_page.dart @@ -0,0 +1,165 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/home/ui/immich_sliver_appbar.dart'; +import 'package:immich_mobile/modules/home/ui/profile_drawer.dart'; +import 'package:immich_mobile/shared/models/backup_state.model.dart'; +import 'package:immich_mobile/modules/home/models/get_all_asset_respose.model.dart'; +import 'package:immich_mobile/modules/home/ui/image_grid.dart'; +import 'package:immich_mobile/modules/home/providers/asset.provider.dart'; +import 'package:immich_mobile/shared/providers/backup.provider.dart'; +import 'package:intl/intl.dart'; + +class HomePage extends HookConsumerWidget { + const HomePage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final ValueNotifier _showBackToTopBtn = useState(false); + ScrollController _scrollController = useScrollController(); + List assetGroup = ref.watch(assetProvider); + BackUpState _backupState = ref.watch(backupProvider); + List imageGridGroup = []; + List monthGroupKey = []; + + _scrollControllerCallback() { + var endOfPage = _scrollController.position.maxScrollExtent; + + if (_scrollController.offset >= endOfPage - (endOfPage * 0.1) && !_scrollController.position.outOfRange) { + ref.read(assetProvider.notifier).getMoreAsset(); + } + + if (_scrollController.offset >= 400) { + _showBackToTopBtn.value = true; + } else { + _showBackToTopBtn.value = false; + } + } + + useEffect(() { + ref.read(assetProvider.notifier).getImmichAssets(); + + _scrollController.addListener(_scrollControllerCallback); + + return () => _scrollController.removeListener(_scrollControllerCallback); + }, [_scrollController, key]); + + Widget _buildBody() { + if (assetGroup.isNotEmpty) { + String lastGroupDate = assetGroup[0].date; + + for (var group in assetGroup) { + var dateTitle = group.date; + var assetGroup = group.assets; + + int? currentMonth = DateTime.tryParse(dateTitle)?.month; + int? previousMonth = DateTime.tryParse(lastGroupDate)?.month; + + if ((currentMonth! - previousMonth!) != 0) { + var myKey = GlobalKey(); + monthGroupKey.add(myKey); + // debugPrint("Group Key $myKey"); + + imageGridGroup.add( + SliverToBoxAdapter( + key: myKey, + child: Padding( + padding: const EdgeInsets.only(left: 10.0, top: 32), + child: Text( + DateFormat('MMMM, y').format( + DateTime.parse(dateTitle), + ), + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Theme.of(context).primaryColor, + ), + ), + ), + ), + ); + } + + imageGridGroup.add( + _buildDateGroupTitle(dateTitle), + ); + + imageGridGroup.add(ImageGrid(assetGroup: assetGroup)); + + lastGroupDate = dateTitle; + } + + return SafeArea( + child: CustomScrollView( + controller: _scrollController, + slivers: [ + ImmichSliverAppBar(imageGridGroup: imageGridGroup), + ...imageGridGroup, + ], + ), + ); + } else { + return Container(); + } + } + + return Scaffold( + drawer: const ProfileDrawer(), + body: _buildBody(), + bottomNavigationBar: BottomAppBar( + child: IconButton( + onPressed: () { + if (monthGroupKey.isNotEmpty) { + var targetContext = monthGroupKey.last.currentContext; + if (targetContext != null) { + Scrollable.ensureVisible( + targetContext, + duration: const Duration(milliseconds: 400), + curve: Curves.easeInOut, + ); + } + } + }, + icon: const Icon(Icons.ac_unit_outlined), + ), + ), + floatingActionButton: _showBackToTopBtn.value + ? FloatingActionButton.small( + enableFeedback: true, + backgroundColor: Theme.of(context).secondaryHeaderColor, + foregroundColor: Theme.of(context).primaryColor, + onPressed: () { + _scrollController.animateTo(0, duration: const Duration(seconds: 1), curve: Curves.easeOutExpo); + }, + child: const Icon(Icons.keyboard_arrow_up_rounded), + ) + : null, + ); + } + + SliverToBoxAdapter _buildDateGroupTitle(String dateTitle) { + var currentYear = DateTime.now().year; + var groupYear = DateTime.parse(dateTitle).year; + var formatDateTemplate = currentYear == groupYear ? 'E, MMM dd' : 'E, MMM dd, yyyy'; + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.only(top: 24.0, bottom: 24.0, left: 3.0), + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0, bottom: 5.0, top: 5.0), + child: Text( + DateFormat(formatDateTemplate).format(DateTime.parse(dateTitle)), + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/mobile/lib/modules/login/models/authentication_state.model.dart b/mobile/lib/modules/login/models/authentication_state.model.dart new file mode 100644 index 0000000000..bc0c868e22 --- /dev/null +++ b/mobile/lib/modules/login/models/authentication_state.model.dart @@ -0,0 +1,93 @@ +import 'dart:convert'; + +import 'package:immich_mobile/shared/models/device_info.model.dart'; + +class AuthenticationState { + final String deviceId; + final String deviceType; + final String userId; + final String userEmail; + final bool isAuthenticated; + final DeviceInfoRemote deviceInfo; + + AuthenticationState({ + required this.deviceId, + required this.deviceType, + required this.userId, + required this.userEmail, + required this.isAuthenticated, + required this.deviceInfo, + }); + + AuthenticationState copyWith({ + String? deviceId, + String? deviceType, + String? userId, + String? userEmail, + bool? isAuthenticated, + DeviceInfoRemote? deviceInfo, + }) { + return AuthenticationState( + deviceId: deviceId ?? this.deviceId, + deviceType: deviceType ?? this.deviceType, + userId: userId ?? this.userId, + userEmail: userEmail ?? this.userEmail, + isAuthenticated: isAuthenticated ?? this.isAuthenticated, + deviceInfo: deviceInfo ?? this.deviceInfo, + ); + } + + @override + String toString() { + return 'AuthenticationState(deviceId: $deviceId, deviceType: $deviceType, userId: $userId, userEmail: $userEmail, isAuthenticated: $isAuthenticated, deviceInfo: $deviceInfo)'; + } + + Map toMap() { + return { + 'deviceId': deviceId, + 'deviceType': deviceType, + 'userId': userId, + 'userEmail': userEmail, + 'isAuthenticated': isAuthenticated, + 'deviceInfo': deviceInfo.toMap(), + }; + } + + factory AuthenticationState.fromMap(Map map) { + return AuthenticationState( + deviceId: map['deviceId'] ?? '', + deviceType: map['deviceType'] ?? '', + userId: map['userId'] ?? '', + userEmail: map['userEmail'] ?? '', + isAuthenticated: map['isAuthenticated'] ?? false, + deviceInfo: DeviceInfoRemote.fromMap(map['deviceInfo']), + ); + } + + String toJson() => json.encode(toMap()); + + factory AuthenticationState.fromJson(String source) => AuthenticationState.fromMap(json.decode(source)); + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is AuthenticationState && + other.deviceId == deviceId && + other.deviceType == deviceType && + other.userId == userId && + other.userEmail == userEmail && + other.isAuthenticated == isAuthenticated && + other.deviceInfo == deviceInfo; + } + + @override + int get hashCode { + return deviceId.hashCode ^ + deviceType.hashCode ^ + userId.hashCode ^ + userEmail.hashCode ^ + isAuthenticated.hashCode ^ + deviceInfo.hashCode; + } +} diff --git a/mobile/lib/modules/login/models/login_response.model.dart b/mobile/lib/modules/login/models/login_response.model.dart new file mode 100644 index 0000000000..3c2032a842 --- /dev/null +++ b/mobile/lib/modules/login/models/login_response.model.dart @@ -0,0 +1,61 @@ +import 'dart:convert'; + +class LogInReponse { + final String accessToken; + final String userId; + final String userEmail; + + LogInReponse({ + required this.accessToken, + required this.userId, + required this.userEmail, + }); + + LogInReponse copyWith({ + String? accessToken, + String? userId, + String? userEmail, + }) { + return LogInReponse( + accessToken: accessToken ?? this.accessToken, + userId: userId ?? this.userId, + userEmail: userEmail ?? this.userEmail, + ); + } + + Map toMap() { + return { + 'accessToken': accessToken, + 'userId': userId, + 'userEmail': userEmail, + }; + } + + factory LogInReponse.fromMap(Map map) { + return LogInReponse( + accessToken: map['accessToken'] ?? '', + userId: map['userId'] ?? '', + userEmail: map['userEmail'] ?? '', + ); + } + + String toJson() => json.encode(toMap()); + + factory LogInReponse.fromJson(String source) => LogInReponse.fromMap(json.decode(source)); + + @override + String toString() => 'LogInReponse(accessToken: $accessToken, userId: $userId, userEmail: $userEmail)'; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is LogInReponse && + other.accessToken == accessToken && + other.userId == userId && + other.userEmail == userEmail; + } + + @override + int get hashCode => accessToken.hashCode ^ userId.hashCode ^ userEmail.hashCode; +} diff --git a/mobile/lib/modules/login/providers/authentication.provider.dart b/mobile/lib/modules/login/providers/authentication.provider.dart new file mode 100644 index 0000000000..90699f1d39 --- /dev/null +++ b/mobile/lib/modules/login/providers/authentication.provider.dart @@ -0,0 +1,127 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; +import 'package:immich_mobile/modules/login/models/authentication_state.model.dart'; +import 'package:immich_mobile/modules/login/models/login_response.model.dart'; +import 'package:immich_mobile/shared/services/backup.service.dart'; +import 'package:immich_mobile/shared/services/device_info.service.dart'; +import 'package:immich_mobile/shared/services/network.service.dart'; +import 'package:immich_mobile/shared/models/device_info.model.dart'; +import 'package:immich_mobile/utils/dio_http_interceptor.dart'; + +class AuthenticationNotifier extends StateNotifier { + AuthenticationNotifier() + : super( + AuthenticationState( + deviceId: "", + deviceType: "", + isAuthenticated: false, + userId: "", + userEmail: "", + deviceInfo: DeviceInfoRemote( + id: 0, + userId: "", + deviceId: "", + deviceType: "", + notificationToken: "", + createdAt: "", + isAutoBackup: false, + ), + ), + ); + + final DeviceInfoService _deviceInfoService = DeviceInfoService(); + final BackupService _backupService = BackupService(); + final NetworkService _networkService = NetworkService(); + + Future login(String email, String password, String serverEndpoint) async { + // Store server endpoint to Hive and test endpoint + if (serverEndpoint[serverEndpoint.length - 1] == "/") { + var validUrl = serverEndpoint.substring(0, serverEndpoint.length - 1); + Hive.box(userInfoBox).put(serverEndpointKey, validUrl); + } else { + Hive.box(userInfoBox).put(serverEndpointKey, serverEndpoint); + } + + bool isServerEndpointVerified = await _networkService.pingServer(); + if (!isServerEndpointVerified) { + return false; + } + + // Store device id to local storage + var deviceInfo = await _deviceInfoService.getDeviceInfo(); + Hive.box(userInfoBox).put(deviceIdKey, deviceInfo["deviceId"]); + + state = state.copyWith( + deviceId: deviceInfo["deviceId"], + deviceType: deviceInfo["deviceType"], + ); + + // Make sign-in request + try { + Response res = await _networkService.postRequest(url: 'auth/login', data: {'email': email, 'password': password}); + + var payload = LogInReponse.fromJson(res.toString()); + + Hive.box(userInfoBox).put(accessTokenKey, payload.accessToken); + + state = state.copyWith( + isAuthenticated: true, + userId: payload.userId, + userEmail: payload.userEmail, + ); + } catch (e) { + return false; + } + + // Register device info + try { + Response res = await _networkService + .postRequest(url: 'device-info', data: {'deviceId': state.deviceId, 'deviceType': state.deviceType}); + + DeviceInfoRemote deviceInfo = DeviceInfoRemote.fromJson(res.toString()); + state = state.copyWith(deviceInfo: deviceInfo); + } catch (e) { + debugPrint("ERROR Register Device Info: $e"); + } + + return true; + } + + Future logout() async { + Hive.box(userInfoBox).delete(accessTokenKey); + state = AuthenticationState( + deviceId: "", + deviceType: "", + isAuthenticated: false, + userId: "", + userEmail: "", + deviceInfo: DeviceInfoRemote( + id: 0, + userId: "", + deviceId: "", + deviceType: "", + notificationToken: "", + createdAt: "", + isAutoBackup: false, + ), + ); + + return true; + } + + setAutoBackup(bool backupState) async { + var deviceInfo = await _deviceInfoService.getDeviceInfo(); + var deviceId = deviceInfo["deviceId"]; + var deviceType = deviceInfo["deviceType"]; + + DeviceInfoRemote deviceInfoRemote = await _backupService.setAutoBackup(backupState, deviceId, deviceType); + state = state.copyWith(deviceInfo: deviceInfoRemote); + } +} + +final authenticationProvider = StateNotifierProvider((ref) { + return AuthenticationNotifier(); +}); diff --git a/mobile/lib/modules/login/ui/login_form.dart b/mobile/lib/modules/login/ui/login_form.dart new file mode 100644 index 0000000000..058f6bd63a --- /dev/null +++ b/mobile/lib/modules/login/ui/login_form.dart @@ -0,0 +1,124 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; + +class LoginForm extends HookConsumerWidget { + const LoginForm({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final usernameController = useTextEditingController(text: 'testuser@email.com'); + final passwordController = useTextEditingController(text: 'password'); + final serverEndpointController = useTextEditingController(text: 'http://192.168.1.216'); + + return Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 300), + child: Wrap( + spacing: 32, + runSpacing: 32, + alignment: WrapAlignment.center, + children: [ + const Image( + image: AssetImage('assets/immich-logo-no-outline.png'), + width: 128, + filterQuality: FilterQuality.high, + ), + Text( + 'IMMICH', + style: GoogleFonts.snowburstOne( + textStyle: + TextStyle(fontWeight: FontWeight.bold, fontSize: 48, color: Theme.of(context).primaryColor)), + ), + EmailInput(controller: usernameController), + PasswordInput(controller: passwordController), + ServerEndpointInput(controller: serverEndpointController), + LoginButton( + emailController: usernameController, + passwordController: passwordController, + serverEndpointController: serverEndpointController, + ), + ], + ), + ), + ); + } +} + +class ServerEndpointInput extends StatelessWidget { + final TextEditingController controller; + + const ServerEndpointInput({Key? key, required this.controller}) : super(key: key); + + @override + Widget build(BuildContext context) { + return TextFormField( + controller: controller, + decoration: const InputDecoration( + labelText: 'Server Endpoint URL', border: OutlineInputBorder(), hintText: 'http://your-server-ip:port'), + ); + } +} + +class EmailInput extends StatelessWidget { + final TextEditingController controller; + + const EmailInput({Key? key, required this.controller}) : super(key: key); + + @override + Widget build(BuildContext context) { + return TextFormField( + controller: controller, + decoration: + const InputDecoration(labelText: 'email', border: OutlineInputBorder(), hintText: 'youremail@email.com'), + ); + } +} + +class PasswordInput extends StatelessWidget { + final TextEditingController controller; + + const PasswordInput({Key? key, required this.controller}) : super(key: key); + + @override + Widget build(BuildContext context) { + return TextFormField( + obscureText: true, + controller: controller, + decoration: const InputDecoration(labelText: 'Password', border: OutlineInputBorder(), hintText: 'password'), + ); + } +} + +class LoginButton extends ConsumerWidget { + final TextEditingController emailController; + final TextEditingController passwordController; + final TextEditingController serverEndpointController; + + const LoginButton( + {Key? key, + required this.emailController, + required this.passwordController, + required this.serverEndpointController}) + : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return ElevatedButton( + onPressed: () async { + var isAuthenicated = await ref + .read(authenticationProvider.notifier) + .login(emailController.text, passwordController.text, serverEndpointController.text); + + if (isAuthenicated) { + AutoRouter.of(context).pushNamed("/home-page"); + } else { + debugPrint("BAD LOGIN TRY AGAIN - Show UI Here"); + } + }, + child: const Text("Login")); + } +} diff --git a/mobile/lib/modules/login/views/login_page.dart b/mobile/lib/modules/login/views/login_page.dart new file mode 100644 index 0000000000..c590b8d574 --- /dev/null +++ b/mobile/lib/modules/login/views/login_page.dart @@ -0,0 +1,16 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; +import 'package:immich_mobile/modules/login/ui/login_form.dart'; + +class LoginPage extends HookConsumerWidget { + const LoginPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return const Scaffold( + body: LoginForm(), + ); + } +} diff --git a/mobile/lib/routing/auth_guard.dart b/mobile/lib/routing/auth_guard.dart new file mode 100644 index 0000000000..c0aec9a996 --- /dev/null +++ b/mobile/lib/routing/auth_guard.dart @@ -0,0 +1,22 @@ +import 'dart:convert'; + +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:immich_mobile/shared/services/network.service.dart'; + +class AuthGuard extends AutoRouteGuard { + final NetworkService _networkService = NetworkService(); + + @override + void onNavigation(NavigationResolver resolver, StackRouter router) async { + try { + var res = await _networkService.postRequest(url: 'auth/validateToken'); + var jsonReponse = jsonDecode(res.toString()); + if (jsonReponse['authStatus']) { + resolver.next(true); + } + } catch (e) { + router.removeUntil((route) => route.name == "LoginRoute"); + } + } +} diff --git a/mobile/lib/routing/router.dart b/mobile/lib/routing/router.dart new file mode 100644 index 0000000000..797117d914 --- /dev/null +++ b/mobile/lib/routing/router.dart @@ -0,0 +1,22 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/widgets.dart'; +import 'package:immich_mobile/modules/login/views/login_page.dart'; +import 'package:immich_mobile/modules/home/views/home_page.dart'; +import 'package:immich_mobile/routing/auth_guard.dart'; +import 'package:immich_mobile/shared/views/backup_controller_page.dart'; +import 'package:immich_mobile/shared/views/image_viewer_page.dart'; + +part 'router.gr.dart'; + +@MaterialAutoRouter( + replaceInRouteName: 'Page,Route', + routes: [ + AutoRoute(page: LoginPage, initial: true), + AutoRoute(page: HomePage, guards: [AuthGuard]), + AutoRoute(page: BackupControllerPage, guards: [AuthGuard]), + AutoRoute(page: ImageViewerPage, guards: [AuthGuard]), + ], +) +class AppRouter extends _$AppRouter { + AppRouter() : super(authGuard: AuthGuard()); +} diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart new file mode 100644 index 0000000000..cc76a25b74 --- /dev/null +++ b/mobile/lib/routing/router.gr.dart @@ -0,0 +1,122 @@ +// ************************************************************************** +// AutoRouteGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND + +// ************************************************************************** +// AutoRouteGenerator +// ************************************************************************** +// +// ignore_for_file: type=lint + +part of 'router.dart'; + +class _$AppRouter extends RootStackRouter { + _$AppRouter( + {GlobalKey? navigatorKey, required this.authGuard}) + : super(navigatorKey); + + final AuthGuard authGuard; + + @override + final Map pagesMap = { + LoginRoute.name: (routeData) { + return MaterialPageX( + routeData: routeData, child: const LoginPage()); + }, + HomeRoute.name: (routeData) { + return MaterialPageX( + routeData: routeData, child: const HomePage()); + }, + BackupControllerRoute.name: (routeData) { + return MaterialPageX( + routeData: routeData, child: const BackupControllerPage()); + }, + ImageViewerRoute.name: (routeData) { + final args = routeData.argsAs(); + return MaterialPageX( + routeData: routeData, + child: ImageViewerPage( + key: args.key, + imageUrl: args.imageUrl, + heroTag: args.heroTag, + thumbnailUrl: args.thumbnailUrl)); + } + }; + + @override + List get routes => [ + RouteConfig(LoginRoute.name, path: '/'), + RouteConfig(HomeRoute.name, path: '/home-page', guards: [authGuard]), + RouteConfig(BackupControllerRoute.name, + path: '/backup-controller-page', guards: [authGuard]), + RouteConfig(ImageViewerRoute.name, + path: '/image-viewer-page', guards: [authGuard]) + ]; +} + +/// generated route for +/// [LoginPage] +class LoginRoute extends PageRouteInfo { + const LoginRoute() : super(LoginRoute.name, path: '/'); + + static const String name = 'LoginRoute'; +} + +/// generated route for +/// [HomePage] +class HomeRoute extends PageRouteInfo { + const HomeRoute() : super(HomeRoute.name, path: '/home-page'); + + static const String name = 'HomeRoute'; +} + +/// generated route for +/// [BackupControllerPage] +class BackupControllerRoute extends PageRouteInfo { + const BackupControllerRoute() + : super(BackupControllerRoute.name, path: '/backup-controller-page'); + + static const String name = 'BackupControllerRoute'; +} + +/// generated route for +/// [ImageViewerPage] +class ImageViewerRoute extends PageRouteInfo { + ImageViewerRoute( + {Key? key, + required String imageUrl, + required String heroTag, + required String thumbnailUrl}) + : super(ImageViewerRoute.name, + path: '/image-viewer-page', + args: ImageViewerRouteArgs( + key: key, + imageUrl: imageUrl, + heroTag: heroTag, + thumbnailUrl: thumbnailUrl)); + + static const String name = 'ImageViewerRoute'; +} + +class ImageViewerRouteArgs { + const ImageViewerRouteArgs( + {this.key, + required this.imageUrl, + required this.heroTag, + required this.thumbnailUrl}); + + final Key? key; + + final String imageUrl; + + final String heroTag; + + final String thumbnailUrl; + + @override + String toString() { + return 'ImageViewerRouteArgs{key: $key, imageUrl: $imageUrl, heroTag: $heroTag, thumbnailUrl: $thumbnailUrl}'; + } +} diff --git a/mobile/lib/shared/models/backup_state.model.dart b/mobile/lib/shared/models/backup_state.model.dart new file mode 100644 index 0000000000..db78327376 --- /dev/null +++ b/mobile/lib/shared/models/backup_state.model.dart @@ -0,0 +1,77 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; + +import 'package:immich_mobile/shared/models/server_info.model.dart'; + +enum BackUpProgressEnum { idle, inProgress, done } + +class BackUpState { + final BackUpProgressEnum backupProgress; + final int totalAssetCount; + final int assetOnDatabase; + final int backingUpAssetCount; + final double progressInPercentage; + final CancelToken cancelToken; + final ServerInfo serverInfo; + + BackUpState({ + required this.backupProgress, + required this.totalAssetCount, + required this.assetOnDatabase, + required this.backingUpAssetCount, + required this.progressInPercentage, + required this.cancelToken, + required this.serverInfo, + }); + + BackUpState copyWith({ + BackUpProgressEnum? backupProgress, + int? totalAssetCount, + int? assetOnDatabase, + int? backingUpAssetCount, + double? progressInPercentage, + CancelToken? cancelToken, + ServerInfo? serverInfo, + }) { + return BackUpState( + backupProgress: backupProgress ?? this.backupProgress, + totalAssetCount: totalAssetCount ?? this.totalAssetCount, + assetOnDatabase: assetOnDatabase ?? this.assetOnDatabase, + backingUpAssetCount: backingUpAssetCount ?? this.backingUpAssetCount, + progressInPercentage: progressInPercentage ?? this.progressInPercentage, + cancelToken: cancelToken ?? this.cancelToken, + serverInfo: serverInfo ?? this.serverInfo, + ); + } + + @override + String toString() { + return 'BackUpState(backupProgress: $backupProgress, totalAssetCount: $totalAssetCount, assetOnDatabase: $assetOnDatabase, backingUpAssetCount: $backingUpAssetCount, progressInPercentage: $progressInPercentage, cancelToken: $cancelToken, serverInfo: $serverInfo)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is BackUpState && + other.backupProgress == backupProgress && + other.totalAssetCount == totalAssetCount && + other.assetOnDatabase == assetOnDatabase && + other.backingUpAssetCount == backingUpAssetCount && + other.progressInPercentage == progressInPercentage && + other.cancelToken == cancelToken && + other.serverInfo == serverInfo; + } + + @override + int get hashCode { + return backupProgress.hashCode ^ + totalAssetCount.hashCode ^ + assetOnDatabase.hashCode ^ + backingUpAssetCount.hashCode ^ + progressInPercentage.hashCode ^ + cancelToken.hashCode ^ + serverInfo.hashCode; + } +} diff --git a/mobile/lib/shared/models/device_info.model.dart b/mobile/lib/shared/models/device_info.model.dart new file mode 100644 index 0000000000..359bf6e65a --- /dev/null +++ b/mobile/lib/shared/models/device_info.model.dart @@ -0,0 +1,100 @@ +import 'dart:convert'; +import 'dart:ffi'; + +class DeviceInfoRemote { + final int id; + final String userId; + final String deviceId; + final String deviceType; + final String notificationToken; + final String createdAt; + final bool isAutoBackup; + + DeviceInfoRemote({ + required this.id, + required this.userId, + required this.deviceId, + required this.deviceType, + required this.notificationToken, + required this.createdAt, + required this.isAutoBackup, + }); + + DeviceInfoRemote copyWith({ + int? id, + String? userId, + String? deviceId, + String? deviceType, + String? notificationToken, + String? createdAt, + bool? isAutoBackup, + }) { + return DeviceInfoRemote( + id: id ?? this.id, + userId: userId ?? this.userId, + deviceId: deviceId ?? this.deviceId, + deviceType: deviceType ?? this.deviceType, + notificationToken: notificationToken ?? this.notificationToken, + createdAt: createdAt ?? this.createdAt, + isAutoBackup: isAutoBackup ?? this.isAutoBackup, + ); + } + + Map toMap() { + return { + 'id': id, + 'userId': userId, + 'deviceId': deviceId, + 'deviceType': deviceType, + 'notificationToken': notificationToken, + 'createdAt': createdAt, + 'isAutoBackup': isAutoBackup, + }; + } + + factory DeviceInfoRemote.fromMap(Map map) { + return DeviceInfoRemote( + id: map['id']?.toInt() ?? 0, + userId: map['userId'] ?? '', + deviceId: map['deviceId'] ?? '', + deviceType: map['deviceType'] ?? '', + notificationToken: map['notificationToken'] ?? '', + createdAt: map['createdAt'] ?? '', + isAutoBackup: map['isAutoBackup'] ?? false, + ); + } + + String toJson() => json.encode(toMap()); + + factory DeviceInfoRemote.fromJson(String source) => DeviceInfoRemote.fromMap(json.decode(source)); + + @override + String toString() { + return 'DeviceInfo(id: $id, userId: $userId, deviceId: $deviceId, deviceType: $deviceType, notificationToken: $notificationToken, createdAt: $createdAt, isAutoBackup: $isAutoBackup)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is DeviceInfoRemote && + other.id == id && + other.userId == userId && + other.deviceId == deviceId && + other.deviceType == deviceType && + other.notificationToken == notificationToken && + other.createdAt == createdAt && + other.isAutoBackup == isAutoBackup; + } + + @override + int get hashCode { + return id.hashCode ^ + userId.hashCode ^ + deviceId.hashCode ^ + deviceType.hashCode ^ + notificationToken.hashCode ^ + createdAt.hashCode ^ + isAutoBackup.hashCode; + } +} diff --git a/mobile/lib/shared/models/image_viewer_page_data.model.dart b/mobile/lib/shared/models/image_viewer_page_data.model.dart new file mode 100644 index 0000000000..8d101b5e8f --- /dev/null +++ b/mobile/lib/shared/models/image_viewer_page_data.model.dart @@ -0,0 +1,11 @@ +class ImageViewerPageData { + final String heroTag; + final String imageUrl; + final String thumbnailUrl; + + ImageViewerPageData({ + required this.heroTag, + required this.imageUrl, + required this.thumbnailUrl, + }); +} diff --git a/mobile/lib/shared/models/immich_asset.model.dart b/mobile/lib/shared/models/immich_asset.model.dart new file mode 100644 index 0000000000..85c0f89a72 --- /dev/null +++ b/mobile/lib/shared/models/immich_asset.model.dart @@ -0,0 +1,131 @@ +import 'dart:convert'; + +class ImmichAsset { + final String id; + final String deviceAssetId; + final String userId; + final String deviceId; + final String assetType; + final String localPath; + final String remotePath; + final String createdAt; + final String modifiedAt; + final bool isFavorite; + final String? description; + + ImmichAsset({ + required this.id, + required this.deviceAssetId, + required this.userId, + required this.deviceId, + required this.assetType, + required this.localPath, + required this.remotePath, + required this.createdAt, + required this.modifiedAt, + required this.isFavorite, + this.description, + }); + + ImmichAsset copyWith({ + String? id, + String? deviceAssetId, + String? userId, + String? deviceId, + String? assetType, + String? localPath, + String? remotePath, + String? createdAt, + String? modifiedAt, + bool? isFavorite, + String? description, + }) { + return ImmichAsset( + id: id ?? this.id, + deviceAssetId: deviceAssetId ?? this.deviceAssetId, + userId: userId ?? this.userId, + deviceId: deviceId ?? this.deviceId, + assetType: assetType ?? this.assetType, + localPath: localPath ?? this.localPath, + remotePath: remotePath ?? this.remotePath, + createdAt: createdAt ?? this.createdAt, + modifiedAt: modifiedAt ?? this.modifiedAt, + isFavorite: isFavorite ?? this.isFavorite, + description: description ?? this.description, + ); + } + + Map toMap() { + return { + 'id': id, + 'deviceAssetId': deviceAssetId, + 'userId': userId, + 'deviceId': deviceId, + 'assetType': assetType, + 'localPath': localPath, + 'remotePath': remotePath, + 'createdAt': createdAt, + 'modifiedAt': modifiedAt, + 'isFavorite': isFavorite, + 'description': description, + }; + } + + factory ImmichAsset.fromMap(Map map) { + return ImmichAsset( + id: map['id'] ?? '', + deviceAssetId: map['deviceAssetId'] ?? '', + userId: map['userId'] ?? '', + deviceId: map['deviceId'] ?? '', + assetType: map['assetType'] ?? '', + localPath: map['localPath'] ?? '', + remotePath: map['remotePath'] ?? '', + createdAt: map['createdAt'] ?? '', + modifiedAt: map['modifiedAt'] ?? '', + isFavorite: map['isFavorite'] ?? false, + description: map['description'], + ); + } + + String toJson() => json.encode(toMap()); + + factory ImmichAsset.fromJson(String source) => ImmichAsset.fromMap(json.decode(source)); + + @override + String toString() { + return 'ImmichAsset(id: $id, deviceAssetId: $deviceAssetId, userId: $userId, deviceId: $deviceId, assetType: $assetType, localPath: $localPath, remotePath: $remotePath, createdAt: $createdAt, modifiedAt: $modifiedAt, isFavorite: $isFavorite, description: $description)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ImmichAsset && + other.id == id && + other.deviceAssetId == deviceAssetId && + other.userId == userId && + other.deviceId == deviceId && + other.assetType == assetType && + other.localPath == localPath && + other.remotePath == remotePath && + other.createdAt == createdAt && + other.modifiedAt == modifiedAt && + other.isFavorite == isFavorite && + other.description == description; + } + + @override + int get hashCode { + return id.hashCode ^ + deviceAssetId.hashCode ^ + userId.hashCode ^ + deviceId.hashCode ^ + assetType.hashCode ^ + localPath.hashCode ^ + remotePath.hashCode ^ + createdAt.hashCode ^ + modifiedAt.hashCode ^ + isFavorite.hashCode ^ + description.hashCode; + } +} diff --git a/mobile/lib/shared/models/server_info.model.dart b/mobile/lib/shared/models/server_info.model.dart new file mode 100644 index 0000000000..7cb2c77c13 --- /dev/null +++ b/mobile/lib/shared/models/server_info.model.dart @@ -0,0 +1,98 @@ +import 'dart:convert'; + +class ServerInfo { + final String diskSize; + final String diskUse; + final String diskAvailable; + final int diskSizeRaw; + final int diskUseRaw; + final int diskAvailableRaw; + final double diskUsagePercentage; + ServerInfo({ + required this.diskSize, + required this.diskUse, + required this.diskAvailable, + required this.diskSizeRaw, + required this.diskUseRaw, + required this.diskAvailableRaw, + required this.diskUsagePercentage, + }); + + ServerInfo copyWith({ + String? diskSize, + String? diskUse, + String? diskAvailable, + int? diskSizeRaw, + int? diskUseRaw, + int? diskAvailableRaw, + double? diskUsagePercentage, + }) { + return ServerInfo( + diskSize: diskSize ?? this.diskSize, + diskUse: diskUse ?? this.diskUse, + diskAvailable: diskAvailable ?? this.diskAvailable, + diskSizeRaw: diskSizeRaw ?? this.diskSizeRaw, + diskUseRaw: diskUseRaw ?? this.diskUseRaw, + diskAvailableRaw: diskAvailableRaw ?? this.diskAvailableRaw, + diskUsagePercentage: diskUsagePercentage ?? this.diskUsagePercentage, + ); + } + + Map toMap() { + return { + 'diskSize': diskSize, + 'diskUse': diskUse, + 'diskAvailable': diskAvailable, + 'diskSizeRaw': diskSizeRaw, + 'diskUseRaw': diskUseRaw, + 'diskAvailableRaw': diskAvailableRaw, + 'diskUsagePercentage': diskUsagePercentage, + }; + } + + factory ServerInfo.fromMap(Map map) { + return ServerInfo( + diskSize: map['diskSize'] ?? '', + diskUse: map['diskUse'] ?? '', + diskAvailable: map['diskAvailable'] ?? '', + diskSizeRaw: map['diskSizeRaw']?.toInt() ?? 0, + diskUseRaw: map['diskUseRaw']?.toInt() ?? 0, + diskAvailableRaw: map['diskAvailableRaw']?.toInt() ?? 0, + diskUsagePercentage: map['diskUsagePercentage']?.toDouble() ?? 0.0, + ); + } + + String toJson() => json.encode(toMap()); + + factory ServerInfo.fromJson(String source) => ServerInfo.fromMap(json.decode(source)); + + @override + String toString() { + return 'ServerInfo(diskSize: $diskSize, diskUse: $diskUse, diskAvailable: $diskAvailable, diskSizeRaw: $diskSizeRaw, diskUseRaw: $diskUseRaw, diskAvailableRaw: $diskAvailableRaw, diskUsagePercentage: $diskUsagePercentage)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is ServerInfo && + other.diskSize == diskSize && + other.diskUse == diskUse && + other.diskAvailable == diskAvailable && + other.diskSizeRaw == diskSizeRaw && + other.diskUseRaw == diskUseRaw && + other.diskAvailableRaw == diskAvailableRaw && + other.diskUsagePercentage == diskUsagePercentage; + } + + @override + int get hashCode { + return diskSize.hashCode ^ + diskUse.hashCode ^ + diskAvailable.hashCode ^ + diskSizeRaw.hashCode ^ + diskUseRaw.hashCode ^ + diskAvailableRaw.hashCode ^ + diskUsagePercentage.hashCode; + } +} diff --git a/mobile/lib/shared/providers/app_state.provider.dart b/mobile/lib/shared/providers/app_state.provider.dart new file mode 100644 index 0000000000..32854d925b --- /dev/null +++ b/mobile/lib/shared/providers/app_state.provider.dart @@ -0,0 +1,13 @@ +import 'package:hooks_riverpod/hooks_riverpod.dart'; + +enum AppStateEnum { + active, + inactive, + paused, + resumed, + detached, +} + +final appStateProvider = StateProvider((ref) { + return AppStateEnum.active; +}); diff --git a/mobile/lib/shared/providers/backup.provider.dart b/mobile/lib/shared/providers/backup.provider.dart new file mode 100644 index 0000000000..e17466e053 --- /dev/null +++ b/mobile/lib/shared/providers/backup.provider.dart @@ -0,0 +1,137 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/foundation.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/shared/services/server_info.service.dart'; +import 'package:immich_mobile/shared/models/backup_state.model.dart'; +import 'package:immich_mobile/shared/models/server_info.model.dart'; +import 'package:immich_mobile/shared/services/backup.service.dart'; +import 'package:photo_manager/photo_manager.dart'; + +class BackupNotifier extends StateNotifier { + BackupNotifier() + : super( + BackUpState( + backupProgress: BackUpProgressEnum.idle, + backingUpAssetCount: 0, + assetOnDatabase: 0, + totalAssetCount: 0, + progressInPercentage: 0, + cancelToken: CancelToken(), + serverInfo: ServerInfo( + diskAvailable: "0", + diskAvailableRaw: 0, + diskSize: "0", + diskSizeRaw: 0, + diskUsagePercentage: 0.0, + diskUse: "0", + diskUseRaw: 0, + ), + ), + ); + + final BackupService _backupService = BackupService(); + final ServerInfoService _serverInfoService = ServerInfoService(); + + void getBackupInfo() async { + _updateServerInfo(); + + List list = await PhotoManager.getAssetPathList(onlyAll: true, type: RequestType.image); + + if (list.isEmpty) { + debugPrint("No Asset On Device"); + return; + } + + int totalAsset = list[0].assetCount; + List didBackupAsset = await _backupService.getDeviceBackupAsset(); + + state = state.copyWith(totalAssetCount: totalAsset, assetOnDatabase: didBackupAsset.length); + } + + void startBackupProcess() async { + _updateServerInfo(); + + state = state.copyWith(backupProgress: BackUpProgressEnum.inProgress); + + var authResult = await PhotoManager.requestPermissionExtend(); + if (authResult.isAuth) { + await PhotoManager.clearFileCache(); + // await PhotoManager.presentLimited(); + // Gather assets info + List list = + await PhotoManager.getAssetPathList(hasAll: true, onlyAll: true, type: RequestType.image); + + if (list.isEmpty) { + debugPrint("No Asset On Device - Abort Backup Process"); + return; + } + + int totalAsset = list[0].assetCount; + List currentAssets = await list[0].getAssetListRange(start: 0, end: totalAsset); + + // Get device assets info from database + // Compare and find different assets that has not been backing up + // Backup those assets + List backupAsset = await _backupService.getDeviceBackupAsset(); + + state = state.copyWith(totalAssetCount: totalAsset, assetOnDatabase: backupAsset.length); + // Remove item that has already been backed up + for (var backupAssetId in backupAsset) { + currentAssets.removeWhere((e) => e.id == backupAssetId); + } + + if (currentAssets.isEmpty) { + state = state.copyWith(backupProgress: BackUpProgressEnum.idle); + } + + state = state.copyWith(backingUpAssetCount: currentAssets.length); + + // Perform Packup + state = state.copyWith(cancelToken: CancelToken()); + _backupService.backupAsset(currentAssets, state.cancelToken, _onAssetUploaded, _onUploadProgress); + } else { + PhotoManager.openSetting(); + } + } + + void cancelBackup() { + state.cancelToken.cancel('Cancel Backup'); + state = state.copyWith(backupProgress: BackUpProgressEnum.idle); + } + + void _onAssetUploaded() { + state = + state.copyWith(backingUpAssetCount: state.backingUpAssetCount - 1, assetOnDatabase: state.assetOnDatabase + 1); + + if (state.backingUpAssetCount == 0) { + state = state.copyWith(backupProgress: BackUpProgressEnum.done, progressInPercentage: 0.0); + } + + _updateServerInfo(); + } + + void _onUploadProgress(int sent, int total) { + state = state.copyWith(progressInPercentage: (sent.toDouble() / total.toDouble() * 100)); + } + + void _updateServerInfo() async { + var serverInfo = await _serverInfoService.getServerInfo(); + + // Update server info + state = state.copyWith( + serverInfo: ServerInfo( + diskSize: serverInfo.diskSize, + diskUse: serverInfo.diskUse, + diskAvailable: serverInfo.diskAvailable, + diskSizeRaw: serverInfo.diskSizeRaw, + diskUseRaw: serverInfo.diskUseRaw, + diskAvailableRaw: serverInfo.diskAvailableRaw, + diskUsagePercentage: serverInfo.diskUsagePercentage, + ), + ); + } +} + +final backupProvider = StateNotifierProvider((ref) { + return BackupNotifier(); +}); diff --git a/mobile/lib/shared/services/backup.service.dart b/mobile/lib/shared/services/backup.service.dart new file mode 100644 index 0000000000..0058dfadef --- /dev/null +++ b/mobile/lib/shared/services/backup.service.dart @@ -0,0 +1,124 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; +import 'package:immich_mobile/shared/services/network.service.dart'; +import 'package:immich_mobile/shared/models/device_info.model.dart'; +import 'package:immich_mobile/utils/dio_http_interceptor.dart'; +import 'package:immich_mobile/utils/files_helper.dart'; +import 'package:photo_manager/photo_manager.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:path/path.dart' as p; +import 'package:exif/exif.dart'; + +class BackupService { + final NetworkService _networkService = NetworkService(); + + Future> getDeviceBackupAsset() async { + String deviceId = Hive.box(userInfoBox).get(deviceIdKey); + + Response response = await _networkService.getRequest(url: "asset/$deviceId"); + List result = jsonDecode(response.toString()); + + return result.cast(); + } + + backupAsset(List assetList, CancelToken cancelToken, Function singleAssetDoneCb, + Function(int, int) uploadProgress) async { + var dio = Dio(); + dio.interceptors.add(AuthenticatedRequestInterceptor()); + String deviceId = Hive.box(userInfoBox).get(deviceIdKey); + String savedEndpoint = Hive.box(userInfoBox).get(serverEndpointKey); + File? file; + + for (var entity in assetList) { + try { + file = await entity.file.timeout(const Duration(seconds: 5)); + + if (file != null) { + // reading exif + // var exifData = await readExifFromFile(file); + + // for (String key in exifData.keys) { + // debugPrint("- $key (${exifData[key]?.tagType}): ${exifData[key]}"); + // } + + // debugPrint("------------------"); + String originalFileName = await entity.titleAsync; + String fileNameWithoutPath = originalFileName.toString().split(".")[0]; + var fileExtension = p.extension(file.path); + LatLng coordinate = await entity.latlngAsync(); + var mimeType = FileHelper.getMimeType(file.path); + var formData = FormData.fromMap({ + 'deviceAssetId': entity.id, + 'deviceId': deviceId, + 'assetType': _getAssetType(entity.type), + 'createdAt': entity.createDateTime.toIso8601String(), + 'modifiedAt': entity.modifiedDateTime.toIso8601String(), + 'isFavorite': entity.isFavorite, + 'fileExtension': fileExtension, + 'lat': coordinate.latitude, + 'lon': coordinate.longitude, + 'files': [ + await MultipartFile.fromFile( + file.path, + filename: fileNameWithoutPath, + contentType: MediaType( + mimeType["type"], + mimeType["subType"], + ), + ), + ] + }); + + Response res = await dio.post( + '$savedEndpoint/asset/upload', + data: formData, + cancelToken: cancelToken, + onSendProgress: (sent, total) => uploadProgress(sent, total), + ); + + if (res.statusCode == 201) { + singleAssetDoneCb(); + } + } + } on DioError catch (e) { + debugPrint("DioError backupAsset: ${e.response}"); + break; + } catch (e) { + debugPrint("ERROR backupAsset: ${e.toString()}"); + continue; + } finally { + if (Platform.isIOS) { + file?.deleteSync(); + } + } + } + } + + String _getAssetType(AssetType assetType) { + switch (assetType) { + case AssetType.audio: + return "AUDIO"; + case AssetType.image: + return "IMAGE"; + case AssetType.video: + return "VIDEO"; + case AssetType.other: + return "OTHER"; + } + } + + Future setAutoBackup(bool status, String deviceId, String deviceType) async { + var res = await _networkService.patchRequest(url: 'device-info', data: { + "isAutoBackup": status, + "deviceId": deviceId, + "deviceType": deviceType, + }); + + return DeviceInfoRemote.fromJson(res.toString()); + } +} diff --git a/mobile/lib/shared/services/device_info.service.dart b/mobile/lib/shared/services/device_info.service.dart new file mode 100644 index 0000000000..c665200dd8 --- /dev/null +++ b/mobile/lib/shared/services/device_info.service.dart @@ -0,0 +1,30 @@ +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/material.dart'; + +class DeviceInfoService { + Future> getDeviceInfo() async { + // Get device info + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + String? deviceId = ""; + String deviceType = ""; + + try { + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + deviceId = androidInfo.androidId; + deviceType = "ANDROID"; + } catch (e) { + debugPrint("Not an android device"); + } + + try { + IosDeviceInfo iosInfo = await deviceInfo.iosInfo; + deviceId = iosInfo.identifierForVendor; + deviceType = "IOS"; + debugPrint("Device ID: $deviceId"); + } catch (e) { + debugPrint("Not an ios device"); + } + + return {"deviceId": deviceId, "deviceType": deviceType}; + } +} diff --git a/mobile/lib/shared/services/local_storage.service.dart b/mobile/lib/shared/services/local_storage.service.dart new file mode 100644 index 0000000000..f4c7caaf9d --- /dev/null +++ b/mobile/lib/shared/services/local_storage.service.dart @@ -0,0 +1,18 @@ +import 'package:hive/hive.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; + +class LocalStorageService { + late Box _box; + + LocalStorageService() { + _box = Hive.box(userInfoBox); + } + + T get(String key) { + return _box.get(key); + } + + put(String key, T value) { + return _box.put(key, value); + } +} diff --git a/mobile/lib/shared/services/network.service.dart b/mobile/lib/shared/services/network.service.dart new file mode 100644 index 0000000000..8956e28b28 --- /dev/null +++ b/mobile/lib/shared/services/network.service.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:hive/hive.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; +import 'package:immich_mobile/utils/dio_http_interceptor.dart'; + +class NetworkService { + Future getRequest({required String url}) async { + try { + var dio = Dio(); + dio.interceptors.add(AuthenticatedRequestInterceptor()); + + var savedEndpoint = Hive.box(userInfoBox).get(serverEndpointKey); + Response res = await dio.get('$savedEndpoint/$url'); + + if (res.statusCode == 200) { + return res; + } + } on DioError catch (e) { + debugPrint("DioError: ${e.response}"); + } catch (e) { + debugPrint("ERROR getRequest: ${e.toString()}"); + } + } + + Future postRequest({required String url, dynamic data}) async { + try { + var dio = Dio(); + dio.interceptors.add(AuthenticatedRequestInterceptor()); + + var savedEndpoint = Hive.box(userInfoBox).get(serverEndpointKey); + String validUrl = Uri.parse('$savedEndpoint/$url').toString(); + Response res = await dio.post(validUrl, data: data); + + return res; + } on DioError catch (e) { + debugPrint("DioError: ${e.response}"); + return false; + } catch (e) { + debugPrint("ERROR BackupService: $e"); + } + } + + Future patchRequest({required String url, dynamic data}) async { + try { + var dio = Dio(); + dio.interceptors.add(AuthenticatedRequestInterceptor()); + + var savedEndpoint = Hive.box(userInfoBox).get(serverEndpointKey); + + String validUrl = Uri.parse('$savedEndpoint/$url').toString(); + Response res = await dio.patch(validUrl, data: data); + + return res; + } on DioError catch (e) { + debugPrint("DioError: ${e.response}"); + } catch (e) { + debugPrint("ERROR BackupService: $e"); + } + } + + Future pingServer() async { + try { + var dio = Dio(); + + var savedEndpoint = Hive.box(userInfoBox).get(serverEndpointKey); + + String validUrl = Uri.parse('$savedEndpoint/server-info/ping').toString(); + + debugPrint("pint server at url $validUrl"); + Response res = await dio.get(validUrl); + var jsonRespsonse = jsonDecode(res.toString()); + + if (jsonRespsonse["res"] == "pong") { + return true; + } else { + return false; + } + } on DioError catch (e) { + debugPrint("[PING SERVER] DioError: ${e.response} - $e"); + return false; + } catch (e) { + debugPrint("ERROR BackupService: $e"); + return false; + } + } +} diff --git a/mobile/lib/shared/services/server_info.service.dart b/mobile/lib/shared/services/server_info.service.dart new file mode 100644 index 0000000000..2b093bbb08 --- /dev/null +++ b/mobile/lib/shared/services/server_info.service.dart @@ -0,0 +1,15 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:immich_mobile/shared/services/network.service.dart'; +import 'package:immich_mobile/shared/models/server_info.model.dart'; + +class ServerInfoService { + final NetworkService _networkService = NetworkService(); + + Future getServerInfo() async { + Response response = await _networkService.getRequest(url: 'server-info'); + + return ServerInfo.fromJson(response.toString()); + } +} diff --git a/mobile/lib/shared/views/backup_controller_page.dart b/mobile/lib/shared/views/backup_controller_page.dart new file mode 100644 index 0000000000..d33f76682f --- /dev/null +++ b/mobile/lib/shared/views/backup_controller_page.dart @@ -0,0 +1,232 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/modules/login/models/authentication_state.model.dart'; +import 'package:immich_mobile/shared/models/backup_state.model.dart'; +import 'package:immich_mobile/modules/login/providers/authentication.provider.dart'; +import 'package:immich_mobile/shared/providers/backup.provider.dart'; +import 'package:percent_indicator/linear_percent_indicator.dart'; + +class BackupControllerPage extends HookConsumerWidget { + const BackupControllerPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context, WidgetRef ref) { + BackUpState _backupState = ref.watch(backupProvider); + AuthenticationState _authenticationState = ref.watch(authenticationProvider); + + bool shouldBackup = _backupState.totalAssetCount - _backupState.assetOnDatabase == 0 ? false : true; + + useEffect(() { + if (_backupState.backupProgress != BackUpProgressEnum.inProgress) { + ref.read(backupProvider.notifier).getBackupInfo(); + } + }, []); + + Widget _buildStorageInformation() { + return ListTile( + leading: Icon( + Icons.storage_rounded, + color: Theme.of(context).primaryColor, + ), + title: const Text( + "Server Storage", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14), + ), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LinearPercentIndicator( + padding: const EdgeInsets.only(top: 8.0), + lineHeight: 5.0, + percent: _backupState.serverInfo.diskUsagePercentage / 100.0, + backgroundColor: Colors.grey, + progressColor: Theme.of(context).primaryColor, + ), + Padding( + padding: const EdgeInsets.only(top: 12.0), + child: Text('${_backupState.serverInfo.diskUse} of ${_backupState.serverInfo.diskSize} used'), + ), + ], + ), + ), + ); + } + + ListTile _buildBackupController() { + var backUpOption = _authenticationState.deviceInfo.isAutoBackup ? "on" : "off"; + var isAutoBackup = _authenticationState.deviceInfo.isAutoBackup; + var backupBtnText = _authenticationState.deviceInfo.isAutoBackup ? "off" : "on"; + return ListTile( + isThreeLine: true, + leading: isAutoBackup + ? Icon( + Icons.cloud_done_rounded, + color: Theme.of(context).primaryColor, + ) + : const Icon(Icons.cloud_off_rounded), + title: Text( + "Back up is $backUpOption", + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 14), + ), + subtitle: Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + !isAutoBackup + ? const Text( + "Turn on backup to automatically upload new assets to the server.", + style: TextStyle(fontSize: 14), + ) + : Container(), + OutlinedButton( + onPressed: () { + isAutoBackup + ? ref.watch(authenticationProvider.notifier).setAutoBackup(false) + : ref.watch(authenticationProvider.notifier).setAutoBackup(true); + }, + child: Text("Turn $backupBtnText Backup"), + ) + ], + ), + ), + ); + } + + return Scaffold( + appBar: AppBar( + title: const Text( + "Backup", + style: TextStyle(fontWeight: FontWeight.bold), + ), + leading: IconButton( + onPressed: () { + AutoRouter.of(context).pop(true); + }, + icon: const Icon(Icons.arrow_back_ios_rounded)), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: ListView( + // crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.all(8.0), + child: Text( + "Backup Information", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + ), + ), + BackupInfoCard( + title: "Total", + subtitle: "All images and video on the device", + info: "${_backupState.totalAssetCount}", + ), + BackupInfoCard( + title: "Backup", + subtitle: "Images and videos of the device that are backup on server", + info: "${_backupState.assetOnDatabase}", + ), + BackupInfoCard( + title: "Remainder", + subtitle: "Images and videos that has not been backing up", + info: "${_backupState.totalAssetCount - _backupState.assetOnDatabase}", + ), + const Divider(), + _buildBackupController(), + const Divider(), + _buildStorageInformation(), + const Divider(), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + "Asset that were being backup: ${_backupState.backingUpAssetCount} [${_backupState.progressInPercentage.toStringAsFixed(0)}%]"), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Row(children: [ + const Text("Backup Progress:"), + const Padding(padding: EdgeInsets.symmetric(horizontal: 2)), + _backupState.backupProgress == BackUpProgressEnum.inProgress + ? const CircularProgressIndicator.adaptive() + : const Text("Done"), + ]), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: _backupState.backupProgress == BackUpProgressEnum.inProgress + ? ElevatedButton( + style: ElevatedButton.styleFrom(primary: Colors.red[300]), + onPressed: () { + ref.read(backupProvider.notifier).cancelBackup(); + }, + child: const Text("Cancel"), + ) + : ElevatedButton( + onPressed: shouldBackup + ? () { + ref.read(backupProvider.notifier).startBackupProcess(); + } + : null, + child: const Text("Start Backup"), + ), + ), + ) + ], + ), + ), + ); + } +} + +class BackupInfoCard extends StatelessWidget { + final String title; + final String subtitle; + final String info; + const BackupInfoCard({Key? key, required this.title, required this.subtitle, required this.info}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), // if you need this + side: const BorderSide( + color: Colors.black12, + width: 1, + ), + ), + elevation: 0, + borderOnForeground: false, + child: ListTile( + minVerticalPadding: 15, + isThreeLine: true, + title: Text( + title, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 20), + ), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + subtitle, + style: const TextStyle(color: Color(0xFF808080), fontSize: 12), + ), + ), + trailing: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + info, + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const Text("assets"), + ], + ), + ), + ); + } +} diff --git a/mobile/lib/shared/views/image_viewer_page.dart b/mobile/lib/shared/views/image_viewer_page.dart new file mode 100644 index 0000000000..63de2462e6 --- /dev/null +++ b/mobile/lib/shared/views/image_viewer_page.dart @@ -0,0 +1,64 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; + +class ImageViewerPage extends StatelessWidget { + final String imageUrl; + final String heroTag; + final String thumbnailUrl; + + const ImageViewerPage({Key? key, required this.imageUrl, required this.heroTag, required this.thumbnailUrl}) + : super(key: key); + + @override + Widget build(BuildContext context) { + var box = Hive.box(userInfoBox); + + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + toolbarHeight: 60, + backgroundColor: Colors.black, + leading: IconButton( + onPressed: () { + AutoRouter.of(context).pop(); + }, + icon: const Icon(Icons.arrow_back_ios)), + ), + body: Dismissible( + direction: DismissDirection.vertical, + onDismissed: (_) { + AutoRouter.of(context).pop(); + }, + key: Key(heroTag), + child: Center( + child: Hero( + tag: heroTag, + child: CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: imageUrl, + httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"}, + fadeInDuration: const Duration(milliseconds: 250), + errorWidget: (context, url, error) => const Icon(Icons.error), + placeholder: (context, url) { + return CachedNetworkImage( + fit: BoxFit.cover, + imageUrl: thumbnailUrl, + httpHeaders: {"Authorization": "Bearer ${box.get(accessTokenKey)}"}, + placeholderFadeInDuration: const Duration(milliseconds: 0), + progressIndicatorBuilder: (context, url, downloadProgress) => Transform.scale( + scale: 0.2, + child: CircularProgressIndicator(value: downloadProgress.progress), + ), + errorWidget: (context, url, error) => const Icon(Icons.error), + ); + }, + ), + ), + ), + ), + ); + } +} diff --git a/mobile/lib/utils/dio_http_interceptor.dart b/mobile/lib/utils/dio_http_interceptor.dart new file mode 100644 index 0000000000..be9958ae9a --- /dev/null +++ b/mobile/lib/utils/dio_http_interceptor.dart @@ -0,0 +1,17 @@ +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:immich_mobile/constants/hive_box.dart'; + +class AuthenticatedRequestInterceptor extends Interceptor { + @override + void onRequest(RequestOptions options, RequestInterceptorHandler handler) { + // debugPrint('REQUEST[${options.method}] => PATH: ${options.path}'); + + var box = Hive.box(userInfoBox); + + options.headers["Authorization"] = "Bearer ${box.get(accessTokenKey)}"; + options.responseType = ResponseType.plain; + return super.onRequest(options, handler); + } +} diff --git a/mobile/lib/utils/files_helper.dart b/mobile/lib/utils/files_helper.dart new file mode 100644 index 0000000000..bede193907 --- /dev/null +++ b/mobile/lib/utils/files_helper.dart @@ -0,0 +1,33 @@ +import 'package:path/path.dart' as p; + +class FileHelper { + static getMimeType(String filePath) { + var fileExtension = p.extension(filePath).split(".")[1]; + + switch (fileExtension) { + case 'gif': + return {"type": "image", "subType": "gif"}; + + case 'jpeg': + return {"type": "image", "subType": "jpeg"}; + + case 'jpg': + return {"type": "image", "subType": "jpeg"}; + + case 'png': + return {"type": "image", "subType": "png"}; + + case 'mov': + return {"type": "video", "subType": "quicktime"}; + + case 'mp4': + return {"type": "video", "subType": "mp4"}; + + case 'avi': + return {"type": "video", "subType": "x-msvideo"}; + + default: + return {"type": "unsupport", "subType": "unsupport"}; + } + } +} diff --git a/mobile/makefile b/mobile/makefile new file mode 100644 index 0000000000..c68be08444 --- /dev/null +++ b/mobile/makefile @@ -0,0 +1,5 @@ +build: + flutter packages pub run build_runner build + +watch: + flutter packages pub run build_runner watch \ No newline at end of file diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock new file mode 100644 index 0000000000..b4603ab63c --- /dev/null +++ b/mobile/pubspec.lock @@ -0,0 +1,845 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "34.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.8.2" + auto_route: + dependency: "direct main" + description: + name: auto_route + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.2" + auto_route_generator: + dependency: "direct dev" + description: + name: auto_route_generator + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + build: + dependency: transitive + description: + name: build + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + build_config: + dependency: transitive + description: + name: build_config + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" + build_runner: + dependency: "direct dev" + description: + name: build_runner + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.7" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + url: "https://pub.dartlang.org" + source: hosted + version: "7.2.3" + built_collection: + dependency: transitive + description: + name: built_collection + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + url: "https://pub.dartlang.org" + source: hosted + version: "8.1.4" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.0" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + cli_util: + dependency: transitive + description: + name: cli_util + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.5" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + code_builder: + dependency: transitive + description: + name: code_builder + url: "https://pub.dartlang.org" + source: hosted + version: "4.1.0" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.15.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + dart_style: + dependency: transitive + description: + name: dart_style + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + device_info_plus_linux: + dependency: transitive + description: + name: device_info_plus_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + device_info_plus_macos: + dependency: transitive + description: + name: device_info_plus_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.0+1" + device_info_plus_web: + dependency: transitive + description: + name: device_info_plus_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + device_info_plus_windows: + dependency: transitive + description: + name: device_info_plus_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + dio: + dependency: "direct main" + description: + name: dio + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.4" + exif: + dependency: "direct main" + description: + name: exif + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + fixnum: + dependency: transitive + description: + name: fixnum + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_blurhash: + dependency: transitive + description: + name: flutter_blurhash + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" + flutter_hooks: + dependency: "direct main" + description: + name: flutter_hooks + url: "https://pub.dartlang.org" + source: hosted + version: "0.18.2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" + flutter_riverpod: + dependency: transitive + description: + name: flutter_riverpod + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0-dev.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + graphs: + dependency: transitive + description: + name: graphs + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + hive: + dependency: "direct main" + description: + name: hive + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + hive_flutter: + dependency: "direct main" + description: + name: hive_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + hive_generator: + dependency: "direct dev" + description: + name: hive_generator + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + hooks_riverpod: + dependency: "direct main" + description: + name: hooks_riverpod + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0-dev.0" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + intl: + dependency: "direct main" + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + json_annotation: + dependency: transitive + description: + name: json_annotation + url: "https://pub.dartlang.org" + source: hosted + version: "4.4.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.11" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + octo_image: + dependency: transitive + description: + name: octo_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" + percent_indicator: + dependency: "direct main" + description: + name: percent_indicator + url: "https://pub.dartlang.org" + source: hosted + version: "3.4.0" + photo_manager: + dependency: "direct main" + description: + name: photo_manager + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.10" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + riverpod: + dependency: transitive + description: + name: riverpod + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0-dev.0" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.3" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + source_helper: + dependency: transitive + description: + name: source_helper + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.1" + sprintf: + dependency: transitive + description: + name: sprintf + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0" + state_notifier: + dependency: transitive + description: + name: state_notifier + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.2+1" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + stream_transform: + dependency: transitive + description: + name: stream_transform + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.3" + timing: + dependency: transitive + description: + name: timing + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + transparent_image: + dependency: "direct main" + description: + name: transparent_image + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.0" + universal_html: + dependency: transitive + description: + name: universal_html + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + universal_io: + dependency: transitive + description: + name: universal_io + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.5" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.8" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" +sdks: + dart: ">=2.15.1 <3.0.0" + flutter: ">=2.5.0" diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml new file mode 100644 index 0000000000..23b9c9db7c --- /dev/null +++ b/mobile/pubspec.yaml @@ -0,0 +1,39 @@ +name: immich_mobile +description: A new Flutter project. + +publish_to: "none" +version: 1.0.0+1 + +environment: + sdk: ">=2.15.1 <3.0.0" + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + photo_manager: ^1.3.10 + flutter_hooks: ^0.18.0 + hooks_riverpod: ^2.0.0-dev.0 + hive: + hive_flutter: + dio: ^4.0.4 + device_info_plus: ^3.2.1 + cached_network_image: ^3.2.0 + google_fonts: ^2.2.0 + percent_indicator: ^3.4.0 + intl: ^0.17.0 + auto_route: ^3.2.2 + exif: ^3.1.1 + transparent_image: ^2.0.0 +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.0 + hive_generator: ^1.1.2 + build_runner: ^2.1.7 + auto_route_generator: ^3.2.1 + +flutter: + uses-material-design: true + assets: + - assets/ diff --git a/mobile/test/widget_test.dart b/mobile/test/widget_test.dart new file mode 100644 index 0000000000..1cdcf6c5bd --- /dev/null +++ b/mobile/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:immich_mobile/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const ImmichApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/mobile/web/favicon.png b/mobile/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-192.png b/mobile/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-512.png b/mobile/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-maskable-192.png b/mobile/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/mobile/web/icons/Icon-maskable-512.png b/mobile/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/mobile/web/index.html b/mobile/web/index.html new file mode 100644 index 0000000000..3c44166255 --- /dev/null +++ b/mobile/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + immich_mobile + + + + + + + diff --git a/mobile/web/manifest.json b/mobile/web/manifest.json new file mode 100644 index 0000000000..2cf8c5235a --- /dev/null +++ b/mobile/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "immich_mobile", + "short_name": "immich_mobile", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000000..a58924b677 --- /dev/null +++ b/server/.env.example @@ -0,0 +1,14 @@ +# STAGE +NODE_ENV=development + +# Database +DB_HOST= +DB_USERNAME= +DB_PASSWORD= +DB_DATABASE= + +# Upload File Config +UPLOAD_LOCATION=./tmp + +# JWT SECRET +JWT_SECRET= \ No newline at end of file diff --git a/server/.eslintrc.js b/server/.eslintrc.js new file mode 100644 index 0000000000..760926836d --- /dev/null +++ b/server/.eslintrc.js @@ -0,0 +1,26 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + tsconfigRootDir: __dirname, + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:prettier/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'prettier/prettier': 0, + }, +}; diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000000..1f9f407082 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,40 @@ +# compiled output +/dist +/node_modules + +# Logs +logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +.env +dist/ +upload/ +tmp/ diff --git a/server/.prettierrc b/server/.prettierrc new file mode 100644 index 0000000000..9db28a2bd9 --- /dev/null +++ b/server/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "printWidth": 120 +} diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000000..952cb5ac0e --- /dev/null +++ b/server/README.md @@ -0,0 +1,11 @@ +# IMMICH - Server + +A self-hosted solution for mobile backup and viewing images/videos. + +# Requesquisite + +There is a tensorflow module running in the server so some package will be needed when building the Node's modules + +```bash +$ apt-get install make cmake gcc g++ +``` diff --git a/server/nest-cli.json b/server/nest-cli.json new file mode 100644 index 0000000000..56167b36a1 --- /dev/null +++ b/server/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000000..8c39721aeb --- /dev/null +++ b/server/package.json @@ -0,0 +1,100 @@ +{ + "name": "immich", + "version": "0.0.1", + "description": "", + "author": "", + "private": true, + "license": "UNLICENSED", + "scripts": { + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:dev": "nest start --watch", + "start:debug": "nest start --debug --watch", + "start:prod": "node dist/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@nestjs/bull": "^0.4.2", + "@nestjs/common": "^8.0.0", + "@nestjs/config": "^1.1.6", + "@nestjs/core": "^8.0.0", + "@nestjs/jwt": "^8.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/passport": "^8.1.0", + "@nestjs/platform-express": "^8.0.0", + "@nestjs/platform-fastify": "^8.2.6", + "@nestjs/typeorm": "^8.0.3", + "@tensorflow-models/coco-ssd": "^2.2.2", + "@tensorflow/tfjs-node": "^3.13.0", + "@types/sharp": "^0.29.5", + "bcrypt": "^5.0.1", + "bull": "^4.4.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.13.2", + "dotenv": "^14.2.0", + "joi": "^17.5.0", + "lodash": "^4.17.21", + "passport": "^0.5.2", + "passport-jwt": "^4.0.0", + "pg": "^8.7.1", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.2.0", + "sharp": "^0.29.3", + "systeminformation": "^5.11.0", + "typeorm": "^0.2.41" + }, + "devDependencies": { + "@nestjs/cli": "^8.0.0", + "@nestjs/schematics": "^8.0.0", + "@nestjs/testing": "^8.0.0", + "@types/bcrypt": "^5.0.0", + "@types/bull": "^3.15.7", + "@types/express": "^4.17.13", + "@types/imagemin": "^8.0.0", + "@types/jest": "27.0.2", + "@types/lodash": "^4.14.178", + "@types/multer": "^1.4.7", + "@types/node": "^16.0.0", + "@types/passport-jwt": "^3.0.6", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^27.2.5", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "^27.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.10.1", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/server/src/api-v1/asset/asset.controller.ts b/server/src/api-v1/asset/asset.controller.ts new file mode 100644 index 0000000000..9acb48b287 --- /dev/null +++ b/server/src/api-v1/asset/asset.controller.ts @@ -0,0 +1,85 @@ +import { + Controller, + Post, + UseInterceptors, + UploadedFiles, + Body, + UseGuards, + Get, + Param, + ValidationPipe, + StreamableFile, + Response, + Query, + Logger, + UploadedFile, +} from '@nestjs/common'; +import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; +import { AssetService } from './asset.service'; +import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; +import { multerOption } from '../../config/multer-option.config'; +import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; +import { CreateAssetDto } from './dto/create-asset.dto'; +import { createReadStream } from 'fs'; +import { ServeFileDto } from './dto/serve-file.dto'; +import { ImageOptimizeService } from '../../modules/image-optimize/image-optimize.service'; +import { AssetType } from './entities/asset.entity'; +import { GetAllAssetQueryDto } from './dto/get-all-asset-query.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('asset') +export class AssetController { + constructor( + private readonly assetService: AssetService, + private readonly imageOptimizeService: ImageOptimizeService, + ) {} + + @Post('upload') + @UseInterceptors(FilesInterceptor('files', 30, multerOption)) + async uploadFile( + @GetAuthUser() authUser, + @UploadedFiles() files: Express.Multer.File[], + @Body(ValidationPipe) assetInfo: CreateAssetDto, + ) { + files.forEach(async (file) => { + const savedAsset = await this.assetService.createUserAsset(authUser, assetInfo, file.path, file.mimetype); + + if (savedAsset && savedAsset.type == AssetType.IMAGE) { + await this.imageOptimizeService.resizeImage(savedAsset); + } + }); + + return 'ok'; + } + + @Get('/file') + async serveFile( + @GetAuthUser() authUser: AuthUserDto, + @Response({ passthrough: true }) res, + @Query(ValidationPipe) query: ServeFileDto, + ): Promise { + let file = null; + const asset = await this.assetService.findOne(authUser, query.did, query.aid); + res.set({ + 'Content-Type': asset.mimeType, + }); + + if (query.isThumb === 'false' || !query.isThumb) { + file = createReadStream(asset.originalPath); + } else { + file = createReadStream(asset.resizePath); + } + + return new StreamableFile(file); + } + + @Get('/all') + async getAllAssets(@GetAuthUser() authUser: AuthUserDto, @Query(ValidationPipe) query: GetAllAssetQueryDto) { + return await this.assetService.getAllAssets(authUser, query); + } + + @Get('/:deviceId') + async getUserAssetsByDeviceId(@GetAuthUser() authUser: AuthUserDto, @Param('deviceId') deviceId: string) { + return await this.assetService.getUserAssetsByDeviceId(authUser, deviceId); + } +} diff --git a/server/src/api-v1/asset/asset.module.ts b/server/src/api-v1/asset/asset.module.ts new file mode 100644 index 0000000000..2665845090 --- /dev/null +++ b/server/src/api-v1/asset/asset.module.ts @@ -0,0 +1,35 @@ +import { Module } from '@nestjs/common'; +import { AssetService } from './asset.service'; +import { AssetController } from './asset.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { AssetEntity } from './entities/asset.entity'; +import { ImageOptimizeModule } from '../../modules/image-optimize/image-optimize.module'; +import { ImageOptimizeService } from '../../modules/image-optimize/image-optimize.service'; +import { BullModule } from '@nestjs/bull'; + +@Module({ + imports: [ + BullModule.registerQueue({ + name: 'image', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'machine-learning', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + TypeOrmModule.forFeature([AssetEntity]), + ImageOptimizeModule, + ], + controllers: [AssetController], + providers: [AssetService, ImageOptimizeService], + exports: [], +}) +export class AssetModule {} diff --git a/server/src/api-v1/asset/asset.service.ts b/server/src/api-v1/asset/asset.service.ts new file mode 100644 index 0000000000..8eb885825e --- /dev/null +++ b/server/src/api-v1/asset/asset.service.ts @@ -0,0 +1,105 @@ +import { BadRequestException, Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AuthUserDto } from '../../decorators/auth-user.decorator'; +import { CreateAssetDto } from './dto/create-asset.dto'; +import { UpdateAssetDto } from './dto/update-asset.dto'; +import { AssetEntity, AssetType } from './entities/asset.entity'; +import _ from 'lodash'; +import { GetAllAssetQueryDto } from './dto/get-all-asset-query.dto'; +import { GetAllAssetReponseDto } from './dto/get-all-asset-response.dto'; + +@Injectable() +export class AssetService { + constructor( + @InjectRepository(AssetEntity) + private assetRepository: Repository, + ) {} + + public async createUserAsset(authUser: AuthUserDto, assetInfo: CreateAssetDto, path: string, mimeType: string) { + const asset = new AssetEntity(); + asset.deviceAssetId = assetInfo.deviceAssetId; + asset.userId = authUser.id; + asset.deviceId = assetInfo.deviceId; + asset.type = assetInfo.assetType || AssetType.OTHER; + asset.originalPath = path; + asset.createdAt = assetInfo.createdAt; + asset.modifiedAt = assetInfo.modifiedAt; + asset.isFavorite = assetInfo.isFavorite; + asset.lat = assetInfo.lat; + asset.lon = assetInfo.lon; + asset.mimeType = mimeType; + try { + const res = await this.assetRepository.save(asset); + + return res; + } catch (e) { + Logger.error(`Error Create New Asset ${e}`, 'createUserAsset'); + } + } + + public async getUserAssetsByDeviceId(authUser: AuthUserDto, deviceId: string) { + const rows = await this.assetRepository.find({ + where: { + userId: authUser.id, + deviceId: deviceId, + }, + select: ['deviceAssetId'], + }); + + const res = []; + rows.forEach((v) => res.push(v.deviceAssetId)); + return res; + } + + public async getAllAssets(authUser: AuthUserDto, query: GetAllAssetQueryDto): Promise { + // Each page will take 100 images. + + try { + const assets = await this.assetRepository + .createQueryBuilder('a') + .where('a."userId" = :userId', { userId: authUser.id }) + .andWhere('a."createdAt" < :lastQueryCreatedAt', { + lastQueryCreatedAt: query.nextPageKey || new Date().toISOString(), + }) + .orderBy('a."createdAt"::date', 'DESC') + .take(200) + .getMany(); + + if (assets.length > 0) { + const data = _.groupBy(assets, (a) => new Date(a.createdAt).toISOString().slice(0, 10)); + const formattedData = []; + Object.keys(data).forEach((v) => formattedData.push({ date: v, assets: data[v] })); + + const response = new GetAllAssetReponseDto(); + response.count = assets.length; + response.data = formattedData; + response.nextPageKey = assets[assets.length - 1].createdAt; + + return response; + } else { + const response = new GetAllAssetReponseDto(); + response.count = 0; + response.data = []; + response.nextPageKey = 'null'; + + return response; + } + } catch (e) { + Logger.error(e, 'getAllAssets'); + } + } + + public async findOne(authUser: AuthUserDto, deviceId: string, assetId: string): Promise { + const rows = await this.assetRepository.query( + 'SELECT * FROM assets a WHERE a."deviceAssetId" = $1 AND a."userId" = $2 AND a."deviceId" = $3', + [assetId, authUser.id, deviceId], + ); + + if (rows.lengh == 0) { + throw new BadRequestException('Not Found'); + } + + return rows[0] as AssetEntity; + } +} diff --git a/server/src/api-v1/asset/dto/create-asset.dto.ts b/server/src/api-v1/asset/dto/create-asset.dto.ts new file mode 100644 index 0000000000..ce95421783 --- /dev/null +++ b/server/src/api-v1/asset/dto/create-asset.dto.ts @@ -0,0 +1,31 @@ +import { IsNotEmpty, IsOptional } from 'class-validator'; +import { AssetType } from '../entities/asset.entity'; + +export class CreateAssetDto { + @IsNotEmpty() + deviceAssetId: string; + + @IsNotEmpty() + deviceId: string; + + @IsNotEmpty() + assetType: AssetType; + + @IsNotEmpty() + createdAt: string; + + @IsNotEmpty() + modifiedAt: string; + + @IsNotEmpty() + isFavorite: boolean; + + @IsNotEmpty() + fileExtension: string; + + @IsOptional() + lat: string; + + @IsOptional() + lon: string; +} diff --git a/server/src/api-v1/asset/dto/get-all-asset-query.dto.ts b/server/src/api-v1/asset/dto/get-all-asset-query.dto.ts new file mode 100644 index 0000000000..b3c235c098 --- /dev/null +++ b/server/src/api-v1/asset/dto/get-all-asset-query.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty, IsOptional } from 'class-validator'; + +export class GetAllAssetQueryDto { + @IsOptional() + nextPageKey: string; +} diff --git a/server/src/api-v1/asset/dto/get-all-asset-response.dto.ts b/server/src/api-v1/asset/dto/get-all-asset-response.dto.ts new file mode 100644 index 0000000000..c26bdff1cf --- /dev/null +++ b/server/src/api-v1/asset/dto/get-all-asset-response.dto.ts @@ -0,0 +1,7 @@ +import { AssetEntity } from '../entities/asset.entity'; + +export class GetAllAssetReponseDto { + data: Array<{ date: string; assets: Array }>; + count: number; + nextPageKey: string; +} diff --git a/server/src/api-v1/asset/dto/get-asset.dto.ts b/server/src/api-v1/asset/dto/get-asset.dto.ts new file mode 100644 index 0000000000..c11d46787f --- /dev/null +++ b/server/src/api-v1/asset/dto/get-asset.dto.ts @@ -0,0 +1,6 @@ +import { IsNotEmpty } from 'class-validator'; + +class GetAssetDto { + @IsNotEmpty() + deviceId: string; +} diff --git a/server/src/api-v1/asset/dto/serve-file.dto.ts b/server/src/api-v1/asset/dto/serve-file.dto.ts new file mode 100644 index 0000000000..42f87d485b --- /dev/null +++ b/server/src/api-v1/asset/dto/serve-file.dto.ts @@ -0,0 +1,16 @@ +import { Transform } from 'class-transformer'; +import { IsBoolean, IsBooleanString, IsNotEmpty, IsOptional } from 'class-validator'; + +export class ServeFileDto { + //assetId + @IsNotEmpty() + aid: string; + + //deviceId + @IsNotEmpty() + did: string; + + @IsOptional() + @IsBooleanString() + isThumb: string; +} diff --git a/server/src/api-v1/asset/dto/update-asset.dto.ts b/server/src/api-v1/asset/dto/update-asset.dto.ts new file mode 100644 index 0000000000..891e14436b --- /dev/null +++ b/server/src/api-v1/asset/dto/update-asset.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateAssetDto } from './create-asset.dto'; + +export class UpdateAssetDto extends PartialType(CreateAssetDto) {} diff --git a/server/src/api-v1/asset/entities/asset.entity.ts b/server/src/api-v1/asset/entities/asset.entity.ts new file mode 100644 index 0000000000..97343004fa --- /dev/null +++ b/server/src/api-v1/asset/entities/asset.entity.ts @@ -0,0 +1,54 @@ +import { Column, Entity, PrimaryColumn, PrimaryGeneratedColumn, Unique } from 'typeorm'; + +@Entity('assets') +@Unique(['deviceAssetId', 'userId', 'deviceId']) +export class AssetEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + deviceAssetId: string; + + @Column() + userId: string; + + @Column() + deviceId: string; + + @Column() + type: AssetType; + + @Column() + originalPath: string; + + @Column({ nullable: true }) + resizePath: string; + + @Column() + createdAt: string; + + @Column() + modifiedAt: string; + + @Column({ type: 'boolean', default: false }) + isFavorite: boolean; + + @Column({ nullable: true }) + description: string; + + @Column({ nullable: true }) + lat: string; + + @Column({ nullable: true }) + lon: string; + + @Column({ nullable: true }) + mimeType: string; +} + +export enum AssetType { + IMAGE = 'IMAGE', + VIDEO = 'VIDEO', + AUDIO = 'AUDIO', + OTHER = 'OTHER', +} diff --git a/server/src/api-v1/auth/auth.controller.ts b/server/src/api-v1/auth/auth.controller.ts new file mode 100644 index 0000000000..9b68841d4d --- /dev/null +++ b/server/src/api-v1/auth/auth.controller.ts @@ -0,0 +1,29 @@ +import { Body, Controller, Post, UseGuards, ValidationPipe } from '@nestjs/common'; +import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; +import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; +import { AuthService } from './auth.service'; +import { LoginCredentialDto } from './dto/login-credential.dto'; +import { SignUpDto } from './dto/sign-up.dto'; + +@Controller('auth') +export class AuthController { + constructor(private readonly authService: AuthService) {} + + @Post('/login') + async login(@Body(ValidationPipe) loginCredential: LoginCredentialDto) { + return await this.authService.login(loginCredential); + } + + @Post('/signUp') + async signUp(@Body(ValidationPipe) signUpCrendential: SignUpDto) { + return await this.authService.signUp(signUpCrendential); + } + + @UseGuards(JwtAuthGuard) + @Post('/validateToken') + async validateToken(@GetAuthUser() authUser: AuthUserDto) { + return { + authStatus: true, + }; + } +} diff --git a/server/src/api-v1/auth/auth.module.ts b/server/src/api-v1/auth/auth.module.ts new file mode 100644 index 0000000000..f9b3eee066 --- /dev/null +++ b/server/src/api-v1/auth/auth.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { AuthController } from './auth.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { UserEntity } from '../user/entities/user.entity'; +import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; +import { ImmichJwtModule } from '../../modules/immich-jwt/immich-jwt.module'; +import { JwtModule } from '@nestjs/jwt'; +import { jwtConfig } from '../../config/jwt.config'; + +@Module({ + imports: [TypeOrmModule.forFeature([UserEntity]), ImmichJwtModule, JwtModule.register(jwtConfig)], + controllers: [AuthController], + providers: [AuthService, ImmichJwtService], +}) +export class AuthModule {} diff --git a/server/src/api-v1/auth/auth.service.ts b/server/src/api-v1/auth/auth.service.ts new file mode 100644 index 0000000000..40090e1834 --- /dev/null +++ b/server/src/api-v1/auth/auth.service.ts @@ -0,0 +1,84 @@ +import { BadRequestException, Injectable, InternalServerErrorException, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { UserEntity } from '../user/entities/user.entity'; +import { LoginCredentialDto } from './dto/login-credential.dto'; +import { ImmichJwtService } from '../../modules/immich-jwt/immich-jwt.service'; +import { JwtPayloadDto } from './dto/jwt-payload.dto'; +import { SignUpDto } from './dto/sign-up.dto'; +import * as bcrypt from 'bcrypt'; + +@Injectable() +export class AuthService { + constructor( + @InjectRepository(UserEntity) + private userRepository: Repository, + private immichJwtService: ImmichJwtService, + ) {} + + private async validateUser(loginCredential: LoginCredentialDto): Promise { + const user = await this.userRepository.findOne( + { email: loginCredential.email }, + { select: ['id', 'email', 'password', 'salt'] }, + ); + + const isAuthenticated = await this.validatePassword(user.password, loginCredential.password, user.salt); + + if (user && isAuthenticated) { + return user; + } + + return null; + } + + public async login(loginCredential: LoginCredentialDto) { + const validatedUser = await this.validateUser(loginCredential); + + if (!validatedUser) { + throw new BadRequestException('Incorrect email or password'); + } + + const payload = new JwtPayloadDto(validatedUser.id, validatedUser.email); + + return { + accessToken: await this.immichJwtService.generateToken(payload), + userId: validatedUser.id, + userEmail: validatedUser.email, + }; + } + + public async signUp(signUpCrendential: SignUpDto) { + const registerUser = await this.userRepository.findOne({ email: signUpCrendential.email }); + + if (registerUser) { + throw new BadRequestException('User exist'); + } + + const newUser = new UserEntity(); + newUser.email = signUpCrendential.email; + newUser.salt = await bcrypt.genSalt(); + newUser.password = await this.hashPassword(signUpCrendential.password, newUser.salt); + + try { + const savedUser = await this.userRepository.save(newUser); + + return { + id: savedUser.id, + email: savedUser.email, + createdAt: savedUser.createdAt, + }; + } catch (e) { + Logger.error('e', 'signUp'); + throw new InternalServerErrorException('Failed to register new user'); + } + } + + private async hashPassword(password: string, salt: string): Promise { + return bcrypt.hash(password, salt); + } + + private async validatePassword(hasedPassword: string, inputPassword: string, salt: string): Promise { + const hash = await bcrypt.hash(inputPassword, salt); + return hash === hasedPassword; + } +} diff --git a/server/src/api-v1/auth/dto/jwt-payload.dto.ts b/server/src/api-v1/auth/dto/jwt-payload.dto.ts new file mode 100644 index 0000000000..ccdfe762e0 --- /dev/null +++ b/server/src/api-v1/auth/dto/jwt-payload.dto.ts @@ -0,0 +1,9 @@ +export class JwtPayloadDto { + constructor(userId: string, email: string) { + this.userId = userId; + this.email = email; + } + + userId: string; + email: string; +} diff --git a/server/src/api-v1/auth/dto/login-credential.dto.ts b/server/src/api-v1/auth/dto/login-credential.dto.ts new file mode 100644 index 0000000000..9147967674 --- /dev/null +++ b/server/src/api-v1/auth/dto/login-credential.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class LoginCredentialDto { + @IsNotEmpty() + email: string; + + @IsNotEmpty() + password: string; +} diff --git a/server/src/api-v1/auth/dto/sign-up.dto.ts b/server/src/api-v1/auth/dto/sign-up.dto.ts new file mode 100644 index 0000000000..a506298278 --- /dev/null +++ b/server/src/api-v1/auth/dto/sign-up.dto.ts @@ -0,0 +1,9 @@ +import { IsNotEmpty } from 'class-validator'; + +export class SignUpDto { + @IsNotEmpty() + email: string; + + @IsNotEmpty() + password: string; +} diff --git a/server/src/api-v1/device-info/device-info.controller.ts b/server/src/api-v1/device-info/device-info.controller.ts new file mode 100644 index 0000000000..4f053c592b --- /dev/null +++ b/server/src/api-v1/device-info/device-info.controller.ts @@ -0,0 +1,22 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, ValidationPipe } from '@nestjs/common'; +import { AuthUserDto, GetAuthUser } from '../../decorators/auth-user.decorator'; +import { JwtAuthGuard } from '../../modules/immich-jwt/guards/jwt-auth.guard'; +import { DeviceInfoService } from './device-info.service'; +import { CreateDeviceInfoDto } from './dto/create-device-info.dto'; +import { UpdateDeviceInfoDto } from './dto/update-device-info.dto'; + +@UseGuards(JwtAuthGuard) +@Controller('device-info') +export class DeviceInfoController { + constructor(private readonly deviceInfoService: DeviceInfoService) {} + + @Post() + async create(@Body(ValidationPipe) createDeviceInfoDto: CreateDeviceInfoDto, @GetAuthUser() authUser: AuthUserDto) { + return await this.deviceInfoService.create(createDeviceInfoDto, authUser); + } + + @Patch() + async update(@Body(ValidationPipe) updateDeviceInfoDto: UpdateDeviceInfoDto, @GetAuthUser() authUser: AuthUserDto) { + return this.deviceInfoService.update(authUser.id, updateDeviceInfoDto); + } +} diff --git a/server/src/api-v1/device-info/device-info.module.ts b/server/src/api-v1/device-info/device-info.module.ts new file mode 100644 index 0000000000..61a30c3df3 --- /dev/null +++ b/server/src/api-v1/device-info/device-info.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { DeviceInfoService } from './device-info.service'; +import { DeviceInfoController } from './device-info.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DeviceInfoEntity } from './entities/device-info.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([DeviceInfoEntity])], + controllers: [DeviceInfoController], + providers: [DeviceInfoService], +}) +export class DeviceInfoModule {} diff --git a/server/src/api-v1/device-info/device-info.service.ts b/server/src/api-v1/device-info/device-info.service.ts new file mode 100644 index 0000000000..fa6270780c --- /dev/null +++ b/server/src/api-v1/device-info/device-info.service.ts @@ -0,0 +1,63 @@ +import { BadRequestException, HttpCode, Injectable, Logger, Res } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { AuthUserDto } from '../../decorators/auth-user.decorator'; +import { CreateDeviceInfoDto } from './dto/create-device-info.dto'; +import { UpdateDeviceInfoDto } from './dto/update-device-info.dto'; +import { DeviceInfoEntity } from './entities/device-info.entity'; + +@Injectable() +export class DeviceInfoService { + constructor( + @InjectRepository(DeviceInfoEntity) + private deviceRepository: Repository, + ) {} + + async create(createDeviceInfoDto: CreateDeviceInfoDto, authUser: AuthUserDto) { + const res = await this.deviceRepository.findOne({ + deviceId: createDeviceInfoDto.deviceId, + userId: authUser.id, + }); + + if (res) { + Logger.log('Device Info Exist', 'createDeviceInfo'); + return res; + } + + const deviceInfo = new DeviceInfoEntity(); + deviceInfo.deviceId = createDeviceInfoDto.deviceId; + deviceInfo.deviceType = createDeviceInfoDto.deviceType; + deviceInfo.userId = authUser.id; + + try { + return await this.deviceRepository.save(deviceInfo); + } catch (e) { + Logger.error('Error creating new device info', 'createDeviceInfo'); + } + } + + async update(userId: string, updateDeviceInfoDto: UpdateDeviceInfoDto) { + const deviceInfo = await this.deviceRepository.findOne({ + where: { deviceId: updateDeviceInfoDto.deviceId, userId: userId }, + }); + + if (!deviceInfo) { + throw new BadRequestException('Device Not Found'); + } + + const res = await this.deviceRepository.update( + { + id: deviceInfo.id, + }, + updateDeviceInfoDto, + ); + + if (res.affected == 1) { + return await this.deviceRepository.findOne({ + where: { deviceId: updateDeviceInfoDto.deviceId, userId: userId }, + }); + } else { + throw new BadRequestException('Bad Request'); + } + } +} diff --git a/server/src/api-v1/device-info/dto/create-device-info.dto.ts b/server/src/api-v1/device-info/dto/create-device-info.dto.ts new file mode 100644 index 0000000000..9f50e6eaf4 --- /dev/null +++ b/server/src/api-v1/device-info/dto/create-device-info.dto.ts @@ -0,0 +1,13 @@ +import { IsNotEmpty, IsOptional } from 'class-validator'; +import { DeviceType } from '../entities/device-info.entity'; + +export class CreateDeviceInfoDto { + @IsNotEmpty() + deviceId: string; + + @IsNotEmpty() + deviceType: DeviceType; + + @IsOptional() + isAutoBackup: boolean; +} diff --git a/server/src/api-v1/device-info/dto/update-device-info.dto.ts b/server/src/api-v1/device-info/dto/update-device-info.dto.ts new file mode 100644 index 0000000000..10efa928c4 --- /dev/null +++ b/server/src/api-v1/device-info/dto/update-device-info.dto.ts @@ -0,0 +1,6 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { IsOptional } from 'class-validator'; +import { DeviceType } from '../entities/device-info.entity'; +import { CreateDeviceInfoDto } from './create-device-info.dto'; + +export class UpdateDeviceInfoDto extends PartialType(CreateDeviceInfoDto) {} diff --git a/server/src/api-v1/device-info/entities/device-info.entity.ts b/server/src/api-v1/device-info/entities/device-info.entity.ts new file mode 100644 index 0000000000..e7d773fd9e --- /dev/null +++ b/server/src/api-v1/device-info/entities/device-info.entity.ts @@ -0,0 +1,32 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, Unique } from 'typeorm'; + +@Entity('device_info') +@Unique(['userId', 'deviceId']) +export class DeviceInfoEntity { + @PrimaryGeneratedColumn() + id: number; + + @Column() + userId: string; + + @Column() + deviceId: string; + + @Column() + deviceType: DeviceType; + + @Column({ nullable: true }) + notificationToken: string; + + @CreateDateColumn() + createdAt: string; + + @Column({ type: 'bool', default: false }) + isAutoBackup: boolean; +} + +export enum DeviceType { + IOS = 'IOS', + ANDROID = 'ANDROID', + WEB = 'WEB', +} diff --git a/server/src/api-v1/server-info/dto/server-info.dto.ts b/server/src/api-v1/server-info/dto/server-info.dto.ts new file mode 100644 index 0000000000..251126a188 --- /dev/null +++ b/server/src/api-v1/server-info/dto/server-info.dto.ts @@ -0,0 +1,9 @@ +export class ServerInfoDto { + diskSize: String; + diskUse: String; + diskAvailable: String; + diskSizeRaw: number; + diskUseRaw: number; + diskAvailableRaw: number; + diskUsagePercentage: number; +} diff --git a/server/src/api-v1/server-info/server-info.controller.ts b/server/src/api-v1/server-info/server-info.controller.ts new file mode 100644 index 0000000000..de6f9ece54 --- /dev/null +++ b/server/src/api-v1/server-info/server-info.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { ServerInfoService } from './server-info.service'; + +@Controller('server-info') +export class ServerInfoController { + constructor(private readonly serverInfoService: ServerInfoService) {} + + @Get() + async getServerInfo() { + return await this.serverInfoService.getServerInfo(); + } + + @Get('/ping') + async getServerPulse() { + return { + res: 'pong', + }; + } +} diff --git a/server/src/api-v1/server-info/server-info.module.ts b/server/src/api-v1/server-info/server-info.module.ts new file mode 100644 index 0000000000..feb31de018 --- /dev/null +++ b/server/src/api-v1/server-info/server-info.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ServerInfoService } from './server-info.service'; +import { ServerInfoController } from './server-info.controller'; + +@Module({ + controllers: [ServerInfoController], + providers: [ServerInfoService] +}) +export class ServerInfoModule {} diff --git a/server/src/api-v1/server-info/server-info.service.ts b/server/src/api-v1/server-info/server-info.service.ts new file mode 100644 index 0000000000..b5ae866139 --- /dev/null +++ b/server/src/api-v1/server-info/server-info.service.ts @@ -0,0 +1,54 @@ +import { Injectable } from '@nestjs/common'; +import systemInformation from 'systeminformation'; +import { ServerInfoDto } from './dto/server-info.dto'; + +@Injectable() +export class ServerInfoService { + constructor() {} + async getServerInfo() { + const res = await systemInformation.fsSize(); + + const size = res[0].size; + const used = res[0].used; + const available = res[0].available; + const percentageUsage = res[0].use; + + const serverInfo = new ServerInfoDto(); + serverInfo.diskAvailable = this.getHumanReadableString(available); + serverInfo.diskSize = this.getHumanReadableString(size); + serverInfo.diskUse = this.getHumanReadableString(used); + serverInfo.diskAvailableRaw = available; + serverInfo.diskSizeRaw = size; + serverInfo.diskUseRaw = used; + serverInfo.diskUsagePercentage = percentageUsage; + + return serverInfo; + } + + private getHumanReadableString(sizeInByte: number) { + const pepibyte = 1.126 * Math.pow(10, 15); + const tebibyte = 1.1 * Math.pow(10, 12); + const gibibyte = 1.074 * Math.pow(10, 9); + const mebibyte = 1.049 * Math.pow(10, 6); + const kibibyte = 1024; + // Pebibyte + if (sizeInByte >= pepibyte) { + // Pe + return `${(sizeInByte / pepibyte).toFixed(1)}PB`; + } else if (tebibyte <= sizeInByte && sizeInByte < pepibyte) { + // Te + return `${(sizeInByte / tebibyte).toFixed(1)}TB`; + } else if (gibibyte <= sizeInByte && sizeInByte < tebibyte) { + // Gi + return `${(sizeInByte / gibibyte).toFixed(1)}GB`; + } else if (mebibyte <= sizeInByte && sizeInByte < gibibyte) { + // Mega + return `${(sizeInByte / mebibyte).toFixed(1)}MB`; + } else if (kibibyte <= sizeInByte && sizeInByte < mebibyte) { + // Kibi + return `${(sizeInByte / kibibyte).toFixed(1)}KB`; + } else { + return `${sizeInByte}B`; + } + } +} diff --git a/server/src/api-v1/user/dto/create-user.dto.ts b/server/src/api-v1/user/dto/create-user.dto.ts new file mode 100644 index 0000000000..0311be1384 --- /dev/null +++ b/server/src/api-v1/user/dto/create-user.dto.ts @@ -0,0 +1 @@ +export class CreateUserDto {} diff --git a/server/src/api-v1/user/dto/update-user.dto.ts b/server/src/api-v1/user/dto/update-user.dto.ts new file mode 100644 index 0000000000..dfd37fb1ed --- /dev/null +++ b/server/src/api-v1/user/dto/update-user.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateUserDto } from './create-user.dto'; + +export class UpdateUserDto extends PartialType(CreateUserDto) {} diff --git a/server/src/api-v1/user/entities/user.entity.ts b/server/src/api-v1/user/entities/user.entity.ts new file mode 100644 index 0000000000..be9f56ed0b --- /dev/null +++ b/server/src/api-v1/user/entities/user.entity.ts @@ -0,0 +1,19 @@ +import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity('users') +export class UserEntity { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + email: string; + + @Column({ select: false }) + password: string; + + @Column({ select: false }) + salt: string; + + @CreateDateColumn() + createdAt: string; +} diff --git a/server/src/api-v1/user/user.controller.ts b/server/src/api-v1/user/user.controller.ts new file mode 100644 index 0000000000..995519cd3c --- /dev/null +++ b/server/src/api-v1/user/user.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { UserService } from './user.service'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; + +@Controller('user') +export class UserController { + constructor(private readonly userService: UserService) {} + + @Post() + create(@Body() createUserDto: CreateUserDto) { + return this.userService.create(createUserDto); + } + + @Get() + findAll() { + return this.userService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.userService.findOne(+id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updateUserDto: UpdateUserDto) { + return this.userService.update(+id, updateUserDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.userService.remove(+id); + } +} diff --git a/server/src/api-v1/user/user.module.ts b/server/src/api-v1/user/user.module.ts new file mode 100644 index 0000000000..b33ca4e9da --- /dev/null +++ b/server/src/api-v1/user/user.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { UserService } from './user.service'; +import { UserController } from './user.controller'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { UserEntity } from './entities/user.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([UserEntity])], + controllers: [UserController], + providers: [UserService], +}) +export class UserModule {} diff --git a/server/src/api-v1/user/user.service.ts b/server/src/api-v1/user/user.service.ts new file mode 100644 index 0000000000..a0ea72a1c1 --- /dev/null +++ b/server/src/api-v1/user/user.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; +import { CreateUserDto } from './dto/create-user.dto'; +import { UpdateUserDto } from './dto/update-user.dto'; +import { UserEntity } from './entities/user.entity'; + +@Injectable() +export class UserService { + constructor( + @InjectRepository(UserEntity) + private userRepository: Repository, + ) {} + + create(createUserDto: CreateUserDto) { + return 'This action adds a new user'; + } + + async findAll() { + try { + return 'welcome'; + // return await this.userRepository.find(); + // return await this.userRepository.query('select * from users'); + } catch (e) { + console.log(e); + } + // return 'helloworld'; + } + + findOne(id: number) { + return `This action returns a #${id} user`; + } + + update(id: number, updateUserDto: UpdateUserDto) { + return `This action updates a #${id} user`; + } + + remove(id: number) { + return `This action removes a #${id} user`; + } +} diff --git a/server/src/app.module.ts b/server/src/app.module.ts new file mode 100644 index 0000000000..ee00929d1e --- /dev/null +++ b/server/src/app.module.ts @@ -0,0 +1,49 @@ +import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { databaseConfig } from './config/database.config'; +import { UserModule } from './api-v1/user/user.module'; +import { AssetModule } from './api-v1/asset/asset.module'; +import { AuthModule } from './api-v1/auth/auth.module'; +import { ImmichJwtModule } from './modules/immich-jwt/immich-jwt.module'; +import { JwtModule } from '@nestjs/jwt'; +import { DeviceInfoModule } from './api-v1/device-info/device-info.module'; +import { AppLoggerMiddleware } from './middlewares/app-logger.middleware'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { immichAppConfig } from './config/app.config'; +import { BullModule } from '@nestjs/bull'; +import { ImageOptimizeModule } from './modules/image-optimize/image-optimize.module'; +import { ServerInfoModule } from './api-v1/server-info/server-info.module'; + +@Module({ + imports: [ + ConfigModule.forRoot(immichAppConfig), + TypeOrmModule.forRoot(databaseConfig), + UserModule, + AssetModule, + AuthModule, + ImmichJwtModule, + DeviceInfoModule, + BullModule.forRootAsync({ + imports: [ConfigModule], + useFactory: async (configService: ConfigService) => ({ + redis: { + host: configService.get('REDIS_HOST'), + port: configService.get('REDIS_PORT'), + password: configService.get('REDIS_PASSWORD'), + }, + }), + inject: [ConfigService], + }), + + ImageOptimizeModule, + + ServerInfoModule, + ], + controllers: [], + providers: [], +}) +export class AppModule implements NestModule { + configure(consumer: MiddlewareConsumer): void { + // consumer.apply(AppLoggerMiddleware).forRoutes('*'); + } +} diff --git a/server/src/config/app.config.ts b/server/src/config/app.config.ts new file mode 100644 index 0000000000..8a0f7f77ed --- /dev/null +++ b/server/src/config/app.config.ts @@ -0,0 +1,19 @@ +import { ConfigModuleOptions } from '@nestjs/config'; +import Joi from 'joi'; + +export const immichAppConfig: ConfigModuleOptions = { + envFilePath: '.env', + isGlobal: true, + validationSchema: Joi.object({ + NODE_ENV: Joi.string().required().valid('development', 'production', 'staging').default('development'), + DB_HOST: Joi.string().required(), + DB_USERNAME: Joi.string().required(), + DB_PASSWORD: Joi.string().required(), + DB_DATABASE: Joi.string().required(), + UPLOAD_LOCATION: Joi.string().required(), + JWT_SECRET: Joi.string().required(), + REDIS_HOST: Joi.string().required(), + REDIS_PORT: Joi.string().required(), + REDIS_PASSWORD: Joi.string().required(), + }), +}; diff --git a/server/src/config/database.config.ts b/server/src/config/database.config.ts new file mode 100644 index 0000000000..b9d1e5617c --- /dev/null +++ b/server/src/config/database.config.ts @@ -0,0 +1,27 @@ +import { TypeOrmModuleOptions } from '@nestjs/typeorm'; +import dotenv from 'dotenv'; + +const result = dotenv.config(); + +if (result.error) { + console.log(result.error); +} + +export const databaseConfig: TypeOrmModuleOptions = { + type: 'postgres', + host: process.env.DB_HOST, + port: 5432, + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + entities: [__dirname + '/../**/*.entity.{js,ts}'], + synchronize: true, + // logging: true, + // logger: 'advanced-console', + // ssl: process.env.NODE_ENV == 'production', + // extra: { + // ssl: { + // rejectUnauthorized: false, + // }, + // }, +}; diff --git a/server/src/config/jwt.config.ts b/server/src/config/jwt.config.ts new file mode 100644 index 0000000000..e595d0379c --- /dev/null +++ b/server/src/config/jwt.config.ts @@ -0,0 +1,7 @@ +import { JwtModuleOptions } from '@nestjs/jwt'; +import { jwtSecret } from '../constants/jwt.constant'; + +export const jwtConfig: JwtModuleOptions = { + secret: jwtSecret, + signOptions: { expiresIn: '36500d' }, +}; diff --git a/server/src/config/multer-option.config.ts b/server/src/config/multer-option.config.ts new file mode 100644 index 0000000000..7d6cd3652a --- /dev/null +++ b/server/src/config/multer-option.config.ts @@ -0,0 +1,38 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; +import { MulterOptions } from '@nestjs/platform-express/multer/interfaces/multer-options.interface'; +import { existsSync, mkdirSync } from 'fs'; +import { diskStorage } from 'multer'; +import { extname } from 'path'; +import { Request } from 'express'; + +export const multerConfig = { + dest: process.env.UPLOAD_LOCATION, +}; + +export const multerOption: MulterOptions = { + fileFilter: (req: Request, file: any, cb: any) => { + if (file.mimetype.match(/\/(jpg|jpeg|png|gif|mp4|x-msvideo|quicktime)$/)) { + cb(null, true); + } else { + cb(new HttpException(`Unsupported file type ${extname(file.originalname)}`, HttpStatus.BAD_REQUEST), false); + } + }, + + storage: diskStorage({ + destination: (req: Request, file: Express.Multer.File, cb: any) => { + const uploadPath = multerConfig.dest; + + const userPath = `${uploadPath}/${req.user['id']}/original/${req.body['deviceId']}`; + + if (!existsSync(userPath)) { + mkdirSync(userPath, { recursive: true }); + } + + cb(null, userPath); + }, + + filename: (req: Request, file: Express.Multer.File, cb: any) => { + cb(null, `${file.originalname}${req.body['fileExtension']}`); + }, + }), +}; diff --git a/server/src/constants/jwt.constant.ts b/server/src/constants/jwt.constant.ts new file mode 100644 index 0000000000..4e436b3b42 --- /dev/null +++ b/server/src/constants/jwt.constant.ts @@ -0,0 +1 @@ +export const jwtSecret = process.env.JWT_SECRET; diff --git a/server/src/decorators/auth-user.decorator.ts b/server/src/decorators/auth-user.decorator.ts new file mode 100644 index 0000000000..0a86168423 --- /dev/null +++ b/server/src/decorators/auth-user.decorator.ts @@ -0,0 +1,21 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { UserEntity } from '../api-v1/user/entities/user.entity'; +// import { AuthUserDto } from './dto/auth-user.dto'; + +export class AuthUserDto { + id: string; + email: string; +} + +export const GetAuthUser = createParamDecorator((data, ctx: ExecutionContext): AuthUserDto => { + const req = ctx.switchToHttp().getRequest(); + + const { id, email } = req.user as UserEntity; + + const authUser: any = { + id: id.toString(), + email, + }; + + return authUser; +}); diff --git a/server/src/main.ts b/server/src/main.ts new file mode 100644 index 0000000000..e82e03ac1d --- /dev/null +++ b/server/src/main.ts @@ -0,0 +1,11 @@ +import { NestFactory } from '@nestjs/core'; +import { NestExpressApplication } from '@nestjs/platform-express'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + + app.set('trust proxy'); + await app.listen(3000); +} +bootstrap(); diff --git a/server/src/middlewares/app-logger.middleware.ts b/server/src/middlewares/app-logger.middleware.ts new file mode 100644 index 0000000000..b1e1d056dc --- /dev/null +++ b/server/src/middlewares/app-logger.middleware.ts @@ -0,0 +1,22 @@ +import { Injectable, NestMiddleware, Logger } from '@nestjs/common'; + +import { Request, Response, NextFunction } from 'express'; + +@Injectable() +export class AppLoggerMiddleware implements NestMiddleware { + private logger = new Logger('HTTP'); + + use(request: Request, response: Response, next: NextFunction): void { + const { ip, method, path: url, baseUrl } = request; + const userAgent = request.get('user-agent') || ''; + + response.on('close', () => { + const { statusCode } = response; + const contentLength = response.get('content-length'); + + this.logger.log(`${method} ${baseUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`); + }); + + next(); + } +} diff --git a/server/src/modules/image-optimize/image-optimize.module.ts b/server/src/modules/image-optimize/image-optimize.module.ts new file mode 100644 index 0000000000..2b0222ec7f --- /dev/null +++ b/server/src/modules/image-optimize/image-optimize.module.ts @@ -0,0 +1,36 @@ +import { BullModule } from '@nestjs/bull'; +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { join } from 'path'; +import { AssetModule } from '../../api-v1/asset/asset.module'; +import { AssetService } from '../../api-v1/asset/asset.service'; +import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; +import { ImageOptimizeProcessor } from './image-optimize.processor'; +import { ImageOptimizeService } from './image-optimize.service'; +import { MachineLearningProcessor } from './machine-learning.processor'; + +@Module({ + imports: [ + BullModule.registerQueue({ + name: 'image', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + BullModule.registerQueue({ + name: 'machine-learning', + defaultJobOptions: { + attempts: 3, + removeOnComplete: true, + removeOnFail: false, + }, + }), + + TypeOrmModule.forFeature([AssetEntity]), + ], + providers: [ImageOptimizeService, ImageOptimizeProcessor, MachineLearningProcessor], + exports: [ImageOptimizeService], +}) +export class ImageOptimizeModule {} diff --git a/server/src/modules/image-optimize/image-optimize.processor.ts b/server/src/modules/image-optimize/image-optimize.processor.ts new file mode 100644 index 0000000000..b67a3044cd --- /dev/null +++ b/server/src/modules/image-optimize/image-optimize.processor.ts @@ -0,0 +1,60 @@ +import { InjectQueue, Process, Processor } from '@nestjs/bull'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Job, Queue } from 'bull'; +import { Repository } from 'typeorm'; +import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; +import sharp from 'sharp'; +import fs, { existsSync, mkdirSync } from 'fs'; +import { ConfigService } from '@nestjs/config'; +import { randomUUID } from 'crypto'; + +@Processor('image') +export class ImageOptimizeProcessor { + constructor( + @InjectRepository(AssetEntity) private assetRepository: Repository, + @InjectQueue('machine-learning') private machineLearningQueue: Queue, + private configService: ConfigService, + ) {} + + @Process('optimize') + async handleOptimization(job: Job) { + const { savedAsset }: { savedAsset: AssetEntity } = job.data; + + const basePath = this.configService.get('UPLOAD_LOCATION'); + const resizePath = savedAsset.originalPath.replace('/original/', '/thumb/'); + + // Create folder for thumb image if not exist + + const resizeDir = `${basePath}/${savedAsset.userId}/thumb/${savedAsset.deviceId}`; + + if (!existsSync(resizeDir)) { + mkdirSync(resizeDir, { recursive: true }); + } + + fs.readFile(savedAsset.originalPath, (err, data) => { + if (err) { + console.error('Error Reading File'); + } + + sharp(data) + .resize(512, 512, { fit: 'outside' }) + .toFile(resizePath, async (err, info) => { + if (err) { + console.error('Error resizing file ', err); + } + + await this.assetRepository.update(savedAsset, { resizePath: resizePath }); + + const jobb = await this.machineLearningQueue.add( + 'object-detection', + { + resizePath, + }, + { jobId: randomUUID() }, + ); + }); + }); + + return 'ok'; + } +} diff --git a/server/src/modules/image-optimize/image-optimize.service.ts b/server/src/modules/image-optimize/image-optimize.service.ts new file mode 100644 index 0000000000..bd8133f163 --- /dev/null +++ b/server/src/modules/image-optimize/image-optimize.service.ts @@ -0,0 +1,29 @@ +import { InjectQueue } from '@nestjs/bull'; +import { Injectable } from '@nestjs/common'; +import { Queue } from 'bull'; +import { randomUUID } from 'crypto'; +import { join } from 'path'; +import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; +import { AuthUserDto } from '../../decorators/auth-user.decorator'; + +@Injectable() +export class ImageOptimizeService { + constructor( + @InjectQueue('image') private imageQueue: Queue, + @InjectQueue('machine-learning') private machineLearningQueue: Queue, + ) {} + + public async resizeImage(savedAsset: AssetEntity) { + const job = await this.imageQueue.add( + 'optimize', + { + savedAsset, + }, + { jobId: randomUUID() }, + ); + + return { + jobId: job.id, + }; + } +} diff --git a/server/src/modules/image-optimize/machine-learning.processor.ts b/server/src/modules/image-optimize/machine-learning.processor.ts new file mode 100644 index 0000000000..d987370aff --- /dev/null +++ b/server/src/modules/image-optimize/machine-learning.processor.ts @@ -0,0 +1,39 @@ +import { Process, Processor } from '@nestjs/bull'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Job } from 'bull'; +import { Repository } from 'typeorm'; +import { AssetEntity } from '../../api-v1/asset/entities/asset.entity'; +import sharp from 'sharp'; +import fs, { existsSync, mkdirSync } from 'fs'; +import { ConfigService } from '@nestjs/config'; +import * as tfnode from '@tensorflow/tfjs-node'; +import * as cocoSsd from '@tensorflow-models/coco-ssd'; + +@Processor('machine-learning') +export class MachineLearningProcessor { + constructor( + @InjectRepository(AssetEntity) private assetRepository: Repository, + private configService: ConfigService, + ) {} + + @Process('object-detection') + async handleOptimization(job: Job) { + try { + const { resizePath }: { resizePath: string } = job.data; + + const image = fs.readFileSync(resizePath); + const decodedImage = tfnode.node.decodeImage(image, 3) as tfnode.Tensor3D; + const model = await cocoSsd.load(); + const predictions = await model.detect(decodedImage); + console.log('start predictions ------------------ '); + for (var result of predictions) { + console.log(`Found ${result.class} with score ${result.score}`); + } + console.log('end predictions ------------------ '); + + return 'ok'; + } catch (e) { + console.log('Error object detection ', e); + } + } +} diff --git a/server/src/modules/immich-jwt/guards/jwt-auth.guard.ts b/server/src/modules/immich-jwt/guards/jwt-auth.guard.ts new file mode 100644 index 0000000000..2155290ede --- /dev/null +++ b/server/src/modules/immich-jwt/guards/jwt-auth.guard.ts @@ -0,0 +1,5 @@ +import { Injectable } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; + +@Injectable() +export class JwtAuthGuard extends AuthGuard('jwt') {} diff --git a/server/src/modules/immich-jwt/immich-jwt.module.ts b/server/src/modules/immich-jwt/immich-jwt.module.ts new file mode 100644 index 0000000000..5008613832 --- /dev/null +++ b/server/src/modules/immich-jwt/immich-jwt.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { ImmichJwtService } from './immich-jwt.service'; +import { JwtModule } from '@nestjs/jwt'; +import { jwtConfig } from '../../config/jwt.config'; +import { JwtStrategy } from './strategies/jwt.strategy'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { UserEntity } from '../../api-v1/user/entities/user.entity'; + +@Module({ + imports: [JwtModule.register(jwtConfig), TypeOrmModule.forFeature([UserEntity])], + providers: [ImmichJwtService, JwtStrategy], + exports: [ImmichJwtService], +}) +export class ImmichJwtModule {} diff --git a/server/src/modules/immich-jwt/immich-jwt.service.ts b/server/src/modules/immich-jwt/immich-jwt.service.ts new file mode 100644 index 0000000000..8d43233be1 --- /dev/null +++ b/server/src/modules/immich-jwt/immich-jwt.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { JwtService } from '@nestjs/jwt'; +import { JwtPayloadDto } from '../../api-v1/auth/dto/jwt-payload.dto'; + +@Injectable() +export class ImmichJwtService { + constructor(private jwtService: JwtService) {} + + public async generateToken(payload: JwtPayloadDto) { + return this.jwtService.sign({ + ...payload, + }); + } +} diff --git a/server/src/modules/immich-jwt/strategies/jwt.strategy.ts b/server/src/modules/immich-jwt/strategies/jwt.strategy.ts new file mode 100644 index 0000000000..d4cabe897c --- /dev/null +++ b/server/src/modules/immich-jwt/strategies/jwt.strategy.ts @@ -0,0 +1,33 @@ +import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { PassportStrategy } from '@nestjs/passport'; +import { InjectRepository } from '@nestjs/typeorm'; +import { ExtractJwt, Strategy } from 'passport-jwt'; +import { Repository } from 'typeorm'; +import { JwtPayloadDto } from '../../../api-v1/auth/dto/jwt-payload.dto'; +import { UserEntity } from '../../../api-v1/user/entities/user.entity'; +import { jwtSecret } from '../../../constants/jwt.constant'; + +@Injectable() +export class JwtStrategy extends PassportStrategy(Strategy, 'jwt') { + constructor( + @InjectRepository(UserEntity) + private usersRepository: Repository, + ) { + super({ + jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), + ignoreExpiration: false, + secretOrKey: jwtSecret, + }); + } + + async validate(payload: JwtPayloadDto) { + const { userId } = payload; + const user = await this.usersRepository.findOne({ id: userId }); + + if (!user) { + throw new UnauthorizedException('Failure to validate JWT payload'); + } + + return user; + } +} diff --git a/server/test/app.e2e-spec.ts b/server/test/app.e2e-spec.ts new file mode 100644 index 0000000000..50cda62332 --- /dev/null +++ b/server/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { AppModule } from './../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/server/test/jest-e2e.json b/server/test/jest-e2e.json new file mode 100644 index 0000000000..e9d912f3e3 --- /dev/null +++ b/server/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/server/tsconfig.build.json b/server/tsconfig.build.json new file mode 100644 index 0000000000..64f86c6bd2 --- /dev/null +++ b/server/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000000..b9c6829156 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es2017", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "skipLibCheck": true, + "esModuleInterop": true, + }, + "exclude": [ + "upload" + ], + "include": [ + "src" + ] +} \ No newline at end of file diff --git a/server/yarn.lock b/server/yarn.lock new file mode 100644 index 0000000000..da2a6922ae --- /dev/null +++ b/server/yarn.lock @@ -0,0 +1,6625 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular-devkit/core@13.0.2": + version "13.0.2" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.2.tgz" + integrity sha512-I4co4GH+iu0tns+UXfMtjJISO+cLpaUuiEH6kf0wF5cqjaIeluA9UjIRnxuNbdTW8iE2xVj/UWhQfHe/Ncp76w== + dependencies: + ajv "8.6.3" + ajv-formats "2.1.1" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/core@13.1.2": + version "13.1.2" + resolved "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.2.tgz" + integrity sha512-uXVesIRiCL/Nv+RSV8JM4j8IoZiGCGnqV2FOJ1hvH7DPxIjhjPMdG/B54xMydZpeASW3ofuxeORyAXxFIBm8Zg== + dependencies: + ajv "8.8.2" + ajv-formats "2.1.1" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/schematics-cli@13.1.2": + version "13.1.2" + resolved "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-13.1.2.tgz" + integrity sha512-XSkcVuaaajijQOWE8YerY/8DVuYQWvXxVukweEwkaHSftDQZhfCOZ83nGKbuWkdOdnuDbrc9ve5ZzekplkzVQw== + dependencies: + "@angular-devkit/core" "13.1.2" + "@angular-devkit/schematics" "13.1.2" + ansi-colors "4.1.1" + inquirer "8.2.0" + minimist "1.2.5" + symbol-observable "4.0.0" + +"@angular-devkit/schematics@13.0.2": + version "13.0.2" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.2.tgz" + integrity sha512-qrTe1teQptgP8gmVy6QX0T4dNfnNipEv+cM2cr7JXOmkPpwF+6oBDrTRIJ55t6rziqrXHJ3rxjKm1aHAxFrIEQ== + dependencies: + "@angular-devkit/core" "13.0.2" + jsonc-parser "3.0.0" + magic-string "0.25.7" + ora "5.4.1" + rxjs "6.6.7" + +"@angular-devkit/schematics@13.1.2": + version "13.1.2" + resolved "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.2.tgz" + integrity sha512-ayYbHGU8QpMGx8ZyhKOBupz+Zfv/2H1pNQErahYV3qg7hA9hfjTGmNmDQ4iw0fiT04NajjUxuomlKsCsg7oXDw== + dependencies: + "@angular-devkit/core" "13.1.2" + jsonc-parser "3.0.0" + magic-string "0.25.7" + ora "5.4.1" + rxjs "6.6.7" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.16.4": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.16.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@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.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@^7.16.8", "@babel/generator@^7.7.2": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== + dependencies: + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + 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== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.16.7": + 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== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + 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-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7": + version "7.16.12" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.7.2": + version "7.16.10" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.16.8" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.2.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@fastify/ajv-compiler@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz" + integrity sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg== + dependencies: + ajv "^6.12.6" + +"@hapi/hoek@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.1.tgz#9551142a1980503752536b5050fd99f4a7f13b17" + integrity sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.4.6.tgz" + integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA== + dependencies: + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.4.6" + jest-util "^27.4.2" + slash "^3.0.0" + +"@jest/core@^27.4.7": + version "27.4.7" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.4.7.tgz" + integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg== + dependencies: + "@jest/console" "^27.4.6" + "@jest/reporters" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^27.4.2" + jest-config "^27.4.7" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-resolve-dependencies "^27.4.6" + jest-runner "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + jest-watcher "^27.4.6" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.4.6.tgz" + integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg== + dependencies: + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + jest-mock "^27.4.6" + +"@jest/fake-timers@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.4.6.tgz" + integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A== + dependencies: + "@jest/types" "^27.4.2" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-util "^27.4.2" + +"@jest/globals@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.4.6.tgz" + integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/types" "^27.4.2" + expect "^27.4.6" + +"@jest/reporters@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.4.6.tgz" + integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.4.6" + jest-resolve "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/source-map@^27.4.0": + version "27.4.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.4.0.tgz" + integrity sha512-Ntjx9jzP26Bvhbm93z/AKcPRj/9wrkI88/gK60glXDx1q+IeI0rf7Lw2c89Ch6ofonB0On/iRDreQuQ6te9pgQ== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.4.6.tgz" + integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ== + dependencies: + "@jest/console" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz" + integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw== + dependencies: + "@jest/test-result" "^27.4.6" + graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" + jest-runtime "^27.4.6" + +"@jest/transform@^27.4.6": + version "27.4.6" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.4.6.tgz" + integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.4.2" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" + jest-regex-util "^27.4.0" + jest-util "^27.4.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.4.2": + version "27.4.2" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.4.2.tgz" + integrity sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@mapbox/node-pre-gyp@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.4.tgz#6c76e7a40138eac39e1a4dc869a083e43e236c00" + integrity sha512-M669Qo4nRT7iDmQEjQYC7RU8Z6dpz9UmSbkJ1OFEja3uevCdLKh7IZZki7L1TZj02kRyl82snXFY8QqkyfowrQ== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.1" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.4" + tar "^6.1.0" + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz#32abc8a5c624bc4e46c43d84dfb8b26d33a96f58" + integrity sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg== + dependencies: + detect-libc "^1.0.3" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.5" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@nestjs/bull@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@nestjs/bull/-/bull-0.4.2.tgz#d6b76eaff626f5a3c34048bdc75b597753df059f" + integrity sha512-HYRMbgqoUIpGplXN8kaZ23E/yHn6TRrQ297ILRqaHTxBp4vO+XNLfL1qUmJ4Z6weufsNKGg0xcX4dSC5AhXV9g== + +"@nestjs/cli@^8.0.0": + version "8.2.0" + resolved "https://registry.npmjs.org/@nestjs/cli/-/cli-8.2.0.tgz" + integrity sha512-f5grQOgrRcfHfOUP94OWsMdVYy6bit0zRSxPZ5+tfsFWkiPWdcx5Ba2M2socTykkiNHruXBu07lYvcKh94do7Q== + dependencies: + "@angular-devkit/core" "13.1.2" + "@angular-devkit/schematics" "13.1.2" + "@angular-devkit/schematics-cli" "13.1.2" + "@nestjs/schematics" "^8.0.3" + chalk "3.0.0" + chokidar "3.5.2" + cli-table3 "0.6.1" + commander "4.1.1" + fork-ts-checker-webpack-plugin "6.5.0" + inquirer "7.3.3" + node-emoji "1.11.0" + ora "5.4.1" + os-name "4.0.1" + rimraf "3.0.2" + shelljs "0.8.5" + source-map-support "0.5.21" + tree-kill "1.2.2" + tsconfig-paths "3.12.0" + tsconfig-paths-webpack-plugin "3.5.2" + typescript "4.5.4" + webpack "5.66.0" + webpack-node-externals "3.0.0" + +"@nestjs/common@^8.0.0": + version "8.2.6" + resolved "https://registry.npmjs.org/@nestjs/common/-/common-8.2.6.tgz" + integrity sha512-flLYSXunxcKyjbYddrhwbc49uE705MxBt85rS3mHyhDbAIPSGGeZEqME44YyAzCg1NTfJSNe7ztmOce5kNkb9A== + dependencies: + axios "0.24.0" + iterare "1.2.1" + tslib "2.3.1" + uuid "8.3.2" + +"@nestjs/config@^1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-1.1.6.tgz#bbb3578f052d9ef9d13ed5071870ff1bfcfcae7c" + integrity sha512-HYizKt6Dr6gcZl8FmZbTfQxP0MG8oXMh+gVFT0XCwYDAq26BOKyhPsIxrKsryicVeKViRgetCUhlJY9EqaekZA== + dependencies: + dotenv "10.0.0" + dotenv-expand "5.1.0" + lodash "4.17.21" + uuid "8.3.2" + +"@nestjs/core@^8.0.0": + version "8.2.6" + resolved "https://registry.npmjs.org/@nestjs/core/-/core-8.2.6.tgz" + integrity sha512-NwPcEIMmCsucs3QaDlQvkoU1FlFM2wm/WjaqLQhkSoIEmAR1gNtBo88f5io5cpMwCo1k5xYhqGlaSl6TfngwWQ== + dependencies: + "@nuxtjs/opencollective" "0.3.2" + fast-safe-stringify "2.1.1" + iterare "1.2.1" + object-hash "2.2.0" + path-to-regexp "3.2.0" + tslib "2.3.1" + uuid "8.3.2" + +"@nestjs/jwt@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nestjs/jwt/-/jwt-8.0.0.tgz#6c811c17634252dd1dcd5dabf409dbd692b812da" + integrity sha512-fz2LQgYY2zmuD8S+8UE215anwKyXlnB/1FwJQLVR47clNfMeFMK8WCxmn6xdPhF5JKuV1crO6FVabb1qWzDxqQ== + dependencies: + "@types/jsonwebtoken" "8.5.4" + jsonwebtoken "8.5.1" + +"@nestjs/mapped-types@*": + version "1.0.1" + resolved "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-1.0.1.tgz" + integrity sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg== + +"@nestjs/passport@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-8.1.0.tgz#ba3b28803666bf2afc644f82979585a886f353ed" + integrity sha512-IJ0AumoIWPzzki8d1TixTLcWJiNhJxzpn9ejAYA0TaKsC2B1zyg58WotTU3U/perCOiiAgjpvTB4vA/7L8K9Mg== + +"@nestjs/platform-express@^8.0.0": + version "8.2.6" + resolved "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-8.2.6.tgz" + integrity sha512-wbPqXrLdeokfMCHkWBHgFobCVL4OKRAOJIFGNlT/3u4JIJndoGBIuSDQohhY2o7Ue0JIYqKw+PyXiN4y/iUEng== + dependencies: + body-parser "1.19.1" + cors "2.8.5" + express "4.17.2" + multer "1.4.4" + tslib "2.3.1" + +"@nestjs/platform-fastify@^8.2.6": + version "8.2.6" + resolved "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-8.2.6.tgz" + integrity sha512-ZvMzqvOm2yEDymw/v1qgrNWGLr429lqOTYc777SnDleK4m1XGItdRAm7Y9as0fiztOWvBpaeF7Bq04hbuZeebA== + dependencies: + fastify "3.27.0" + fastify-cors "6.0.2" + fastify-formbody "5.2.0" + light-my-request "4.7.0" + middie "5.3.0" + path-to-regexp "3.2.0" + tslib "2.3.1" + +"@nestjs/schematics@^8.0.0", "@nestjs/schematics@^8.0.3": + version "8.0.5" + resolved "https://registry.npmjs.org/@nestjs/schematics/-/schematics-8.0.5.tgz" + integrity sha512-nK1hWQeLNbdhsiJDX/XJXLqq7nC6/xxC8CN+seFTQmly+H3gG2xaFnl6JPHURumuQaYJX8JEpC8m0+4tz+wvOg== + dependencies: + "@angular-devkit/core" "13.0.2" + "@angular-devkit/schematics" "13.0.2" + fs-extra "10.0.0" + jsonc-parser "3.0.0" + pluralize "8.0.0" + +"@nestjs/testing@^8.0.0": + version "8.2.6" + resolved "https://registry.npmjs.org/@nestjs/testing/-/testing-8.2.6.tgz" + integrity sha512-Cg8tM7yxlLDBO+CTNjk6X/UkxGRsprFc8gDHGEGesiE9wLErxNnslFugfUnYWJaSzmLZSqcFFig7mThc8VSxrw== + dependencies: + optional "0.1.4" + tslib "2.3.1" + +"@nestjs/typeorm@^8.0.3": + version "8.0.3" + resolved "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-8.0.3.tgz" + integrity sha512-tf9rTXP6LeFInkwd+tktQhtLRsKp4RRYImprqT8gcHcJDx+xMP1IygnXELOKwF5vo2/mnhrGtBlRQ/iiS6170g== + dependencies: + uuid "8.3.2" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nuxtjs/opencollective@0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz" + integrity sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA== + dependencies: + chalk "^4.1.0" + consola "^2.15.0" + node-fetch "^2.6.1" + +"@sideway/address@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.3.tgz#d93cce5d45c5daec92ad76db492cc2ee3c64ab27" + integrity sha512-8ncEUtmnTsMmL7z1YPB47kPUq7LpKWJNFPsRzHiIajGC5uXlWGn+AmkYPcHNl8S4tcEGx+cnORnNYaw2wvL+LQ== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" + integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sqltools/formatter@^1.2.2": + version "1.2.3" + resolved "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz" + integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== + +"@tensorflow-models/coco-ssd@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@tensorflow-models/coco-ssd/-/coco-ssd-2.2.2.tgz#2a308b3b11a106bf640c5245b980c79df8208b60" + integrity sha512-Jey2JscmKEValcFZH2ZLz14s8KPRmVtfJ0d0M3dPhvBp9dJiGNanVXr/pJAY5OS7emKj9uSciGhdkHWXY9Hovw== + +"@tensorflow/tfjs-backend-cpu@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-3.13.0.tgz#2a141256fe0a5de0670c31a9ba6990465708dee4" + integrity sha512-POmzUoAP8HooYYTZ72O1ZYkpVZB0f+8PeAkbTxIG0oahcJccj6a0Vovp1A6xWKfljUoPlJb3jWVC++S603ZL8w== + dependencies: + "@types/seedrandom" "2.4.27" + seedrandom "2.4.3" + +"@tensorflow/tfjs-backend-webgl@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-3.13.0.tgz#f99df51253de21e20dae195991d332195ab30b4b" + integrity sha512-ZuJS11tCoZx2F1Eq7wqiqu8euJpPW/JV0qOKBehlRpV2qQrR+wHMpBT1hhDl4qU4LdgFTtSggKIRg/L8b0ScUQ== + dependencies: + "@tensorflow/tfjs-backend-cpu" "3.13.0" + "@types/offscreencanvas" "~2019.3.0" + "@types/seedrandom" "2.4.27" + "@types/webgl-ext" "0.0.30" + "@types/webgl2" "0.0.6" + seedrandom "2.4.3" + +"@tensorflow/tfjs-converter@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-converter/-/tfjs-converter-3.13.0.tgz#3affc86d94c3948b01673a91309a35feb10e5eac" + integrity sha512-H2VpDTv9Ve0HBt7ttzz46DmnsPaiT0B+yJjVH3NebGZbgY9C8boBgJIsdyqfiqEWBS3WxF8h4rh58Hv5XXMgaQ== + +"@tensorflow/tfjs-core@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-core/-/tfjs-core-3.13.0.tgz#0cfd707c668250969564991c5c101fb52e51e1aa" + integrity sha512-18qBEVIB/4u2OUK9nA5P1XT3e3LyarElD1UKNSNDpnMLxhLTUVZaCR71eHJcpl9wP2Q0cciaTJCTpJdPv1tNDQ== + dependencies: + "@types/long" "^4.0.1" + "@types/offscreencanvas" "~2019.3.0" + "@types/seedrandom" "2.4.27" + "@types/webgl-ext" "0.0.30" + long "4.0.0" + node-fetch "~2.6.1" + seedrandom "2.4.3" + +"@tensorflow/tfjs-data@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-data/-/tfjs-data-3.13.0.tgz#55ae81957b7ed51cb0ce4e82edc63c5b3de152e6" + integrity sha512-n50+lxPK0CU72nlFt4dzMCCNV44CQsQU3sSP9zdR2bYHeoFqjjy1ISp+UV5N5DNLj7bsEMs73kGS1EuJ7YcdqQ== + dependencies: + "@types/node-fetch" "^2.1.2" + node-fetch "~2.6.1" + +"@tensorflow/tfjs-layers@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-layers/-/tfjs-layers-3.13.0.tgz#bc311664eba4f46802ffe3b05bea7df795cae10d" + integrity sha512-kTWJ/+9fbNCMDA9iQjDMYHmWivsiWz8CKNSOZdeCW7tiBwF1EiREBVQXMk1JI11ngQa8f+rYSLs7rkhp3SYl5Q== + +"@tensorflow/tfjs-node@^3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs-node/-/tfjs-node-3.13.0.tgz#cb5270efd171d8893654f7037bc308cba2912ef8" + integrity sha512-LYM3ck/TyipxMFD23moX9qC3F23UBC3zbiw85HTxZ9FPlE1QNLP1UNlfFGeUTnPvY6CUcvPyQsrG9fBTvtwB1A== + dependencies: + "@mapbox/node-pre-gyp" "1.0.4" + "@tensorflow/tfjs" "3.13.0" + adm-zip "^0.5.2" + google-protobuf "^3.9.2" + https-proxy-agent "^2.2.1" + progress "^2.0.0" + rimraf "^2.6.2" + tar "^4.4.6" + +"@tensorflow/tfjs@3.13.0": + version "3.13.0" + resolved "https://registry.yarnpkg.com/@tensorflow/tfjs/-/tfjs-3.13.0.tgz#ea0597e0208d403278e2ccbaa5faa479083a04d3" + integrity sha512-B5HvNH+6hHhQQkn+AG+u4j5sxZBMYdsq4IWXlBZzioJcVygtZhBWXkxp01boSwngjqUBgi8S2DopBE7McAUKqQ== + dependencies: + "@tensorflow/tfjs-backend-cpu" "3.13.0" + "@tensorflow/tfjs-backend-webgl" "3.13.0" + "@tensorflow/tfjs-converter" "3.13.0" + "@tensorflow/tfjs-core" "3.13.0" + "@tensorflow/tfjs-data" "3.13.0" + "@tensorflow/tfjs-layers" "3.13.0" + argparse "^1.0.10" + chalk "^4.1.0" + core-js "3" + regenerator-runtime "^0.13.5" + yargs "^16.0.3" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": + version "7.1.18" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.14.2" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== + dependencies: + "@babel/types" "^7.3.0" + +"@types/bcrypt@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-5.0.0.tgz#a835afa2882d165aff5690893db314eaa98b9f20" + integrity sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bull@^3.15.7": + version "3.15.7" + resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.15.7.tgz#a9d7fb332cc02dc021d0eb234b9604b356e9e6de" + integrity sha512-7NC7XN5NoS0A+leJ/dR69ZfKaegOlCZaii/xGgKnCyh1UYisRncibImb7VMwrc3OdJcbDJt6+4om70TeNl3J7g== + dependencies: + "@types/ioredis" "*" + "@types/redis" "^2.8.0" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/cookiejar@*": + version "2.1.2" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz" + integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog== + +"@types/eslint-scope@^3.7.0": + version "3.7.3" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@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== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + +"@types/express-serve-static-core@^4.17.18": + 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== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.5" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/imagemin@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@types/imagemin/-/imagemin-8.0.0.tgz#bf5bbe1feff3b112c7e0de06d024712ad261e033" + integrity sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A== + dependencies: + "@types/node" "*" + +"@types/ioredis@*": + version "4.28.7" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.28.7.tgz#ee79987ef80597ba8c17cfbf9345859ff9233c2d" + integrity sha512-jnSGCD2/TPk02j6v6CGqaCEl0LbmLgK6jUuk/AFaSNUBV+SCHiG7E7fnwJreN6hw9GqtLAFkJs4zFbkJrz11mQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@27.0.2": + version "27.0.2" + resolved "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz" + integrity sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA== + dependencies: + jest-diff "^27.0.0" + pretty-format "^27.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/jsonwebtoken@*": + version "8.5.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.8.tgz#01b39711eb844777b7af1d1f2b4cf22fda1c0c44" + integrity sha512-zm6xBQpFDIDM6o9r6HSgDeIcLy82TKWctCXEPbJJcXb5AKmi5BNNdLXneixK4lplX3PqIVcwLBCGE/kAGnlD4A== + dependencies: + "@types/node" "*" + +"@types/jsonwebtoken@8.5.4": + version "8.5.4" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz#50ccaf0aa6f5d7b9956e70fe323b76e582991913" + integrity sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.178": + version "4.14.178" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" + integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== + +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/multer@^1.4.7": + version "1.4.7" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.7.tgz#89cf03547c28c7bbcc726f029e2a76a7232cc79e" + integrity sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA== + dependencies: + "@types/express" "*" + +"@types/node-fetch@^2.1.2": + version "2.5.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*", "@types/node@^16.0.0": + version "16.11.21" + resolved "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz" + integrity sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A== + +"@types/offscreencanvas@~2019.3.0": + version "2019.3.0" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz#3336428ec7e9180cf4566dfea5da04eb586a6553" + integrity sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/passport-jwt@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/passport-jwt/-/passport-jwt-3.0.6.tgz#41cc8b5803d5f5f06eb33e19c453b42716def4f1" + integrity sha512-cmAAMIRTaEwpqxlrZyiEY9kdibk94gP5KTF8AT1Ra4rWNZYHNMreqhKUEeC5WJtuN5SJZjPQmV+XO2P5PlnvNQ== + dependencies: + "@types/express" "*" + "@types/jsonwebtoken" "*" + "@types/passport-strategy" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.7.tgz#85892f14932168158c86aecafd06b12f5439467a" + integrity sha512-JtswU8N3kxBYgo+n9of7C97YQBT+AYPP2aBfNGTzABqPAZnK/WOAaKfh3XesUYMZRrXFuoPc2Hv0/G/nQFveHw== + dependencies: + "@types/express" "*" + +"@types/prettier@^2.1.5": + version "2.4.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz" + integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w== + +"@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== + +"@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== + +"@types/redis@^2.8.0": + version "2.8.32" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.32.tgz#1d3430219afbee10f8cfa389dad2571a05ecfb11" + integrity sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w== + dependencies: + "@types/node" "*" + +"@types/seedrandom@2.4.27": + version "2.4.27" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.27.tgz#9db563937dd86915f69092bc43259d2f48578e41" + integrity sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE= + +"@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== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sharp@^0.29.5": + version "0.29.5" + resolved "https://registry.yarnpkg.com/@types/sharp/-/sharp-0.29.5.tgz#9c7032d30d138ad16dde6326beaff2af757b91b3" + integrity sha512-3TC+S3H5RwnJmLYMHrcdfNjz/CaApKmujjY9b6PU/pE6n0qfooi99YqXGWoW8frU9EWYj/XTI35Pzxa+ThAZ5Q== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/superagent@*": + version "4.1.14" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.14.tgz" + integrity sha512-iiXaOL2wSbnSY4qg0mFPWJHL9iwyEsoNYwaHF2w58/fsVAQJlj+KUfFAFZu+nzbz+b7dUprJEAc+O9vhHHhQTA== + dependencies: + "@types/cookiejar" "*" + "@types/node" "*" + +"@types/supertest@^2.0.11": + version "2.0.11" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz" + integrity sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q== + dependencies: + "@types/superagent" "*" + +"@types/webgl-ext@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/webgl-ext/-/webgl-ext-0.0.30.tgz#0ce498c16a41a23d15289e0b844d945b25f0fb9d" + integrity sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg== + +"@types/webgl2@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@types/webgl2/-/webgl2-0.0.6.tgz#1ea2db791362bd8521548d664dbd3c5311cdf4b6" + integrity sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ== + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + dependencies: + "@types/yargs-parser" "*" + +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + +"@typescript-eslint/eslint-plugin@^5.0.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz" + integrity sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ== + dependencies: + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/type-utils" "5.10.0" + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" + functional-red-black-tree "^1.0.1" + ignore "^5.1.8" + regexpp "^3.2.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz" + integrity sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw== + dependencies: + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + debug "^4.3.2" + +"@typescript-eslint/scope-manager@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz" + integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== + dependencies: + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + +"@typescript-eslint/type-utils@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz" + integrity sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ== + dependencies: + "@typescript-eslint/utils" "5.10.0" + debug "^4.3.2" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz" + integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== + +"@typescript-eslint/typescript-estree@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz" + integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== + dependencies: + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz" + integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/visitor-keys@5.10.0": + version "5.10.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz" + integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== + dependencies: + "@typescript-eslint/types" "5.10.0" + eslint-visitor-keys "^3.0.0" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + 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== + +"@webassemblyjs/helper-api-error@1.11.1": + 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== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + 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== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + 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== + +"@webassemblyjs/helper-wasm-section@1.11.1": + 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== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@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@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abstract-logging@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz" + integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA== + +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + +adm-zip@^0.5.2: + version "0.5.9" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.9.tgz#b33691028333821c0cf95c31374c5462f2905a83" + integrity sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +ajv-formats@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@8.6.3: + version "8.6.3" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@8.8.2: + version "8.8.2" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.1.0: + version "8.9.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" + integrity sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY= + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + +are-we-there-yet@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" + integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.10, argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + +avvio@^7.1.2: + version "7.2.2" + resolved "https://registry.npmjs.org/avvio/-/avvio-7.2.2.tgz" + integrity sha512-XW2CMCmZaCmCCsIaJaLKxAzPwF37fXi1KGxNOvedOpeisLdmxZnblGc3hpHWYnlP+KOUxZsazh43WXNHgXpbqw== + dependencies: + archy "^1.0.0" + debug "^4.0.0" + fastq "^1.6.1" + queue-microtask "^1.1.2" + +axios@0.24.0: + version "0.24.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + +babel-jest@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.4.6.tgz" + integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg== + dependencies: + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.4.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.4.0.tgz" + integrity sha512-Jcu7qS4OX5kTWBc45Hz7BMmgXuJqRnhatqpUhnzGC3OBYpOmf2tv6jFNwZpwM7wU7MUuv2r9IPS/ZlYOuburVw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@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-top-level-await" "^7.8.3" + +babel-preset-jest@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.4.0.tgz" + integrity sha512-NK4jGYpnBvNxcGo7/ZpZJr51jCGT+3bwwpVIDY2oNfTxJJldRtB4VAcYdgp1loDE50ODuTu+yBjpMAswv5tlpg== + dependencies: + babel-plugin-jest-hoist "^27.4.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-5.0.1.tgz#f1a2c20f208e2ccdceea4433df0c8b2c54ecdf71" + integrity sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + node-addon-api "^3.1.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.19.1: + version "1.19.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz" + integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== + dependencies: + bytes "3.1.1" + 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.6" + raw-body "2.4.2" + type-is "~1.6.18" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.14.5, browserslist@^4.17.5: + version "4.19.1" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bull@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/bull/-/bull-4.4.0.tgz#4f29ef8e0a87e7138dfd72cb435d3ee37e434b68" + integrity sha512-x+SDmRhixg8EqXOnE9Q3x9H5zQqdVZypiIEgqE8lSA1M1iE9IAFMum7WU0h/CVZvwbLTWD6if7OrMCG3gCXVyA== + dependencies: + cron-parser "^4.2.1" + debuglog "^1.0.0" + get-port "^5.1.1" + ioredis "^4.27.0" + lodash "^4.17.21" + msgpackr "^1.5.2" + p-timeout "^3.2.0" + semver "^7.3.2" + uuid "^8.3.0" + +busboy@^0.2.11: + version "0.2.14" + resolved "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz" + integrity sha1-bCpiLvz0fFe7vh4qnDetNseSVFM= + dependencies: + dicer "0.2.5" + readable-stream "1.1.x" + +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001286: + version "1.0.30001301" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz" + integrity sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA== + +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^3.4.2: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1, chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + 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== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +class-transformer@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.5.1.tgz#24147d5dffd2a6cea930a3250a677addf96ab336" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + +class-validator@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.13.2.tgz#64b031e9f3f81a1e1dcd04a5d604734608b24143" + integrity sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw== + dependencies: + libphonenumber-js "^1.9.43" + validator "^13.7.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-table3@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz" + integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + dependencies: + string-width "^4.2.0" + optionalDependencies: + colors "1.4.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +cluster-key-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color-support@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +color@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.0.tgz#0c782459a3e98838ea01e4bc0fb43310ca35af78" + integrity sha512-hHTcrbvEnGjC7WBMk6ibQWFVDgEFTVmjrz2Q5HlU6ltwxv0JJN2Z8I7uRbWeQLF04dikxs8zgyZkazRJvSMtyQ== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colors@1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-emitter@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +consola@^2.15.0: + version "2.15.3" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + 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== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.1, cookie@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +cookiejar@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +core-js@3: + version "3.21.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.0.tgz#f479dbfc3dffb035a0827602dd056839a774aa71" + integrity sha512-YUdI3fFu4TF/2WykQ2xzSiTQdldLB4KVuL9WeAy5XONZYt5Cun/fpQvctoKbCgvPhmzADeesTk/j2Rdx77AcKQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cron-parser@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.2.1.tgz#b43205d05ccd5c93b097dae64f3bd811f5993af3" + integrity sha512-5sJBwDYyCp+0vU5b7POl8zLWfgV5fOHxlc45FWoWdHecGC7MQHCjx0CHivCMRnGFovghKhhyYM+Zm9DcY5qcHg== + dependencies: + luxon "^1.28.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.3" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debuglog@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +denque@^1.1.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +dezalgo@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz" + integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= + dependencies: + asap "^2.0.0" + wrappy "1" + +dicer@0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz" + integrity sha1-WZbAhrszIYyBLAkL3cCc0S+stw8= + dependencies: + readable-stream "1.1.x" + streamsearch "0.1.2" + +diff-sequences@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.4.0.tgz" + integrity sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +dotenv-expand@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +dotenv@^14.2.0: + version "14.2.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-14.2.0.tgz" + integrity sha512-05POuPJyPpO6jqzTNweQFfAyMSD4qa4lvsMOWyTRTdpHKy6nnnN+IYWaXF+lHivhBH/ufDKlR4IWCAN3oPnHuw== + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.4.17: + version "1.4.51" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz" + integrity sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.0.0, enhanced-resolve@^5.7.0, enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz" + integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== + +eslint@^8.0.1: + version "8.7.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.7.0.tgz" + integrity sha512-ifHYzkBGrzS2iDU7KjhCAVMGCvF6M3Xfs8X8b37cgrUlDt6bWRTpRh6T/gtSXv1HJ/BUGgmjvNvOEGu85Iif7w== + dependencies: + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.2.0" + espree "^9.3.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^6.0.1" + globals "^13.6.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== + dependencies: + acorn "^8.7.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^3.1.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^4.0.2: + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +expect@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/expect/-/expect-27.4.6.tgz" + integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag== + dependencies: + "@jest/types" "^27.4.2" + jest-get-type "^27.4.0" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + +express@4.17.2: + version "4.17.2" + resolved "https://registry.npmjs.org/express/-/express-4.17.2.tgz" + integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.4.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.9.6" + range-parser "~1.2.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" + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-json-stringify@^2.5.2: + version "2.7.13" + resolved "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz" + integrity sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA== + dependencies: + ajv "^6.11.0" + deepmerge "^4.2.2" + rfdc "^1.2.0" + string-similarity "^4.0.1" + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-redact@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.0.tgz" + integrity sha512-dir8LOnvialLxiXDPESMDHGp82CHi6ZEYTVkcvdn5d7psdv9ZkkButXrOeXST4aqreIRR+N7CYlsrwFuorurVg== + +fast-safe-stringify@2.1.1, fast-safe-stringify@^2.0.8, fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fastify-cors@6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/fastify-cors/-/fastify-cors-6.0.2.tgz" + integrity sha512-sE0AOyzmj5hLLRRVgenjA6G2iOGX35/1S3QGYB9rr9TXelMZB3lFrXy4CzwYVOMiujJeMiLgO4J7eRm8sQSv8Q== + dependencies: + fastify-plugin "^3.0.0" + vary "^1.1.2" + +fastify-error@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/fastify-error/-/fastify-error-0.3.1.tgz" + integrity sha512-oCfpcsDndgnDVgiI7bwFKAun2dO+4h84vBlkWsWnz/OUK9Reff5UFoFl241xTiLeHWX/vU9zkDVXqYUxjOwHcQ== + +fastify-formbody@5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/fastify-formbody/-/fastify-formbody-5.2.0.tgz" + integrity sha512-d8Y5hCL82akPyoFiXh2wYOm3es0pV9jqoPo3pO9OV2cNF0cQx39J5WAVXzCh4MSt9Z2qF4Fy5gHlvlyESwjtvg== + dependencies: + fastify-plugin "^3.0.0" + +fastify-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.0.tgz" + integrity sha512-ZdCvKEEd92DNLps5n0v231Bha8bkz1DjnPP/aEz37rz/q42Z5JVLmgnqR4DYuNn3NXAO3IDCPyRvgvxtJ4Ym4w== + +fastify-warning@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz" + integrity sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw== + +fastify@3.27.0: + version "3.27.0" + resolved "https://registry.npmjs.org/fastify/-/fastify-3.27.0.tgz" + integrity sha512-p99Fd7xt4DFew39U5Wnp/Soy7jkpxpaqToekwQ3XWv+ECUPXd6bSF9l79EiwkutWALtEU/JiRlzS9qjP2gLHFg== + dependencies: + "@fastify/ajv-compiler" "^1.0.0" + abstract-logging "^2.0.0" + avvio "^7.1.2" + fast-json-stringify "^2.5.2" + fastify-error "^0.3.0" + find-my-way "^4.5.0" + flatstr "^1.0.12" + light-my-request "^4.2.0" + pino "^6.13.0" + process-warning "^1.0.0" + proxy-addr "^2.0.7" + rfdc "^1.1.4" + secure-json-parse "^2.0.0" + semver "^7.3.2" + tiny-lru "^7.0.0" + +fastq@^1.6.0, fastq@^1.6.1: + version "1.13.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-my-way@^4.5.0: + version "4.5.1" + resolved "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz" + integrity sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg== + dependencies: + fast-decode-uri-component "^1.0.1" + fast-deep-equal "^3.1.3" + safe-regex2 "^2.0.0" + semver-store "^0.3.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatstr@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz" + integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== + +flatted@^3.1.0: + version "3.2.4" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== + +follow-redirects@^1.14.4: + version "1.14.7" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== + +fork-ts-checker-webpack-plugin@6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz" + integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz" + integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== + dependencies: + dezalgo "1.0.3" + hexoid "1.0.0" + once "1.4.0" + qs "6.9.3" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gauge@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" + integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.2" + console-control-strings "^1.0.0" + has-unicode "^2.0.1" + object-assign "^4.1.1" + signal-exit "^3.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.2" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + 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@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-port@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + 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== + +glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.6.0, globals@^13.9.0: + version "13.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.4: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +google-protobuf@^3.9.2: + version "3.19.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.4.tgz#8d32c3e34be9250956f28c0fb90955d13f311888" + integrity sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hexoid@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz" + integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== + +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@7.3.3: + version "7.3.3" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +inquirer@8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz" + integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== + dependencies: + ansi-escapes "^4.2.1" + 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.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +ioredis@^4.27.0: + version "4.28.3" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.3.tgz#b13fce8a6a7c525ba22e666d72980a3c0ba799aa" + integrity sha512-9JOWVgBnuSxpIgfpjc1OeY1OLmA4t2KOWWURTDRXky+eWO0LZhI33pQNT9gYxANUXfh5p/zYephYni6GPRsksQ== + dependencies: + cluster-key-slot "^1.1.0" + debug "^4.3.1" + denque "^1.1.0" + lodash.defaults "^4.2.0" + lodash.flatten "^4.4.0" + lodash.isarguments "^3.1.0" + p-map "^2.1.0" + redis-commands "1.7.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + +ipaddr.js@1.9.1: + 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== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + 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== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz" + integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +jest-changed-files@^27.4.2: + version "27.4.2" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.4.2.tgz" + integrity sha512-/9x8MjekuzUQoPjDHbBiXbNEBauhrPU2ct7m8TfCg69ywt1y/N+yYwGh3gCpnqUS3klYWDU/lSNgv+JhoD2k1A== + dependencies: + "@jest/types" "^27.4.2" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.4.6.tgz" + integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.4.6" + is-generator-fn "^2.0.0" + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.4.7: + version "27.4.7" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.4.7.tgz" + integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw== + dependencies: + "@jest/core" "^27.4.7" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + jest-config "^27.4.7" + jest-util "^27.4.2" + jest-validate "^27.4.6" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.4.7: + version "27.4.7" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.4.7.tgz" + integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.4.6" + "@jest/types" "^27.4.2" + babel-jest "^27.4.6" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-circus "^27.4.6" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-get-type "^27.4.0" + jest-jasmine2 "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-runner "^27.4.6" + jest-util "^27.4.2" + jest-validate "^27.4.6" + micromatch "^4.0.4" + pretty-format "^27.4.6" + slash "^3.0.0" + +jest-diff@^27.0.0, jest-diff@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.4.6.tgz" + integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.4.0" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-docblock@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.4.0.tgz" + integrity sha512-7TBazUdCKGV7svZ+gh7C8esAnweJoG+SvcF6Cjqj4l17zA2q1cMwx2JObSioubk317H+cjcHgP+7fTs60paulg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.4.6.tgz" + integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA== + dependencies: + "@jest/types" "^27.4.2" + chalk "^4.0.0" + jest-get-type "^27.4.0" + jest-util "^27.4.2" + pretty-format "^27.4.6" + +jest-environment-jsdom@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz" + integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + jest-mock "^27.4.6" + jest-util "^27.4.2" + jsdom "^16.6.0" + +jest-environment-node@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.4.6.tgz" + integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + jest-mock "^27.4.6" + jest-util "^27.4.2" + +jest-get-type@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.4.0.tgz" + integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== + +jest-haste-map@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.4.6.tgz" + integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ== + dependencies: + "@jest/types" "^27.4.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^27.4.0" + jest-serializer "^27.4.0" + jest-util "^27.4.2" + jest-worker "^27.4.6" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz" + integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.4.6" + is-generator-fn "^2.0.0" + jest-each "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-runtime "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + pretty-format "^27.4.6" + throat "^6.0.1" + +jest-leak-detector@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz" + integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA== + dependencies: + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-matcher-utils@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz" + integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA== + dependencies: + chalk "^4.0.0" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + pretty-format "^27.4.6" + +jest-message-util@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.4.6.tgz" + integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.4.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + pretty-format "^27.4.6" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.4.6.tgz" + integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw== + dependencies: + "@jest/types" "^27.4.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.4.0.tgz" + integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== + +jest-resolve-dependencies@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz" + integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw== + dependencies: + "@jest/types" "^27.4.2" + jest-regex-util "^27.4.0" + jest-snapshot "^27.4.6" + +jest-resolve@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.4.6.tgz" + integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw== + dependencies: + "@jest/types" "^27.4.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" + jest-pnp-resolver "^1.2.2" + jest-util "^27.4.2" + jest-validate "^27.4.6" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.4.6.tgz" + integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg== + dependencies: + "@jest/console" "^27.4.6" + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-docblock "^27.4.0" + jest-environment-jsdom "^27.4.6" + jest-environment-node "^27.4.6" + jest-haste-map "^27.4.6" + jest-leak-detector "^27.4.6" + jest-message-util "^27.4.6" + jest-resolve "^27.4.6" + jest-runtime "^27.4.6" + jest-util "^27.4.2" + jest-worker "^27.4.6" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.4.6.tgz" + integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ== + dependencies: + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" + "@jest/globals" "^27.4.6" + "@jest/source-map" "^27.4.0" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-haste-map "^27.4.6" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" + jest-regex-util "^27.4.0" + jest-resolve "^27.4.6" + jest-snapshot "^27.4.6" + jest-util "^27.4.2" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.4.0: + version "27.4.0" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.4.0.tgz" + integrity sha512-RDhpcn5f1JYTX2pvJAGDcnsNTnsV9bjYPU8xcV+xPwOXnUPOQwf4ZEuiU6G9H1UztH+OapMgu/ckEVwO87PwnQ== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.4.6.tgz" + integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.4.6" + graceful-fs "^4.2.4" + jest-diff "^27.4.6" + jest-get-type "^27.4.0" + jest-haste-map "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" + jest-util "^27.4.2" + natural-compare "^1.4.0" + pretty-format "^27.4.6" + semver "^7.3.2" + +jest-util@^27.0.0, jest-util@^27.4.2: + version "27.4.2" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.4.2.tgz" + integrity sha512-YuxxpXU6nlMan9qyLuxHaMMOzXAl5aGZWCSzben5DhLHemYQxCc4YK+4L3ZrCutT8GPQ+ui9k5D8rUJoDioMnA== + dependencies: + "@jest/types" "^27.4.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.4" + picomatch "^2.2.3" + +jest-validate@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.4.6.tgz" + integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ== + dependencies: + "@jest/types" "^27.4.2" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.4.0" + leven "^3.1.0" + pretty-format "^27.4.6" + +jest-watcher@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.4.6.tgz" + integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw== + dependencies: + "@jest/test-result" "^27.4.6" + "@jest/types" "^27.4.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.4.2" + string-length "^4.0.1" + +jest-worker@^27.4.1, jest-worker@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^27.2.5: + version "27.4.7" + resolved "https://registry.npmjs.org/jest/-/jest-27.4.7.tgz" + integrity sha512-8heYvsx7nV/m8m24Vk26Y87g73Ba6ueUd0MWed/NXMhSZIm62U/llVbS0PJe1SHunbyXjJ/BqG1z9bFjGUIvTg== + dependencies: + "@jest/core" "^27.4.7" + import-local "^3.0.2" + jest-cli "^27.4.7" + +joi@^17.5.0: + version "17.5.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.5.0.tgz#7e66d0004b5045d971cf416a55fb61d33ac6e011" + integrity sha512-R7hR50COp7StzLnDi4ywOXHrBrgNXuUUfJWIR5lPY5Bm/pOD3jZaTwpluUXVLRWcoWZxkrHBBJ5hLxgnlehbdw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.0" + "@sideway/pinpoint" "^2.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.0.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@2.x, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonc-parser@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonwebtoken@8.5.1, jsonwebtoken@^8.2.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +libphonenumber-js@^1.9.43: + version "1.9.44" + resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.9.44.tgz#d036364fe4c1e27205d1d283c7bf8fc25625200b" + integrity sha512-zhw8nUMJuQf7jG1dZfEOKKOS6M3QYIv3HnvB/vGohNd0QfxIQcObH3a6Y6s350H+9xgBeOXClOJkS0hJ0yvS3g== + +light-my-request@4.7.0, light-my-request@^4.2.0: + version "4.7.0" + resolved "https://registry.npmjs.org/light-my-request/-/light-my-request-4.7.0.tgz" + integrity sha512-LTa8YZp3K2AUpqUnwwKajoIHcsKOBnzwJNQSrk7unziPwo6CjOYjyO0F9wfkxFvP+nBsCGe3eMPnedVgIIgdAw== + dependencies: + ajv "^8.1.0" + cookie "^0.4.0" + fastify-warning "^0.2.0" + set-cookie-parser "^2.4.1" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash@4.17.21, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +long@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +luxon@^1.28.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.28.0.tgz#e7f96daad3938c06a62de0fb027115d251251fbf" + integrity sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ== + +macos-release@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz" + integrity sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g== + +magic-string@0.25.7: + version "0.25.7" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^3.0.0, make-dir@^3.1.0: + 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== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2: + version "3.4.1" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^4.0.0, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +middie@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/middie/-/middie-5.3.0.tgz" + integrity sha512-uq6Ob4dmmHeT6rJpBDWVwSxBzxzKlBvnrZdLSRJeuhHzljvZ6ccgLP/HaShgfiYrQvekRH0KUe/G1WTu/IrXsQ== + dependencies: + fastify-plugin "^3.0.0" + path-to-regexp "^6.1.0" + reusify "^1.0.4" + +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.5, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.1.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" + integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + dependencies: + yallist "^4.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +mkdirp@^0.5.4, mkdirp@^0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +msgpackr-extract@^1.0.14: + version "1.0.16" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-1.0.16.tgz#701c4f6e6f25c100ae84557092274e8fffeefe45" + integrity sha512-fxdRfQUxPrL/TizyfYfMn09dK58e+d65bRD/fcaVH4052vj30QOzzqxcQIS7B0NsqlypEQ/6Du3QmP2DhWFfCA== + dependencies: + nan "^2.14.2" + node-gyp-build "^4.2.3" + +msgpackr@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.5.2.tgz#b400c9885642bdec27b284f8bdadbd6570b448b7" + integrity sha512-OCguCkbG34x1ddO4vAzEm/4J1GTo512k9SoxV8K+EGfI/onFdpemRf0HpsVRFpxadXr4JBFgHsQUitgTlw7ZYQ== + optionalDependencies: + msgpackr-extract "^1.0.14" + +multer@1.4.4: + version "1.4.4" + resolved "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz" + integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw== + dependencies: + append-field "^1.0.0" + busboy "^0.2.11" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + on-finished "^2.3.0" + type-is "^1.6.4" + xtend "^4.0.0" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan@^2.14.2: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-abi@^3.3.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.5.0.tgz#26e8b7b251c3260a5ac5ba5aef3b4345a0229248" + integrity sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw== + dependencies: + semver "^7.3.5" + +node-addon-api@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-addon-api@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + +node-emoji@1.11.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-fetch@^2.6.1, node-fetch@^2.6.5, node-fetch@~2.6.1: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.0.1, npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" + integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== + dependencies: + are-we-there-yet "^2.0.0" + console-control-strings "^1.1.0" + gauge "^3.0.0" + set-blocking "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-hash@2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz" + integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== + +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +on-finished@^2.3.0, on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optional@0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz" + integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +ora@5.4.1, ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-name@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz" + integrity sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw== + dependencies: + macos-release "^2.5.0" + windows-release "^4.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5-htmlparser2-tree-adapter@^6.0.0: + 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== + dependencies: + parse5 "^6.0.1" + +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +passport-jwt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065" + integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg== + dependencies: + jsonwebtoken "^8.2.0" + passport-strategy "^1.0.0" + +passport-strategy@1.x.x, passport-strategy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= + +passport@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.5.2.tgz#0cb38dd8a71552c8390dfa6a9a6f7f3909954bcf" + integrity sha512-w9n/Ot5I7orGD4y+7V3EFJCQEznE5RxHamUxcqLT2QoJY0f2JdN8GyHonYFvN0Vz+L6lUJfVhrk2aZz2LbuREw== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-to-regexp@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-to-regexp@^6.1.0: + version "6.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz" + integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= + +pg-connection-string@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz" + integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz" + integrity sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ== + +pg-protocol@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz" + integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.7.1: + version "8.7.1" + resolved "https://registry.npmjs.org/pg/-/pg-8.7.1.tgz" + integrity sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.5.0" + pg-pool "^3.4.1" + pg-protocol "^1.5.0" + pg-types "^2.1.0" + pgpass "1.x" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pino-std-serializers@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz" + integrity sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg== + +pino@^6.13.0: + version "6.13.4" + resolved "https://registry.npmjs.org/pino/-/pino-6.13.4.tgz" + integrity sha512-g4tHSISmQJYUEKEMVdaZ+ZokWwFnTwZL5JPn+lnBVZ1BuBbrSchrXwQINknkM5+Q4fF6U9NjiI8PWwwMDHt9zA== + dependencies: + fast-redact "^3.0.0" + fast-safe-stringify "^2.0.8" + flatstr "^1.0.12" + pino-std-serializers "^3.1.0" + process-warning "^1.0.0" + quick-format-unescaped "^4.0.3" + sonic-boom "^1.0.2" + +pirates@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz" + integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== + +pkg-dir@^4.2.0: + 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== + dependencies: + find-up "^4.0.0" + +pluralize@8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" + integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +prebuild-install@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.0.0.tgz#3c5ce3902f1cb9d6de5ae94ca53575e4af0c1574" + integrity sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + npmlog "^4.0.1" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.3.2: + version "2.5.1" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== + +pretty-format@^27.0.0, pretty-format@^27.4.6: + version "27.4.6" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.4.6.tgz" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-warning@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz" + integrity sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +proxy-addr@^2.0.7, proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.33: + version "1.8.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.9.3: + version "6.9.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz" + integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + +qs@6.9.6: + version "6.9.6" + resolved "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + +qs@^6.10.1: + version "6.10.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.1.2, queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== + dependencies: + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +readable-stream@1.1.x: + version "1.1.14" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.6, readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redis-commands@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== + +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= + dependencies: + redis-errors "^1.0.0" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerator-runtime@^0.13.5: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + 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== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.1.6, resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz" + integrity sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.1.4, rfdc@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rxjs@6.6.7, rxjs@^6.6.0: + version "6.6.7" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^7.2.0: + version "7.5.2" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz" + integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex2@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz" + integrity sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ== + dependencies: + ret "~0.2.0" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +secure-json-parse@^2.0.0: + version "2.4.0" + resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz" + integrity sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg== + +seedrandom@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" + integrity sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw= + +semver-store@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz" + integrity sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg== + +semver@7.x, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.2: + version "0.17.2" + resolved "https://registry.npmjs.org/send/-/send-0.17.2.tgz" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +serve-static@1.14.2: + version "1.14.2" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz" + integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.2" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-cookie-parser@^2.4.1: + version "2.4.8" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz" + integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sharp@^0.29.3: + version "0.29.3" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.3.tgz#0da183d626094c974516a48fab9b3e4ba92eb5c2" + integrity sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA== + dependencies: + color "^4.0.1" + detect-libc "^1.0.3" + node-addon-api "^4.2.0" + prebuild-install "^7.0.0" + semver "^7.3.5" + simple-get "^4.0.0" + tar-fs "^2.1.1" + tunnel-agent "^0.6.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shelljs@0.8.5: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sonic-boom@^1.0.2: + version "1.4.1" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz" + integrity sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg== + dependencies: + atomic-sleep "^1.0.0" + flatstr "^1.0.12" + +source-map-support@0.5.21, source-map-support@^0.5.20, source-map-support@^0.5.6, source-map-support@~0.5.20: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.4: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +split2@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stack-utils@^2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +streamsearch@0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" + integrity sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo= + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-similarity@^4.0.1: + version "4.0.4" + resolved "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz" + integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +superagent@^7.1.0: + version "7.1.1" + resolved "https://registry.npmjs.org/superagent/-/superagent-7.1.1.tgz" + integrity sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.3" + debug "^4.3.3" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^2.0.1" + methods "^1.1.2" + mime "^2.5.0" + qs "^6.10.1" + readable-stream "^3.6.0" + semver "^7.3.5" + +supertest@^6.1.3: + version "6.2.2" + resolved "https://registry.npmjs.org/supertest/-/supertest-6.2.2.tgz" + integrity sha512-wCw9WhAtKJsBvh07RaS+/By91NNE0Wh0DN19/hWPlBOU8tAfOtbZoVSV4xXeoKoxgPx0rx2y+y+8660XtE7jzg== + dependencies: + methods "^1.1.2" + superagent "^7.1.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +symbol-observable@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz" + integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +systeminformation@^5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.11.0.tgz#2060779e1e7c7372192dbcd850c65cfd85f4ea71" + integrity sha512-mI/5nFK7NUe9Qbmy65WoB5TlCWKAhP4kG0w6uR2mZM8Mpdi8b45b3hTIK3W5+kQYZnYFWeS9/O5nn5rdcSvqfA== + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@^2.0.0, tar-fs@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^4.4.6: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.1.0, tar@^6.1.11: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.1.3: + version "5.3.0" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz" + integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== + dependencies: + jest-worker "^27.4.1" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + +terser@^5.7.2: + version "5.10.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + 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== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tiny-lru@^7.0.0: + version "7.0.6" + resolved "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz" + integrity sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow== + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + 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-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-jest@^27.0.3: + version "27.1.3" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.3.tgz" + integrity sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^27.0.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "20.x" + +ts-loader@^9.2.3: + version "9.2.6" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz" + integrity sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + +ts-node@^10.0.0: + version "10.4.0" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + +tsconfig-paths-webpack-plugin@3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz" + integrity sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.7.0" + tsconfig-paths "^3.9.0" + +tsconfig-paths@3.12.0, tsconfig-paths@^3.10.1, tsconfig-paths@^3.9.0: + version "3.12.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz" + integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@2.3.1, tslib@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + 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== + +type-is@^1.6.4, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typeorm@^0.2.41: + version "0.2.41" + resolved "https://registry.npmjs.org/typeorm/-/typeorm-0.2.41.tgz" + integrity sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + debug "^4.3.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^4.0.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.1.0" + xml2js "^0.4.23" + yargs "^17.0.1" + zen-observable-ts "^1.0.0" + +typescript@4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz" + integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== + +typescript@^4.3.5: + version "4.5.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== + +universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.2, uuid@^8.3.0: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validator@^13.7.0: + version "13.7.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" + integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== + +vary@^1, vary@^1.1.2, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-node-externals@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz" + integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== + +webpack-sources@^3.2.2: + 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== + +webpack@5.66.0: + version "5.66.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz" + integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@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 "^5.8.3" + 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 "^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.2" + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0, wide-align@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +windows-release@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz" + integrity sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg== + dependencies: + execa "^4.0.2" + +word-wrap@^1.2.3, word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.0, yallist@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@20.x, yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^16.0.0, yargs@^16.0.3, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.1: + version "17.3.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + 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" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zen-observable-ts@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==

VRr0302)sgA^e#l|vQte`If0 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�S;&&|=GC6ef>BPIH}6}gbo5vBf2hN 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