diff --git a/.gitignore b/.gitignore
index dea578490..03be60bbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
-/node_modules
+node_modules/
/.pnp
.pnp.js
@@ -9,7 +9,7 @@
/coverage
# next.js
-/.next/
+.next/
/out/
# production
@@ -46,4 +46,4 @@ public/sw.js.map
public/worker-*.js
public/worker-*.js.map
-.turbo
\ No newline at end of file
+.turbo
diff --git a/configUtil.js b/apps/photos/configUtil.js
similarity index 100%
rename from configUtil.js
rename to apps/photos/configUtil.js
diff --git a/next-env.d.ts b/apps/photos/next-env.d.ts
similarity index 100%
rename from next-env.d.ts
rename to apps/photos/next-env.d.ts
diff --git a/next.config.js b/apps/photos/next.config.js
similarity index 100%
rename from next.config.js
rename to apps/photos/next.config.js
diff --git a/apps/photos/package.json b/apps/photos/package.json
new file mode 100644
index 000000000..04d918bba
--- /dev/null
+++ b/apps/photos/package.json
@@ -0,0 +1,120 @@
+{
+ "name": "photos",
+ "version": "1.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "albums": "next dev -p 3002",
+ "auth": "next dev -p 3004",
+ "lint": "next lint",
+ "build": "next build",
+ "postbuild": "next export",
+ "build-analyze": "ANALYZE=true next build",
+ "start": "next start",
+ "prepare": "husky install"
+ },
+ "dependencies": {
+ "@date-io/date-fns": "^2.14.0",
+ "@emotion/cache": "^11.10.5",
+ "@emotion/react": "^11.10.6",
+ "@emotion/server": "^11.10.0",
+ "@emotion/styled": "^11.10.6",
+ "@mui/icons-material": "^5.6.2",
+ "@mui/material": "^5.6.2",
+ "@mui/x-date-pickers": "^5.0.0-alpha.6",
+ "@sentry/nextjs": "^6.7.1",
+ "@stripe/stripe-js": "^1.13.2",
+ "@tensorflow-models/coco-ssd": "^2.2.2",
+ "@tensorflow/tfjs-backend-cpu": "^3.13.0",
+ "@tensorflow/tfjs-backend-webgl": "^3.11.0",
+ "@tensorflow/tfjs-converter": "^3.11.0",
+ "@tensorflow/tfjs-core": "^3.11.0",
+ "@tensorflow/tfjs-tflite": "^0.0.1-alpha.7",
+ "@zip.js/zip.js": "^2.4.2",
+ "axios": "^0.21.3",
+ "bip39": "^3.0.4",
+ "blazeface-back": "^0.0.8",
+ "bootstrap": "^4.5.2",
+ "bs58": "^4.0.1",
+ "chrono-node": "^2.2.6",
+ "comlink": "^4.3.0",
+ "debounce-promise": "^3.1.2",
+ "density-clustering": "^1.3.0",
+ "eventemitter3": "^4.0.7",
+ "exifr": "^7.1.3",
+ "ffmpeg-wasm": "file:./thirdparty/ffmpeg-wasm",
+ "file-type": "^16.5.4",
+ "formik": "^2.1.5",
+ "get-user-locale": "^2.1.3",
+ "hdbscan": "0.0.1-alpha.5",
+ "heic-convert": "^1.2.4",
+ "http-proxy-middleware": "^1.0.5",
+ "i18next": "^22.4.11",
+ "i18next-http-backend": "^2.1.1",
+ "idb": "^7.0.0",
+ "is-electron": "^2.2.0",
+ "jszip": "3.8.0",
+ "libsodium-wrappers": "^0.7.8",
+ "localforage": "^1.9.0",
+ "ml-matrix": "^6.8.2",
+ "next": "^13.1.2",
+ "next-transpile-modules": "^10.0.0",
+ "otpauth": "^9.0.2",
+ "p-queue": "^7.1.0",
+ "photoswipe": "file:./thirdparty/photoswipe",
+ "piexifjs": "^1.0.6",
+ "react": "^18.2.0",
+ "react-bootstrap": "^1.3.0",
+ "react-datepicker": "^4.3.0",
+ "react-dom": "^18.2.0",
+ "react-dropzone": "^11.2.4",
+ "react-i18next": "^12.2.0",
+ "react-otp-input": "^2.3.1",
+ "react-select": "^4.3.1",
+ "react-simple-code-editor": "^0.11.0",
+ "react-top-loading-bar": "^2.0.1",
+ "react-virtualized-auto-sizer": "^1.0.2",
+ "react-window": "^1.8.6",
+ "sanitize-filename": "^1.6.3",
+ "similarity-transformation": "^0.0.1",
+ "transformation-matrix": "^2.10.0",
+ "vscode-uri": "^3.0.7",
+ "workbox-precaching": "^6.1.5",
+ "workbox-recipes": "^6.1.5",
+ "workbox-routing": "^6.1.5",
+ "workbox-strategies": "^6.1.5",
+ "workbox-window": "^6.1.5",
+ "xml-js": "^1.6.11",
+ "yup": "^0.29.3",
+ "zxcvbn": "^4.4.2"
+ },
+ "devDependencies": {
+ "@next/bundle-analyzer": "^13.1.6",
+ "@types/bs58": "^4.0.1",
+ "@types/debounce-promise": "^3.1.3",
+ "@types/libsodium-wrappers": "^0.7.8",
+ "@types/node": "^14.6.4",
+ "@types/photoswipe": "^4.1.1",
+ "@types/react": "^16.9.49",
+ "@types/react-collapse": "^5.0.1",
+ "@types/react-datepicker": "^4.1.7",
+ "@types/react-select": "^4.0.15",
+ "@types/react-window": "^1.8.2",
+ "@types/react-window-infinite-loader": "^1.0.3",
+ "@types/wicg-file-system-access": "^2020.9.5",
+ "@types/yup": "^0.29.7",
+ "@types/zxcvbn": "^4.4.1",
+ "@typescript-eslint/eslint-plugin": "^5.43.0",
+ "eslint": "^8.28.0",
+ "eslint-config-next": "^13.0.6",
+ "eslint-config-prettier": "^8.5.0",
+ "husky": "^7.0.1",
+ "lint-staged": "^11.1.2",
+ "prettier": "2.3.2",
+ "typescript": "^4.1.3",
+ "tsconfig": "*"
+ },
+ "standard": {
+ "parser": "babel-eslint"
+ }
+ }
\ No newline at end of file
diff --git a/public/.well-known/apple-app-site-association b/apps/photos/public/.well-known/apple-app-site-association
similarity index 100%
rename from public/.well-known/apple-app-site-association
rename to apps/photos/public/.well-known/apple-app-site-association
diff --git a/public/.well-known/assetlinks.json b/apps/photos/public/.well-known/assetlinks.json
similarity index 100%
rename from public/.well-known/assetlinks.json
rename to apps/photos/public/.well-known/assetlinks.json
diff --git a/public/_headers b/apps/photos/public/_headers
similarity index 100%
rename from public/_headers
rename to apps/photos/public/_headers
diff --git a/public/fonts/OFL.txt b/apps/photos/public/fonts/OFL.txt
similarity index 100%
rename from public/fonts/OFL.txt
rename to apps/photos/public/fonts/OFL.txt
diff --git a/public/fonts/inter-v11-latin-500.woff b/apps/photos/public/fonts/inter-v11-latin-500.woff
similarity index 100%
rename from public/fonts/inter-v11-latin-500.woff
rename to apps/photos/public/fonts/inter-v11-latin-500.woff
diff --git a/public/fonts/inter-v11-latin-500.woff2 b/apps/photos/public/fonts/inter-v11-latin-500.woff2
similarity index 100%
rename from public/fonts/inter-v11-latin-500.woff2
rename to apps/photos/public/fonts/inter-v11-latin-500.woff2
diff --git a/public/fonts/inter-v11-latin-600.woff b/apps/photos/public/fonts/inter-v11-latin-600.woff
similarity index 100%
rename from public/fonts/inter-v11-latin-600.woff
rename to apps/photos/public/fonts/inter-v11-latin-600.woff
diff --git a/public/fonts/inter-v11-latin-600.woff2 b/apps/photos/public/fonts/inter-v11-latin-600.woff2
similarity index 100%
rename from public/fonts/inter-v11-latin-600.woff2
rename to apps/photos/public/fonts/inter-v11-latin-600.woff2
diff --git a/public/fonts/inter-v11-latin-800.woff b/apps/photos/public/fonts/inter-v11-latin-800.woff
similarity index 100%
rename from public/fonts/inter-v11-latin-800.woff
rename to apps/photos/public/fonts/inter-v11-latin-800.woff
diff --git a/public/fonts/inter-v11-latin-800.woff2 b/apps/photos/public/fonts/inter-v11-latin-800.woff2
similarity index 100%
rename from public/fonts/inter-v11-latin-800.woff2
rename to apps/photos/public/fonts/inter-v11-latin-800.woff2
diff --git a/public/images/delete-account/1x.png b/apps/photos/public/images/delete-account/1x.png
similarity index 100%
rename from public/images/delete-account/1x.png
rename to apps/photos/public/images/delete-account/1x.png
diff --git a/public/images/delete-account/2x.png b/apps/photos/public/images/delete-account/2x.png
similarity index 100%
rename from public/images/delete-account/2x.png
rename to apps/photos/public/images/delete-account/2x.png
diff --git a/public/images/delete-account/3x.png b/apps/photos/public/images/delete-account/3x.png
similarity index 100%
rename from public/images/delete-account/3x.png
rename to apps/photos/public/images/delete-account/3x.png
diff --git a/public/images/empty-state/ente_duck.png b/apps/photos/public/images/empty-state/ente_duck.png
similarity index 100%
rename from public/images/empty-state/ente_duck.png
rename to apps/photos/public/images/empty-state/ente_duck.png
diff --git a/public/images/empty-state/ente_duck@2x.png b/apps/photos/public/images/empty-state/ente_duck@2x.png
similarity index 100%
rename from public/images/empty-state/ente_duck@2x.png
rename to apps/photos/public/images/empty-state/ente_duck@2x.png
diff --git a/public/images/empty-state/ente_duck@3x.png b/apps/photos/public/images/empty-state/ente_duck@3x.png
similarity index 100%
rename from public/images/empty-state/ente_duck@3x.png
rename to apps/photos/public/images/empty-state/ente_duck@3x.png
diff --git a/public/images/ente.svg b/apps/photos/public/images/ente.svg
similarity index 100%
rename from public/images/ente.svg
rename to apps/photos/public/images/ente.svg
diff --git a/public/images/ente/192.png b/apps/photos/public/images/ente/192.png
similarity index 100%
rename from public/images/ente/192.png
rename to apps/photos/public/images/ente/192.png
diff --git a/public/images/ente/256.png b/apps/photos/public/images/ente/256.png
similarity index 100%
rename from public/images/ente/256.png
rename to apps/photos/public/images/ente/256.png
diff --git a/public/images/ente/512.png b/apps/photos/public/images/ente/512.png
similarity index 100%
rename from public/images/ente/512.png
rename to apps/photos/public/images/ente/512.png
diff --git a/public/images/family-plan/1x.png b/apps/photos/public/images/family-plan/1x.png
similarity index 100%
rename from public/images/family-plan/1x.png
rename to apps/photos/public/images/family-plan/1x.png
diff --git a/public/images/family-plan/2x.png b/apps/photos/public/images/family-plan/2x.png
similarity index 100%
rename from public/images/family-plan/2x.png
rename to apps/photos/public/images/family-plan/2x.png
diff --git a/public/images/family-plan/3x.png b/apps/photos/public/images/family-plan/3x.png
similarity index 100%
rename from public/images/family-plan/3x.png
rename to apps/photos/public/images/family-plan/3x.png
diff --git a/public/images/favicon.png b/apps/photos/public/images/favicon.png
similarity index 100%
rename from public/images/favicon.png
rename to apps/photos/public/images/favicon.png
diff --git a/public/images/gallery-locked/1x.png b/apps/photos/public/images/gallery-locked/1x.png
similarity index 100%
rename from public/images/gallery-locked/1x.png
rename to apps/photos/public/images/gallery-locked/1x.png
diff --git a/public/images/gallery-locked/2x.png b/apps/photos/public/images/gallery-locked/2x.png
similarity index 100%
rename from public/images/gallery-locked/2x.png
rename to apps/photos/public/images/gallery-locked/2x.png
diff --git a/public/images/gallery-locked/3x.png b/apps/photos/public/images/gallery-locked/3x.png
similarity index 100%
rename from public/images/gallery-locked/3x.png
rename to apps/photos/public/images/gallery-locked/3x.png
diff --git a/public/images/onboarding-lock/1x.png b/apps/photos/public/images/onboarding-lock/1x.png
similarity index 100%
rename from public/images/onboarding-lock/1x.png
rename to apps/photos/public/images/onboarding-lock/1x.png
diff --git a/public/images/onboarding-lock/2x.png b/apps/photos/public/images/onboarding-lock/2x.png
similarity index 100%
rename from public/images/onboarding-lock/2x.png
rename to apps/photos/public/images/onboarding-lock/2x.png
diff --git a/public/images/onboarding-lock/3x.png b/apps/photos/public/images/onboarding-lock/3x.png
similarity index 100%
rename from public/images/onboarding-lock/3x.png
rename to apps/photos/public/images/onboarding-lock/3x.png
diff --git a/public/images/onboarding-safe/1x.png b/apps/photos/public/images/onboarding-safe/1x.png
similarity index 100%
rename from public/images/onboarding-safe/1x.png
rename to apps/photos/public/images/onboarding-safe/1x.png
diff --git a/public/images/onboarding-safe/2x.png b/apps/photos/public/images/onboarding-safe/2x.png
similarity index 100%
rename from public/images/onboarding-safe/2x.png
rename to apps/photos/public/images/onboarding-safe/2x.png
diff --git a/public/images/onboarding-safe/3x.png b/apps/photos/public/images/onboarding-safe/3x.png
similarity index 100%
rename from public/images/onboarding-safe/3x.png
rename to apps/photos/public/images/onboarding-safe/3x.png
diff --git a/public/images/onboarding-sync/1x.png b/apps/photos/public/images/onboarding-sync/1x.png
similarity index 100%
rename from public/images/onboarding-sync/1x.png
rename to apps/photos/public/images/onboarding-sync/1x.png
diff --git a/public/images/onboarding-sync/2x.png b/apps/photos/public/images/onboarding-sync/2x.png
similarity index 100%
rename from public/images/onboarding-sync/2x.png
rename to apps/photos/public/images/onboarding-sync/2x.png
diff --git a/public/images/onboarding-sync/3x.png b/apps/photos/public/images/onboarding-sync/3x.png
similarity index 100%
rename from public/images/onboarding-sync/3x.png
rename to apps/photos/public/images/onboarding-sync/3x.png
diff --git a/public/images/subscription-card-background/1x.png b/apps/photos/public/images/subscription-card-background/1x.png
similarity index 100%
rename from public/images/subscription-card-background/1x.png
rename to apps/photos/public/images/subscription-card-background/1x.png
diff --git a/public/images/subscription-card-background/2x.png b/apps/photos/public/images/subscription-card-background/2x.png
similarity index 100%
rename from public/images/subscription-card-background/2x.png
rename to apps/photos/public/images/subscription-card-background/2x.png
diff --git a/public/images/subscription-card-background/3x.png b/apps/photos/public/images/subscription-card-background/3x.png
similarity index 100%
rename from public/images/subscription-card-background/3x.png
rename to apps/photos/public/images/subscription-card-background/3x.png
diff --git a/public/js/ffmpeg/ffmpeg-core.js b/apps/photos/public/js/ffmpeg/ffmpeg-core.js
similarity index 100%
rename from public/js/ffmpeg/ffmpeg-core.js
rename to apps/photos/public/js/ffmpeg/ffmpeg-core.js
diff --git a/public/js/ffmpeg/ffmpeg-core.wasm b/apps/photos/public/js/ffmpeg/ffmpeg-core.wasm
similarity index 100%
rename from public/js/ffmpeg/ffmpeg-core.wasm
rename to apps/photos/public/js/ffmpeg/ffmpeg-core.wasm
diff --git a/public/js/tesseract/tesseract-core.wasm.js b/apps/photos/public/js/tesseract/tesseract-core.wasm.js
similarity index 100%
rename from public/js/tesseract/tesseract-core.wasm.js
rename to apps/photos/public/js/tesseract/tesseract-core.wasm.js
diff --git a/public/js/tesseract/worker.min.js b/apps/photos/public/js/tesseract/worker.min.js
similarity index 100%
rename from public/js/tesseract/worker.min.js
rename to apps/photos/public/js/tesseract/worker.min.js
diff --git a/public/js/tfjs/tfjs-backend-wasm-simd.wasm b/apps/photos/public/js/tfjs/tfjs-backend-wasm-simd.wasm
similarity index 100%
rename from public/js/tfjs/tfjs-backend-wasm-simd.wasm
rename to apps/photos/public/js/tfjs/tfjs-backend-wasm-simd.wasm
diff --git a/public/js/tfjs/tfjs-backend-wasm-threaded-simd.wasm b/apps/photos/public/js/tfjs/tfjs-backend-wasm-threaded-simd.wasm
similarity index 100%
rename from public/js/tfjs/tfjs-backend-wasm-threaded-simd.wasm
rename to apps/photos/public/js/tfjs/tfjs-backend-wasm-threaded-simd.wasm
diff --git a/public/js/tfjs/tfjs-backend-wasm.wasm b/apps/photos/public/js/tfjs/tfjs-backend-wasm.wasm
similarity index 100%
rename from public/js/tfjs/tfjs-backend-wasm.wasm
rename to apps/photos/public/js/tfjs/tfjs-backend-wasm.wasm
diff --git a/public/js/tflite/tflite_web_api_cc.js b/apps/photos/public/js/tflite/tflite_web_api_cc.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc.js
diff --git a/public/js/tflite/tflite_web_api_cc.wasm b/apps/photos/public/js/tflite/tflite_web_api_cc.wasm
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc.wasm
rename to apps/photos/public/js/tflite/tflite_web_api_cc.wasm
diff --git a/public/js/tflite/tflite_web_api_cc_simd.js b/apps/photos/public/js/tflite/tflite_web_api_cc_simd.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_simd.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc_simd.js
diff --git a/public/js/tflite/tflite_web_api_cc_simd.wasm b/apps/photos/public/js/tflite/tflite_web_api_cc_simd.wasm
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_simd.wasm
rename to apps/photos/public/js/tflite/tflite_web_api_cc_simd.wasm
diff --git a/public/js/tflite/tflite_web_api_cc_simd_threaded.js b/apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_simd_threaded.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.js
diff --git a/public/js/tflite/tflite_web_api_cc_simd_threaded.wasm b/apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.wasm
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_simd_threaded.wasm
rename to apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.wasm
diff --git a/public/js/tflite/tflite_web_api_cc_simd_threaded.worker.js b/apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.worker.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_simd_threaded.worker.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc_simd_threaded.worker.js
diff --git a/public/js/tflite/tflite_web_api_cc_threaded.js b/apps/photos/public/js/tflite/tflite_web_api_cc_threaded.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_threaded.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc_threaded.js
diff --git a/public/js/tflite/tflite_web_api_cc_threaded.wasm b/apps/photos/public/js/tflite/tflite_web_api_cc_threaded.wasm
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_threaded.wasm
rename to apps/photos/public/js/tflite/tflite_web_api_cc_threaded.wasm
diff --git a/public/js/tflite/tflite_web_api_cc_threaded.worker.js b/apps/photos/public/js/tflite/tflite_web_api_cc_threaded.worker.js
similarity index 100%
rename from public/js/tflite/tflite_web_api_cc_threaded.worker.js
rename to apps/photos/public/js/tflite/tflite_web_api_cc_threaded.worker.js
diff --git a/public/locales/de/translation.json b/apps/photos/public/locales/de/translation.json
similarity index 100%
rename from public/locales/de/translation.json
rename to apps/photos/public/locales/de/translation.json
diff --git a/public/locales/en/translation.json b/apps/photos/public/locales/en/translation.json
similarity index 100%
rename from public/locales/en/translation.json
rename to apps/photos/public/locales/en/translation.json
diff --git a/public/locales/es/translation.json b/apps/photos/public/locales/es/translation.json
similarity index 100%
rename from public/locales/es/translation.json
rename to apps/photos/public/locales/es/translation.json
diff --git a/public/locales/fa/translation.json b/apps/photos/public/locales/fa/translation.json
similarity index 100%
rename from public/locales/fa/translation.json
rename to apps/photos/public/locales/fa/translation.json
diff --git a/public/locales/fi/translation.json b/apps/photos/public/locales/fi/translation.json
similarity index 100%
rename from public/locales/fi/translation.json
rename to apps/photos/public/locales/fi/translation.json
diff --git a/public/locales/fr/translation.json b/apps/photos/public/locales/fr/translation.json
similarity index 100%
rename from public/locales/fr/translation.json
rename to apps/photos/public/locales/fr/translation.json
diff --git a/public/locales/it/translation.json b/apps/photos/public/locales/it/translation.json
similarity index 100%
rename from public/locales/it/translation.json
rename to apps/photos/public/locales/it/translation.json
diff --git a/public/locales/nl/translation.json b/apps/photos/public/locales/nl/translation.json
similarity index 100%
rename from public/locales/nl/translation.json
rename to apps/photos/public/locales/nl/translation.json
diff --git a/public/locales/pt/translation.json b/apps/photos/public/locales/pt/translation.json
similarity index 100%
rename from public/locales/pt/translation.json
rename to apps/photos/public/locales/pt/translation.json
diff --git a/public/locales/ru/translation.json b/apps/photos/public/locales/ru/translation.json
similarity index 100%
rename from public/locales/ru/translation.json
rename to apps/photos/public/locales/ru/translation.json
diff --git a/public/locales/tr/translation.json b/apps/photos/public/locales/tr/translation.json
similarity index 100%
rename from public/locales/tr/translation.json
rename to apps/photos/public/locales/tr/translation.json
diff --git a/public/locales/zh/translation.json b/apps/photos/public/locales/zh/translation.json
similarity index 100%
rename from public/locales/zh/translation.json
rename to apps/photos/public/locales/zh/translation.json
diff --git a/public/manifest.json b/apps/photos/public/manifest.json
similarity index 100%
rename from public/manifest.json
rename to apps/photos/public/manifest.json
diff --git a/public/models/blazeface/back/group1-shard1of1.bin b/apps/photos/public/models/blazeface/back/group1-shard1of1.bin
similarity index 100%
rename from public/models/blazeface/back/group1-shard1of1.bin
rename to apps/photos/public/models/blazeface/back/group1-shard1of1.bin
diff --git a/public/models/blazeface/back/model.json b/apps/photos/public/models/blazeface/back/model.json
similarity index 100%
rename from public/models/blazeface/back/model.json
rename to apps/photos/public/models/blazeface/back/model.json
diff --git a/public/models/imagescene/group1-shard1of7.bin b/apps/photos/public/models/imagescene/group1-shard1of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard1of7.bin
rename to apps/photos/public/models/imagescene/group1-shard1of7.bin
diff --git a/public/models/imagescene/group1-shard2of7.bin b/apps/photos/public/models/imagescene/group1-shard2of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard2of7.bin
rename to apps/photos/public/models/imagescene/group1-shard2of7.bin
diff --git a/public/models/imagescene/group1-shard3of7.bin b/apps/photos/public/models/imagescene/group1-shard3of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard3of7.bin
rename to apps/photos/public/models/imagescene/group1-shard3of7.bin
diff --git a/public/models/imagescene/group1-shard4of7.bin b/apps/photos/public/models/imagescene/group1-shard4of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard4of7.bin
rename to apps/photos/public/models/imagescene/group1-shard4of7.bin
diff --git a/public/models/imagescene/group1-shard5of7.bin b/apps/photos/public/models/imagescene/group1-shard5of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard5of7.bin
rename to apps/photos/public/models/imagescene/group1-shard5of7.bin
diff --git a/public/models/imagescene/group1-shard6of7.bin b/apps/photos/public/models/imagescene/group1-shard6of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard6of7.bin
rename to apps/photos/public/models/imagescene/group1-shard6of7.bin
diff --git a/public/models/imagescene/group1-shard7of7.bin b/apps/photos/public/models/imagescene/group1-shard7of7.bin
similarity index 100%
rename from public/models/imagescene/group1-shard7of7.bin
rename to apps/photos/public/models/imagescene/group1-shard7of7.bin
diff --git a/public/models/imagescene/model.json b/apps/photos/public/models/imagescene/model.json
similarity index 100%
rename from public/models/imagescene/model.json
rename to apps/photos/public/models/imagescene/model.json
diff --git a/public/models/imagescene/sceneMap.json b/apps/photos/public/models/imagescene/sceneMap.json
similarity index 100%
rename from public/models/imagescene/sceneMap.json
rename to apps/photos/public/models/imagescene/sceneMap.json
diff --git a/public/models/mobilefacenet/mobilefacenet.tflite b/apps/photos/public/models/mobilefacenet/mobilefacenet.tflite
similarity index 100%
rename from public/models/mobilefacenet/mobilefacenet.tflite
rename to apps/photos/public/models/mobilefacenet/mobilefacenet.tflite
diff --git a/public/models/ssdmobilenet/group1-shard1of7 b/apps/photos/public/models/ssdmobilenet/group1-shard1of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard1of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard1of7
diff --git a/public/models/ssdmobilenet/group1-shard2of7 b/apps/photos/public/models/ssdmobilenet/group1-shard2of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard2of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard2of7
diff --git a/public/models/ssdmobilenet/group1-shard3of7 b/apps/photos/public/models/ssdmobilenet/group1-shard3of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard3of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard3of7
diff --git a/public/models/ssdmobilenet/group1-shard4of7 b/apps/photos/public/models/ssdmobilenet/group1-shard4of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard4of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard4of7
diff --git a/public/models/ssdmobilenet/group1-shard5of7 b/apps/photos/public/models/ssdmobilenet/group1-shard5of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard5of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard5of7
diff --git a/public/models/ssdmobilenet/group1-shard6of7 b/apps/photos/public/models/ssdmobilenet/group1-shard6of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard6of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard6of7
diff --git a/public/models/ssdmobilenet/group1-shard7of7 b/apps/photos/public/models/ssdmobilenet/group1-shard7of7
similarity index 100%
rename from public/models/ssdmobilenet/group1-shard7of7
rename to apps/photos/public/models/ssdmobilenet/group1-shard7of7
diff --git a/public/models/ssdmobilenet/model.json b/apps/photos/public/models/ssdmobilenet/model.json
similarity index 100%
rename from public/models/ssdmobilenet/model.json
rename to apps/photos/public/models/ssdmobilenet/model.json
diff --git a/public/models/ssdmobilenet/weights_manifest.json b/apps/photos/public/models/ssdmobilenet/weights_manifest.json
similarity index 100%
rename from public/models/ssdmobilenet/weights_manifest.json
rename to apps/photos/public/models/ssdmobilenet/weights_manifest.json
diff --git a/apps/photos/public/netlify.toml b/apps/photos/public/netlify.toml
new file mode 100644
index 000000000..eb9e76ef4
--- /dev/null
+++ b/apps/photos/public/netlify.toml
@@ -0,0 +1,11 @@
+[build]
+ command = "npm run build"
+ publish = "out"
+
+[[headers]]
+ for = "/*"
+ [headers.values]
+ X-Frame-Options = "DENY"
+ X-XSS-Protection = "1; mode=block"
+ Cross-Origin-Opener-Policy = "same-origin"
+ Cross-Origin-Embedder-Policy = "require-corp"
\ No newline at end of file
diff --git a/public/offline.html b/apps/photos/public/offline.html
similarity index 100%
rename from public/offline.html
rename to apps/photos/public/offline.html
diff --git a/public/pwa/slide-1.jpg b/apps/photos/public/pwa/slide-1.jpg
similarity index 100%
rename from public/pwa/slide-1.jpg
rename to apps/photos/public/pwa/slide-1.jpg
diff --git a/public/pwa/slide-2.jpg b/apps/photos/public/pwa/slide-2.jpg
similarity index 100%
rename from public/pwa/slide-2.jpg
rename to apps/photos/public/pwa/slide-2.jpg
diff --git a/public/pwa/slide-3.jpg b/apps/photos/public/pwa/slide-3.jpg
similarity index 100%
rename from public/pwa/slide-3.jpg
rename to apps/photos/public/pwa/slide-3.jpg
diff --git a/public/pwa/slide-4.jpg b/apps/photos/public/pwa/slide-4.jpg
similarity index 100%
rename from public/pwa/slide-4.jpg
rename to apps/photos/public/pwa/slide-4.jpg
diff --git a/public/pwa/slide-5.jpg b/apps/photos/public/pwa/slide-5.jpg
similarity index 100%
rename from public/pwa/slide-5.jpg
rename to apps/photos/public/pwa/slide-5.jpg
diff --git a/public/robots.txt b/apps/photos/public/robots.txt
similarity index 100%
rename from public/robots.txt
rename to apps/photos/public/robots.txt
diff --git a/scripts/purge_unused_strings.sh b/apps/photos/scripts/purge_unused_strings.sh
similarity index 100%
rename from scripts/purge_unused_strings.sh
rename to apps/photos/scripts/purge_unused_strings.sh
diff --git a/sentry.client.config.js b/apps/photos/sentry.client.config.js
similarity index 100%
rename from sentry.client.config.js
rename to apps/photos/sentry.client.config.js
diff --git a/sentry.properties b/apps/photos/sentry.properties
similarity index 100%
rename from sentry.properties
rename to apps/photos/sentry.properties
diff --git a/sentry.server.config.js b/apps/photos/sentry.server.config.js
similarity index 100%
rename from sentry.server.config.js
rename to apps/photos/sentry.server.config.js
diff --git a/sentryConfigUtil.js b/apps/photos/sentryConfigUtil.js
similarity index 100%
rename from sentryConfigUtil.js
rename to apps/photos/sentryConfigUtil.js
diff --git a/src/components/AddToCollectionBtn.tsx b/apps/photos/src/components/AddToCollectionBtn.tsx
similarity index 100%
rename from src/components/AddToCollectionBtn.tsx
rename to apps/photos/src/components/AddToCollectionBtn.tsx
diff --git a/src/components/Authenicator/AuthFooter.tsx b/apps/photos/src/components/Authenicator/AuthFooter.tsx
similarity index 100%
rename from src/components/Authenicator/AuthFooter.tsx
rename to apps/photos/src/components/Authenicator/AuthFooter.tsx
diff --git a/src/components/Authenicator/OTPDisplay.tsx b/apps/photos/src/components/Authenicator/OTPDisplay.tsx
similarity index 100%
rename from src/components/Authenicator/OTPDisplay.tsx
rename to apps/photos/src/components/Authenicator/OTPDisplay.tsx
diff --git a/src/components/Authenicator/TimerProgress.tsx b/apps/photos/src/components/Authenicator/TimerProgress.tsx
similarity index 100%
rename from src/components/Authenicator/TimerProgress.tsx
rename to apps/photos/src/components/Authenicator/TimerProgress.tsx
diff --git a/src/components/AuthenticateUserModal.tsx b/apps/photos/src/components/AuthenticateUserModal.tsx
similarity index 100%
rename from src/components/AuthenticateUserModal.tsx
rename to apps/photos/src/components/AuthenticateUserModal.tsx
diff --git a/src/components/Badge.tsx b/apps/photos/src/components/Badge.tsx
similarity index 100%
rename from src/components/Badge.tsx
rename to apps/photos/src/components/Badge.tsx
diff --git a/src/components/CaptionedText.tsx b/apps/photos/src/components/CaptionedText.tsx
similarity index 100%
rename from src/components/CaptionedText.tsx
rename to apps/photos/src/components/CaptionedText.tsx
diff --git a/src/components/ChangeEmail.tsx b/apps/photos/src/components/ChangeEmail.tsx
similarity index 100%
rename from src/components/ChangeEmail.tsx
rename to apps/photos/src/components/ChangeEmail.tsx
diff --git a/src/components/CheckboxInput.tsx b/apps/photos/src/components/CheckboxInput.tsx
similarity index 100%
rename from src/components/CheckboxInput.tsx
rename to apps/photos/src/components/CheckboxInput.tsx
diff --git a/src/components/Chip.tsx b/apps/photos/src/components/Chip.tsx
similarity index 100%
rename from src/components/Chip.tsx
rename to apps/photos/src/components/Chip.tsx
diff --git a/src/components/CodeBlock/CopyButton.tsx b/apps/photos/src/components/CodeBlock/CopyButton.tsx
similarity index 100%
rename from src/components/CodeBlock/CopyButton.tsx
rename to apps/photos/src/components/CodeBlock/CopyButton.tsx
diff --git a/src/components/CodeBlock/index.tsx b/apps/photos/src/components/CodeBlock/index.tsx
similarity index 100%
rename from src/components/CodeBlock/index.tsx
rename to apps/photos/src/components/CodeBlock/index.tsx
diff --git a/src/components/CodeBlock/styledComponents.tsx b/apps/photos/src/components/CodeBlock/styledComponents.tsx
similarity index 100%
rename from src/components/CodeBlock/styledComponents.tsx
rename to apps/photos/src/components/CodeBlock/styledComponents.tsx
diff --git a/src/components/Collections/AllCollections/CollectionSort/index.tsx b/apps/photos/src/components/Collections/AllCollections/CollectionSort/index.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/CollectionSort/index.tsx
rename to apps/photos/src/components/Collections/AllCollections/CollectionSort/index.tsx
diff --git a/src/components/Collections/AllCollections/CollectionSort/optionCreator.tsx b/apps/photos/src/components/Collections/AllCollections/CollectionSort/optionCreator.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/CollectionSort/optionCreator.tsx
rename to apps/photos/src/components/Collections/AllCollections/CollectionSort/optionCreator.tsx
diff --git a/src/components/Collections/AllCollections/CollectionSort/options.tsx b/apps/photos/src/components/Collections/AllCollections/CollectionSort/options.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/CollectionSort/options.tsx
rename to apps/photos/src/components/Collections/AllCollections/CollectionSort/options.tsx
diff --git a/src/components/Collections/AllCollections/collectionCard.tsx b/apps/photos/src/components/Collections/AllCollections/collectionCard.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/collectionCard.tsx
rename to apps/photos/src/components/Collections/AllCollections/collectionCard.tsx
diff --git a/src/components/Collections/AllCollections/content.tsx b/apps/photos/src/components/Collections/AllCollections/content.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/content.tsx
rename to apps/photos/src/components/Collections/AllCollections/content.tsx
diff --git a/src/components/Collections/AllCollections/dialog.tsx b/apps/photos/src/components/Collections/AllCollections/dialog.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/dialog.tsx
rename to apps/photos/src/components/Collections/AllCollections/dialog.tsx
diff --git a/src/components/Collections/AllCollections/header.tsx b/apps/photos/src/components/Collections/AllCollections/header.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/header.tsx
rename to apps/photos/src/components/Collections/AllCollections/header.tsx
diff --git a/src/components/Collections/AllCollections/index.tsx b/apps/photos/src/components/Collections/AllCollections/index.tsx
similarity index 100%
rename from src/components/Collections/AllCollections/index.tsx
rename to apps/photos/src/components/Collections/AllCollections/index.tsx
diff --git a/src/components/Collections/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionCard.tsx
similarity index 100%
rename from src/components/Collections/CollectionCard.tsx
rename to apps/photos/src/components/Collections/CollectionCard.tsx
diff --git a/src/components/Collections/CollectionInfo.tsx b/apps/photos/src/components/Collections/CollectionInfo.tsx
similarity index 100%
rename from src/components/Collections/CollectionInfo.tsx
rename to apps/photos/src/components/Collections/CollectionInfo.tsx
diff --git a/src/components/Collections/CollectionInfoWithOptions.tsx b/apps/photos/src/components/Collections/CollectionInfoWithOptions.tsx
similarity index 100%
rename from src/components/Collections/CollectionInfoWithOptions.tsx
rename to apps/photos/src/components/Collections/CollectionInfoWithOptions.tsx
diff --git a/src/components/Collections/CollectionListBar/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx
similarity index 100%
rename from src/components/Collections/CollectionListBar/CollectionCard.tsx
rename to apps/photos/src/components/Collections/CollectionListBar/CollectionCard.tsx
diff --git a/src/components/Collections/CollectionListBar/ScrollButton.tsx b/apps/photos/src/components/Collections/CollectionListBar/ScrollButton.tsx
similarity index 100%
rename from src/components/Collections/CollectionListBar/ScrollButton.tsx
rename to apps/photos/src/components/Collections/CollectionListBar/ScrollButton.tsx
diff --git a/src/components/Collections/CollectionListBar/index.tsx b/apps/photos/src/components/Collections/CollectionListBar/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionListBar/index.tsx
rename to apps/photos/src/components/Collections/CollectionListBar/index.tsx
diff --git a/src/components/Collections/CollectionNamer.tsx b/apps/photos/src/components/Collections/CollectionNamer.tsx
similarity index 100%
rename from src/components/Collections/CollectionNamer.tsx
rename to apps/photos/src/components/Collections/CollectionNamer.tsx
diff --git a/src/components/Collections/CollectionOptions/AlbumCollectionOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/AlbumCollectionOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/AlbumCollectionOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/AlbumCollectionOption.tsx
diff --git a/src/components/Collections/CollectionOptions/OnlyDownloadCollectionOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/OnlyDownloadCollectionOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/OnlyDownloadCollectionOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/OnlyDownloadCollectionOption.tsx
diff --git a/src/components/Collections/CollectionOptions/QuickOptions/DownloadQuickOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/QuickOptions/DownloadQuickOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/QuickOptions/DownloadQuickOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/QuickOptions/DownloadQuickOption.tsx
diff --git a/src/components/Collections/CollectionOptions/QuickOptions/EmptyTrashQuickOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/QuickOptions/EmptyTrashQuickOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/QuickOptions/EmptyTrashQuickOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/QuickOptions/EmptyTrashQuickOption.tsx
diff --git a/src/components/Collections/CollectionOptions/QuickOptions/ShareQuickOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/QuickOptions/ShareQuickOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/QuickOptions/ShareQuickOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/QuickOptions/ShareQuickOption.tsx
diff --git a/src/components/Collections/CollectionOptions/QuickOptions/index.tsx b/apps/photos/src/components/Collections/CollectionOptions/QuickOptions/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/QuickOptions/index.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/QuickOptions/index.tsx
diff --git a/src/components/Collections/CollectionOptions/SharedCollectionOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/SharedCollectionOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/SharedCollectionOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/SharedCollectionOption.tsx
diff --git a/src/components/Collections/CollectionOptions/TrashCollectionOption.tsx b/apps/photos/src/components/Collections/CollectionOptions/TrashCollectionOption.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/TrashCollectionOption.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/TrashCollectionOption.tsx
diff --git a/src/components/Collections/CollectionOptions/index.tsx b/apps/photos/src/components/Collections/CollectionOptions/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionOptions/index.tsx
rename to apps/photos/src/components/Collections/CollectionOptions/index.tsx
diff --git a/src/components/Collections/CollectionSelector/AddCollectionButton.tsx b/apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx
similarity index 100%
rename from src/components/Collections/CollectionSelector/AddCollectionButton.tsx
rename to apps/photos/src/components/Collections/CollectionSelector/AddCollectionButton.tsx
diff --git a/src/components/Collections/CollectionSelector/CollectionCard.tsx b/apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx
similarity index 100%
rename from src/components/Collections/CollectionSelector/CollectionCard.tsx
rename to apps/photos/src/components/Collections/CollectionSelector/CollectionCard.tsx
diff --git a/src/components/Collections/CollectionSelector/index.tsx b/apps/photos/src/components/Collections/CollectionSelector/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionSelector/index.tsx
rename to apps/photos/src/components/Collections/CollectionSelector/index.tsx
diff --git a/src/components/Collections/CollectionShare/container.tsx b/apps/photos/src/components/Collections/CollectionShare/container.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/container.tsx
rename to apps/photos/src/components/Collections/CollectionShare/container.tsx
diff --git a/src/components/Collections/CollectionShare/emailShare.tsx b/apps/photos/src/components/Collections/CollectionShare/emailShare.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/emailShare.tsx
rename to apps/photos/src/components/Collections/CollectionShare/emailShare.tsx
diff --git a/src/components/Collections/CollectionShare/index.tsx b/apps/photos/src/components/Collections/CollectionShare/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/index.tsx
rename to apps/photos/src/components/Collections/CollectionShare/index.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/EnablePublicShareOptions.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/copyLinkModal.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/index.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/index.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/index.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/deviceLimit.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/downloadAccess.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/downloadAccess.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/downloadAccess.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/downloadAccess.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/index.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/index.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/index.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/linkExpiry.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkExpiry.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/linkExpiry.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkExpiry.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/index.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/linkPassword/setPassword.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/publicCollect.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/publicCollect.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/publicCollect.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/publicCollect.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/LabelWithDivider.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/LabelWithDivider.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/selectComponents/LabelWithDivider.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/LabelWithDivider.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/OptionWithDivider.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/OptionWithDivider.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/manage/selectComponents/OptionWithDivider.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/manage/selectComponents/OptionWithDivider.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/managePublicShare.tsx
diff --git a/src/components/Collections/CollectionShare/publicShare/switch.tsx b/apps/photos/src/components/Collections/CollectionShare/publicShare/switch.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/publicShare/switch.tsx
rename to apps/photos/src/components/Collections/CollectionShare/publicShare/switch.tsx
diff --git a/src/components/Collections/CollectionShare/sharees/index.tsx b/apps/photos/src/components/Collections/CollectionShare/sharees/index.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/sharees/index.tsx
rename to apps/photos/src/components/Collections/CollectionShare/sharees/index.tsx
diff --git a/src/components/Collections/CollectionShare/sharees/row.tsx b/apps/photos/src/components/Collections/CollectionShare/sharees/row.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/sharees/row.tsx
rename to apps/photos/src/components/Collections/CollectionShare/sharees/row.tsx
diff --git a/src/components/Collections/CollectionShare/styledComponents.tsx b/apps/photos/src/components/Collections/CollectionShare/styledComponents.tsx
similarity index 100%
rename from src/components/Collections/CollectionShare/styledComponents.tsx
rename to apps/photos/src/components/Collections/CollectionShare/styledComponents.tsx
diff --git a/src/components/Collections/index.tsx b/apps/photos/src/components/Collections/index.tsx
similarity index 100%
rename from src/components/Collections/index.tsx
rename to apps/photos/src/components/Collections/index.tsx
diff --git a/src/components/Collections/styledComponents.ts b/apps/photos/src/components/Collections/styledComponents.ts
similarity index 100%
rename from src/components/Collections/styledComponents.ts
rename to apps/photos/src/components/Collections/styledComponents.ts
diff --git a/src/components/Container.ts b/apps/photos/src/components/Container.ts
similarity index 100%
rename from src/components/Container.ts
rename to apps/photos/src/components/Container.ts
diff --git a/src/components/DeleteAccountModal.tsx b/apps/photos/src/components/DeleteAccountModal.tsx
similarity index 100%
rename from src/components/DeleteAccountModal.tsx
rename to apps/photos/src/components/DeleteAccountModal.tsx
diff --git a/src/components/DialogBox/DialogIcon.tsx b/apps/photos/src/components/DialogBox/DialogIcon.tsx
similarity index 100%
rename from src/components/DialogBox/DialogIcon.tsx
rename to apps/photos/src/components/DialogBox/DialogIcon.tsx
diff --git a/src/components/DialogBox/TitleWithCloseButton.tsx b/apps/photos/src/components/DialogBox/TitleWithCloseButton.tsx
similarity index 100%
rename from src/components/DialogBox/TitleWithCloseButton.tsx
rename to apps/photos/src/components/DialogBox/TitleWithCloseButton.tsx
diff --git a/src/components/DialogBox/base.tsx b/apps/photos/src/components/DialogBox/base.tsx
similarity index 100%
rename from src/components/DialogBox/base.tsx
rename to apps/photos/src/components/DialogBox/base.tsx
diff --git a/src/components/DialogBox/index.tsx b/apps/photos/src/components/DialogBox/index.tsx
similarity index 100%
rename from src/components/DialogBox/index.tsx
rename to apps/photos/src/components/DialogBox/index.tsx
diff --git a/src/components/DialogBoxV2/index.tsx b/apps/photos/src/components/DialogBoxV2/index.tsx
similarity index 100%
rename from src/components/DialogBoxV2/index.tsx
rename to apps/photos/src/components/DialogBoxV2/index.tsx
diff --git a/src/components/DropdownInput.tsx b/apps/photos/src/components/DropdownInput.tsx
similarity index 100%
rename from src/components/DropdownInput.tsx
rename to apps/photos/src/components/DropdownInput.tsx
diff --git a/src/components/EmptyScreen.tsx b/apps/photos/src/components/EmptyScreen.tsx
similarity index 100%
rename from src/components/EmptyScreen.tsx
rename to apps/photos/src/components/EmptyScreen.tsx
diff --git a/src/components/EnteButton.tsx b/apps/photos/src/components/EnteButton.tsx
similarity index 100%
rename from src/components/EnteButton.tsx
rename to apps/photos/src/components/EnteButton.tsx
diff --git a/src/components/EnteDateTimePicker.tsx b/apps/photos/src/components/EnteDateTimePicker.tsx
similarity index 100%
rename from src/components/EnteDateTimePicker.tsx
rename to apps/photos/src/components/EnteDateTimePicker.tsx
diff --git a/src/components/EnteDrawer.tsx b/apps/photos/src/components/EnteDrawer.tsx
similarity index 100%
rename from src/components/EnteDrawer.tsx
rename to apps/photos/src/components/EnteDrawer.tsx
diff --git a/src/components/EnteLogo.tsx b/apps/photos/src/components/EnteLogo.tsx
similarity index 100%
rename from src/components/EnteLogo.tsx
rename to apps/photos/src/components/EnteLogo.tsx
diff --git a/src/components/EnteSpinner.tsx b/apps/photos/src/components/EnteSpinner.tsx
similarity index 100%
rename from src/components/EnteSpinner.tsx
rename to apps/photos/src/components/EnteSpinner.tsx
diff --git a/src/components/ExportFinished.tsx b/apps/photos/src/components/ExportFinished.tsx
similarity index 100%
rename from src/components/ExportFinished.tsx
rename to apps/photos/src/components/ExportFinished.tsx
diff --git a/src/components/ExportInProgress.tsx b/apps/photos/src/components/ExportInProgress.tsx
similarity index 100%
rename from src/components/ExportInProgress.tsx
rename to apps/photos/src/components/ExportInProgress.tsx
diff --git a/src/components/ExportInit.tsx b/apps/photos/src/components/ExportInit.tsx
similarity index 100%
rename from src/components/ExportInit.tsx
rename to apps/photos/src/components/ExportInit.tsx
diff --git a/src/components/ExportModal.tsx b/apps/photos/src/components/ExportModal.tsx
similarity index 100%
rename from src/components/ExportModal.tsx
rename to apps/photos/src/components/ExportModal.tsx
diff --git a/src/components/FileList.tsx b/apps/photos/src/components/FileList.tsx
similarity index 100%
rename from src/components/FileList.tsx
rename to apps/photos/src/components/FileList.tsx
diff --git a/src/components/FixCreationTime/footer.tsx b/apps/photos/src/components/FixCreationTime/footer.tsx
similarity index 100%
rename from src/components/FixCreationTime/footer.tsx
rename to apps/photos/src/components/FixCreationTime/footer.tsx
diff --git a/src/components/FixCreationTime/index.tsx b/apps/photos/src/components/FixCreationTime/index.tsx
similarity index 100%
rename from src/components/FixCreationTime/index.tsx
rename to apps/photos/src/components/FixCreationTime/index.tsx
diff --git a/src/components/FixCreationTime/options.tsx b/apps/photos/src/components/FixCreationTime/options.tsx
similarity index 100%
rename from src/components/FixCreationTime/options.tsx
rename to apps/photos/src/components/FixCreationTime/options.tsx
diff --git a/src/components/FixCreationTime/running.tsx b/apps/photos/src/components/FixCreationTime/running.tsx
similarity index 100%
rename from src/components/FixCreationTime/running.tsx
rename to apps/photos/src/components/FixCreationTime/running.tsx
diff --git a/src/components/FixLargeThumbnail.tsx b/apps/photos/src/components/FixLargeThumbnail.tsx
similarity index 100%
rename from src/components/FixLargeThumbnail.tsx
rename to apps/photos/src/components/FixLargeThumbnail.tsx
diff --git a/src/components/Form/FormContainer.tsx b/apps/photos/src/components/Form/FormContainer.tsx
similarity index 100%
rename from src/components/Form/FormContainer.tsx
rename to apps/photos/src/components/Form/FormContainer.tsx
diff --git a/src/components/Form/FormPaper/Footer.tsx b/apps/photos/src/components/Form/FormPaper/Footer.tsx
similarity index 100%
rename from src/components/Form/FormPaper/Footer.tsx
rename to apps/photos/src/components/Form/FormPaper/Footer.tsx
diff --git a/src/components/Form/FormPaper/Title.tsx b/apps/photos/src/components/Form/FormPaper/Title.tsx
similarity index 100%
rename from src/components/Form/FormPaper/Title.tsx
rename to apps/photos/src/components/Form/FormPaper/Title.tsx
diff --git a/src/components/Form/FormPaper/index.tsx b/apps/photos/src/components/Form/FormPaper/index.tsx
similarity index 100%
rename from src/components/Form/FormPaper/index.tsx
rename to apps/photos/src/components/Form/FormPaper/index.tsx
diff --git a/src/components/Form/ShowHidePassword.tsx b/apps/photos/src/components/Form/ShowHidePassword.tsx
similarity index 100%
rename from src/components/Form/ShowHidePassword.tsx
rename to apps/photos/src/components/Form/ShowHidePassword.tsx
diff --git a/src/components/FullScreenDropZone.tsx b/apps/photos/src/components/FullScreenDropZone.tsx
similarity index 100%
rename from src/components/FullScreenDropZone.tsx
rename to apps/photos/src/components/FullScreenDropZone.tsx
diff --git a/src/components/LivePhotoBtn.tsx b/apps/photos/src/components/LivePhotoBtn.tsx
similarity index 100%
rename from src/components/LivePhotoBtn.tsx
rename to apps/photos/src/components/LivePhotoBtn.tsx
diff --git a/src/components/LoadingOverlay.tsx b/apps/photos/src/components/LoadingOverlay.tsx
similarity index 100%
rename from src/components/LoadingOverlay.tsx
rename to apps/photos/src/components/LoadingOverlay.tsx
diff --git a/src/components/Login.tsx b/apps/photos/src/components/Login.tsx
similarity index 100%
rename from src/components/Login.tsx
rename to apps/photos/src/components/Login.tsx
diff --git a/src/components/MachineLearning/ConfigEditor.tsx b/apps/photos/src/components/MachineLearning/ConfigEditor.tsx
similarity index 100%
rename from src/components/MachineLearning/ConfigEditor.tsx
rename to apps/photos/src/components/MachineLearning/ConfigEditor.tsx
diff --git a/src/components/MachineLearning/ImageViews.tsx b/apps/photos/src/components/MachineLearning/ImageViews.tsx
similarity index 100%
rename from src/components/MachineLearning/ImageViews.tsx
rename to apps/photos/src/components/MachineLearning/ImageViews.tsx
diff --git a/src/components/MachineLearning/MLFileDebugView.tsx b/apps/photos/src/components/MachineLearning/MLFileDebugView.tsx
similarity index 100%
rename from src/components/MachineLearning/MLFileDebugView.tsx
rename to apps/photos/src/components/MachineLearning/MLFileDebugView.tsx
diff --git a/src/components/MachineLearning/MLSearchSettings/enableFaceSearch.tsx b/apps/photos/src/components/MachineLearning/MLSearchSettings/enableFaceSearch.tsx
similarity index 100%
rename from src/components/MachineLearning/MLSearchSettings/enableFaceSearch.tsx
rename to apps/photos/src/components/MachineLearning/MLSearchSettings/enableFaceSearch.tsx
diff --git a/src/components/MachineLearning/MLSearchSettings/enableMLSearch.tsx b/apps/photos/src/components/MachineLearning/MLSearchSettings/enableMLSearch.tsx
similarity index 100%
rename from src/components/MachineLearning/MLSearchSettings/enableMLSearch.tsx
rename to apps/photos/src/components/MachineLearning/MLSearchSettings/enableMLSearch.tsx
diff --git a/src/components/MachineLearning/MLSearchSettings/index.tsx b/apps/photos/src/components/MachineLearning/MLSearchSettings/index.tsx
similarity index 100%
rename from src/components/MachineLearning/MLSearchSettings/index.tsx
rename to apps/photos/src/components/MachineLearning/MLSearchSettings/index.tsx
diff --git a/src/components/MachineLearning/MLSearchSettings/manageMLSearch.tsx b/apps/photos/src/components/MachineLearning/MLSearchSettings/manageMLSearch.tsx
similarity index 100%
rename from src/components/MachineLearning/MLSearchSettings/manageMLSearch.tsx
rename to apps/photos/src/components/MachineLearning/MLSearchSettings/manageMLSearch.tsx
diff --git a/src/components/MachineLearning/MLServiceFileInfoButton.tsx b/apps/photos/src/components/MachineLearning/MLServiceFileInfoButton.tsx
similarity index 100%
rename from src/components/MachineLearning/MLServiceFileInfoButton.tsx
rename to apps/photos/src/components/MachineLearning/MLServiceFileInfoButton.tsx
diff --git a/src/components/MachineLearning/MlDebug-disabled.tsx b/apps/photos/src/components/MachineLearning/MlDebug-disabled.tsx
similarity index 100%
rename from src/components/MachineLearning/MlDebug-disabled.tsx
rename to apps/photos/src/components/MachineLearning/MlDebug-disabled.tsx
diff --git a/src/components/MachineLearning/ObjectList.tsx b/apps/photos/src/components/MachineLearning/ObjectList.tsx
similarity index 100%
rename from src/components/MachineLearning/ObjectList.tsx
rename to apps/photos/src/components/MachineLearning/ObjectList.tsx
diff --git a/src/components/MachineLearning/PeopleList.tsx b/apps/photos/src/components/MachineLearning/PeopleList.tsx
similarity index 100%
rename from src/components/MachineLearning/PeopleList.tsx
rename to apps/photos/src/components/MachineLearning/PeopleList.tsx
diff --git a/src/components/MachineLearning/TFJSImage.tsx b/apps/photos/src/components/MachineLearning/TFJSImage.tsx
similarity index 100%
rename from src/components/MachineLearning/TFJSImage.tsx
rename to apps/photos/src/components/MachineLearning/TFJSImage.tsx
diff --git a/src/components/MemberSubscriptionManage.tsx b/apps/photos/src/components/MemberSubscriptionManage.tsx
similarity index 100%
rename from src/components/MemberSubscriptionManage.tsx
rename to apps/photos/src/components/MemberSubscriptionManage.tsx
diff --git a/src/components/Menu/EnteMenuItem.tsx b/apps/photos/src/components/Menu/EnteMenuItem.tsx
similarity index 100%
rename from src/components/Menu/EnteMenuItem.tsx
rename to apps/photos/src/components/Menu/EnteMenuItem.tsx
diff --git a/src/components/Menu/MenuItemDivider.tsx b/apps/photos/src/components/Menu/MenuItemDivider.tsx
similarity index 100%
rename from src/components/Menu/MenuItemDivider.tsx
rename to apps/photos/src/components/Menu/MenuItemDivider.tsx
diff --git a/src/components/Menu/MenuItemGroup.tsx b/apps/photos/src/components/Menu/MenuItemGroup.tsx
similarity index 100%
rename from src/components/Menu/MenuItemGroup.tsx
rename to apps/photos/src/components/Menu/MenuItemGroup.tsx
diff --git a/src/components/Menu/MenuSectionTitle.tsx b/apps/photos/src/components/Menu/MenuSectionTitle.tsx
similarity index 100%
rename from src/components/Menu/MenuSectionTitle.tsx
rename to apps/photos/src/components/Menu/MenuSectionTitle.tsx
diff --git a/src/components/MultilineInput.tsx b/apps/photos/src/components/MultilineInput.tsx
similarity index 100%
rename from src/components/MultilineInput.tsx
rename to apps/photos/src/components/MultilineInput.tsx
diff --git a/src/components/Navbar/EnteLinkLogo.tsx b/apps/photos/src/components/Navbar/EnteLinkLogo.tsx
similarity index 100%
rename from src/components/Navbar/EnteLinkLogo.tsx
rename to apps/photos/src/components/Navbar/EnteLinkLogo.tsx
diff --git a/src/components/Navbar/SelectionBar.tsx b/apps/photos/src/components/Navbar/SelectionBar.tsx
similarity index 100%
rename from src/components/Navbar/SelectionBar.tsx
rename to apps/photos/src/components/Navbar/SelectionBar.tsx
diff --git a/src/components/Navbar/SidebarToggler.tsx b/apps/photos/src/components/Navbar/SidebarToggler.tsx
similarity index 100%
rename from src/components/Navbar/SidebarToggler.tsx
rename to apps/photos/src/components/Navbar/SidebarToggler.tsx
diff --git a/src/components/Navbar/app.tsx b/apps/photos/src/components/Navbar/app.tsx
similarity index 100%
rename from src/components/Navbar/app.tsx
rename to apps/photos/src/components/Navbar/app.tsx
diff --git a/src/components/Navbar/base.tsx b/apps/photos/src/components/Navbar/base.tsx
similarity index 100%
rename from src/components/Navbar/base.tsx
rename to apps/photos/src/components/Navbar/base.tsx
diff --git a/src/components/Notification.tsx b/apps/photos/src/components/Notification.tsx
similarity index 100%
rename from src/components/Notification.tsx
rename to apps/photos/src/components/Notification.tsx
diff --git a/src/components/OverflowMenu/menu.tsx b/apps/photos/src/components/OverflowMenu/menu.tsx
similarity index 100%
rename from src/components/OverflowMenu/menu.tsx
rename to apps/photos/src/components/OverflowMenu/menu.tsx
diff --git a/src/components/OverflowMenu/option.tsx b/apps/photos/src/components/OverflowMenu/option.tsx
similarity index 100%
rename from src/components/OverflowMenu/option.tsx
rename to apps/photos/src/components/OverflowMenu/option.tsx
diff --git a/src/components/PasswordStrength.tsx b/apps/photos/src/components/PasswordStrength.tsx
similarity index 100%
rename from src/components/PasswordStrength.tsx
rename to apps/photos/src/components/PasswordStrength.tsx
diff --git a/src/components/PhotoFrame.tsx b/apps/photos/src/components/PhotoFrame.tsx
similarity index 100%
rename from src/components/PhotoFrame.tsx
rename to apps/photos/src/components/PhotoFrame.tsx
diff --git a/src/components/PhotoList.tsx b/apps/photos/src/components/PhotoList.tsx
similarity index 100%
rename from src/components/PhotoList.tsx
rename to apps/photos/src/components/PhotoList.tsx
diff --git a/src/components/PhotoViewer/FileInfo/ExifData.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/ExifData.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/ExifData.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/ExifData.tsx
diff --git a/src/components/PhotoViewer/FileInfo/FileNameEditDialog.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/FileNameEditDialog.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/FileNameEditDialog.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/FileNameEditDialog.tsx
diff --git a/src/components/PhotoViewer/FileInfo/InfoItem.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/InfoItem.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/InfoItem.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/InfoItem.tsx
diff --git a/src/components/PhotoViewer/FileInfo/RenderCaption.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/RenderCaption.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/RenderCaption.tsx
diff --git a/src/components/PhotoViewer/FileInfo/RenderCreationTime.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/RenderCreationTime.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/RenderCreationTime.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/RenderCreationTime.tsx
diff --git a/src/components/PhotoViewer/FileInfo/RenderFileName.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/RenderFileName.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/RenderFileName.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/RenderFileName.tsx
diff --git a/src/components/PhotoViewer/FileInfo/index.tsx b/apps/photos/src/components/PhotoViewer/FileInfo/index.tsx
similarity index 100%
rename from src/components/PhotoViewer/FileInfo/index.tsx
rename to apps/photos/src/components/PhotoViewer/FileInfo/index.tsx
diff --git a/src/components/PhotoViewer/index.tsx b/apps/photos/src/components/PhotoViewer/index.tsx
similarity index 100%
rename from src/components/PhotoViewer/index.tsx
rename to apps/photos/src/components/PhotoViewer/index.tsx
diff --git a/src/components/PhotoViewer/styledComponents/Legend.tsx b/apps/photos/src/components/PhotoViewer/styledComponents/Legend.tsx
similarity index 100%
rename from src/components/PhotoViewer/styledComponents/Legend.tsx
rename to apps/photos/src/components/PhotoViewer/styledComponents/Legend.tsx
diff --git a/src/components/PhotoViewer/styledComponents/LegendContainer.tsx b/apps/photos/src/components/PhotoViewer/styledComponents/LegendContainer.tsx
similarity index 100%
rename from src/components/PhotoViewer/styledComponents/LegendContainer.tsx
rename to apps/photos/src/components/PhotoViewer/styledComponents/LegendContainer.tsx
diff --git a/src/components/PhotoViewer/styledComponents/LivePhotoBtn.tsx b/apps/photos/src/components/PhotoViewer/styledComponents/LivePhotoBtn.tsx
similarity index 100%
rename from src/components/PhotoViewer/styledComponents/LivePhotoBtn.tsx
rename to apps/photos/src/components/PhotoViewer/styledComponents/LivePhotoBtn.tsx
diff --git a/src/components/PhotoViewer/styledComponents/Pre.tsx b/apps/photos/src/components/PhotoViewer/styledComponents/Pre.tsx
similarity index 100%
rename from src/components/PhotoViewer/styledComponents/Pre.tsx
rename to apps/photos/src/components/PhotoViewer/styledComponents/Pre.tsx
diff --git a/src/components/PhotoViewer/styledComponents/SmallLoadingSpinner.tsx b/apps/photos/src/components/PhotoViewer/styledComponents/SmallLoadingSpinner.tsx
similarity index 100%
rename from src/components/PhotoViewer/styledComponents/SmallLoadingSpinner.tsx
rename to apps/photos/src/components/PhotoViewer/styledComponents/SmallLoadingSpinner.tsx
diff --git a/src/components/PlaceholderThumbnails.tsx b/apps/photos/src/components/PlaceholderThumbnails.tsx
similarity index 100%
rename from src/components/PlaceholderThumbnails.tsx
rename to apps/photos/src/components/PlaceholderThumbnails.tsx
diff --git a/src/components/RecoveryKey/index.tsx b/apps/photos/src/components/RecoveryKey/index.tsx
similarity index 100%
rename from src/components/RecoveryKey/index.tsx
rename to apps/photos/src/components/RecoveryKey/index.tsx
diff --git a/src/components/RecoveryKey/styledComponents.tsx b/apps/photos/src/components/RecoveryKey/styledComponents.tsx
similarity index 100%
rename from src/components/RecoveryKey/styledComponents.tsx
rename to apps/photos/src/components/RecoveryKey/styledComponents.tsx
diff --git a/src/components/Search/SearchBar/index.tsx b/apps/photos/src/components/Search/SearchBar/index.tsx
similarity index 100%
rename from src/components/Search/SearchBar/index.tsx
rename to apps/photos/src/components/Search/SearchBar/index.tsx
diff --git a/src/components/Search/SearchBar/searchBarMobile.tsx b/apps/photos/src/components/Search/SearchBar/searchBarMobile.tsx
similarity index 100%
rename from src/components/Search/SearchBar/searchBarMobile.tsx
rename to apps/photos/src/components/Search/SearchBar/searchBarMobile.tsx
diff --git a/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx b/apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx
similarity index 100%
rename from src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx
rename to apps/photos/src/components/Search/SearchBar/searchInput/MenuWithPeople.tsx
diff --git a/src/components/Search/SearchBar/searchInput/index.tsx b/apps/photos/src/components/Search/SearchBar/searchInput/index.tsx
similarity index 100%
rename from src/components/Search/SearchBar/searchInput/index.tsx
rename to apps/photos/src/components/Search/SearchBar/searchInput/index.tsx
diff --git a/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx b/apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx
similarity index 100%
rename from src/components/Search/SearchBar/searchInput/optionWithInfo.tsx
rename to apps/photos/src/components/Search/SearchBar/searchInput/optionWithInfo.tsx
diff --git a/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx b/apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx
similarity index 100%
rename from src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx
rename to apps/photos/src/components/Search/SearchBar/searchInput/valueContainerWithIcon.tsx
diff --git a/src/components/Search/SearchBar/styledComponents.tsx b/apps/photos/src/components/Search/SearchBar/styledComponents.tsx
similarity index 100%
rename from src/components/Search/SearchBar/styledComponents.tsx
rename to apps/photos/src/components/Search/SearchBar/styledComponents.tsx
diff --git a/src/components/Search/SearchResultInfo.tsx b/apps/photos/src/components/Search/SearchResultInfo.tsx
similarity index 100%
rename from src/components/Search/SearchResultInfo.tsx
rename to apps/photos/src/components/Search/SearchResultInfo.tsx
diff --git a/src/components/Search/SearchStatsContainer.tsx b/apps/photos/src/components/Search/SearchStatsContainer.tsx
similarity index 100%
rename from src/components/Search/SearchStatsContainer.tsx
rename to apps/photos/src/components/Search/SearchStatsContainer.tsx
diff --git a/src/components/SetPasswordForm.tsx b/apps/photos/src/components/SetPasswordForm.tsx
similarity index 100%
rename from src/components/SetPasswordForm.tsx
rename to apps/photos/src/components/SetPasswordForm.tsx
diff --git a/src/components/Sidebar/AdvancedSettings.tsx b/apps/photos/src/components/Sidebar/AdvancedSettings.tsx
similarity index 100%
rename from src/components/Sidebar/AdvancedSettings.tsx
rename to apps/photos/src/components/Sidebar/AdvancedSettings.tsx
diff --git a/src/components/Sidebar/DebugSection.tsx b/apps/photos/src/components/Sidebar/DebugSection.tsx
similarity index 100%
rename from src/components/Sidebar/DebugSection.tsx
rename to apps/photos/src/components/Sidebar/DebugSection.tsx
diff --git a/src/components/Sidebar/ExitSection.tsx b/apps/photos/src/components/Sidebar/ExitSection.tsx
similarity index 100%
rename from src/components/Sidebar/ExitSection.tsx
rename to apps/photos/src/components/Sidebar/ExitSection.tsx
diff --git a/src/components/Sidebar/Header.tsx b/apps/photos/src/components/Sidebar/Header.tsx
similarity index 100%
rename from src/components/Sidebar/Header.tsx
rename to apps/photos/src/components/Sidebar/Header.tsx
diff --git a/src/components/Sidebar/HelpSection.tsx b/apps/photos/src/components/Sidebar/HelpSection.tsx
similarity index 100%
rename from src/components/Sidebar/HelpSection.tsx
rename to apps/photos/src/components/Sidebar/HelpSection.tsx
diff --git a/src/components/Sidebar/Preferences/LanguageSelector.tsx b/apps/photos/src/components/Sidebar/Preferences/LanguageSelector.tsx
similarity index 100%
rename from src/components/Sidebar/Preferences/LanguageSelector.tsx
rename to apps/photos/src/components/Sidebar/Preferences/LanguageSelector.tsx
diff --git a/src/components/Sidebar/Preferences/index.tsx b/apps/photos/src/components/Sidebar/Preferences/index.tsx
similarity index 100%
rename from src/components/Sidebar/Preferences/index.tsx
rename to apps/photos/src/components/Sidebar/Preferences/index.tsx
diff --git a/src/components/Sidebar/ShortcutSection.tsx b/apps/photos/src/components/Sidebar/ShortcutSection.tsx
similarity index 100%
rename from src/components/Sidebar/ShortcutSection.tsx
rename to apps/photos/src/components/Sidebar/ShortcutSection.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/backgroundOverlay.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/backgroundOverlay.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/backgroundOverlay.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/backgroundOverlay.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/clickOverlay.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/clickOverlay.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/clickOverlay.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/clickOverlay.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/family/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/family/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/index.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/index.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/legend.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/legend.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/legend.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/legend.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/progressBar.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/progressBar.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/progressBar.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/family/usageSection/progressBar.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/index.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/individual/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/index.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/individual/usageSection.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/contentOverlay/storageSection.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/storageSection.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/contentOverlay/storageSection.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/contentOverlay/storageSection.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/index.tsx
diff --git a/src/components/Sidebar/SubscriptionCard/styledComponents.tsx b/apps/photos/src/components/Sidebar/SubscriptionCard/styledComponents.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionCard/styledComponents.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionCard/styledComponents.tsx
diff --git a/src/components/Sidebar/SubscriptionStatus/index.tsx b/apps/photos/src/components/Sidebar/SubscriptionStatus/index.tsx
similarity index 100%
rename from src/components/Sidebar/SubscriptionStatus/index.tsx
rename to apps/photos/src/components/Sidebar/SubscriptionStatus/index.tsx
diff --git a/src/components/Sidebar/ThemeSwitcher.tsx b/apps/photos/src/components/Sidebar/ThemeSwitcher.tsx
similarity index 100%
rename from src/components/Sidebar/ThemeSwitcher.tsx
rename to apps/photos/src/components/Sidebar/ThemeSwitcher.tsx
diff --git a/src/components/Sidebar/UtilitySection.tsx b/apps/photos/src/components/Sidebar/UtilitySection.tsx
similarity index 100%
rename from src/components/Sidebar/UtilitySection.tsx
rename to apps/photos/src/components/Sidebar/UtilitySection.tsx
diff --git a/src/components/Sidebar/index.tsx b/apps/photos/src/components/Sidebar/index.tsx
similarity index 100%
rename from src/components/Sidebar/index.tsx
rename to apps/photos/src/components/Sidebar/index.tsx
diff --git a/src/components/Sidebar/styledComponents.tsx b/apps/photos/src/components/Sidebar/styledComponents.tsx
similarity index 100%
rename from src/components/Sidebar/styledComponents.tsx
rename to apps/photos/src/components/Sidebar/styledComponents.tsx
diff --git a/src/components/Sidebar/userDetailsSection.tsx b/apps/photos/src/components/Sidebar/userDetailsSection.tsx
similarity index 100%
rename from src/components/Sidebar/userDetailsSection.tsx
rename to apps/photos/src/components/Sidebar/userDetailsSection.tsx
diff --git a/src/components/SignUp.tsx b/apps/photos/src/components/SignUp.tsx
similarity index 100%
rename from src/components/SignUp.tsx
rename to apps/photos/src/components/SignUp.tsx
diff --git a/src/components/SingleInputForm.tsx b/apps/photos/src/components/SingleInputForm.tsx
similarity index 100%
rename from src/components/SingleInputForm.tsx
rename to apps/photos/src/components/SingleInputForm.tsx
diff --git a/src/components/SubmitButton.tsx b/apps/photos/src/components/SubmitButton.tsx
similarity index 100%
rename from src/components/SubmitButton.tsx
rename to apps/photos/src/components/SubmitButton.tsx
diff --git a/src/components/Titlebar.tsx b/apps/photos/src/components/Titlebar.tsx
similarity index 100%
rename from src/components/Titlebar.tsx
rename to apps/photos/src/components/Titlebar.tsx
diff --git a/src/components/TruncateText.tsx b/apps/photos/src/components/TruncateText.tsx
similarity index 100%
rename from src/components/TruncateText.tsx
rename to apps/photos/src/components/TruncateText.tsx
diff --git a/src/components/TwoFactor/InvalidInputMessage.tsx b/apps/photos/src/components/TwoFactor/InvalidInputMessage.tsx
similarity index 100%
rename from src/components/TwoFactor/InvalidInputMessage.tsx
rename to apps/photos/src/components/TwoFactor/InvalidInputMessage.tsx
diff --git a/src/components/TwoFactor/Modal/Manage.tsx b/apps/photos/src/components/TwoFactor/Modal/Manage.tsx
similarity index 100%
rename from src/components/TwoFactor/Modal/Manage.tsx
rename to apps/photos/src/components/TwoFactor/Modal/Manage.tsx
diff --git a/src/components/TwoFactor/Modal/Setup.tsx b/apps/photos/src/components/TwoFactor/Modal/Setup.tsx
similarity index 100%
rename from src/components/TwoFactor/Modal/Setup.tsx
rename to apps/photos/src/components/TwoFactor/Modal/Setup.tsx
diff --git a/src/components/TwoFactor/Modal/index.tsx b/apps/photos/src/components/TwoFactor/Modal/index.tsx
similarity index 100%
rename from src/components/TwoFactor/Modal/index.tsx
rename to apps/photos/src/components/TwoFactor/Modal/index.tsx
diff --git a/src/components/TwoFactor/Setup.tsx b/apps/photos/src/components/TwoFactor/Setup.tsx
similarity index 100%
rename from src/components/TwoFactor/Setup.tsx
rename to apps/photos/src/components/TwoFactor/Setup.tsx
diff --git a/src/components/TwoFactor/VerifyForm.tsx b/apps/photos/src/components/TwoFactor/VerifyForm.tsx
similarity index 100%
rename from src/components/TwoFactor/VerifyForm.tsx
rename to apps/photos/src/components/TwoFactor/VerifyForm.tsx
diff --git a/src/components/TwoFactor/styledComponents.ts b/apps/photos/src/components/TwoFactor/styledComponents.ts
similarity index 100%
rename from src/components/TwoFactor/styledComponents.ts
rename to apps/photos/src/components/TwoFactor/styledComponents.ts
diff --git a/src/components/Upload/UploadButton.tsx b/apps/photos/src/components/Upload/UploadButton.tsx
similarity index 100%
rename from src/components/Upload/UploadButton.tsx
rename to apps/photos/src/components/Upload/UploadButton.tsx
diff --git a/src/components/Upload/UploadProgress/dialog.tsx b/apps/photos/src/components/Upload/UploadProgress/dialog.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/dialog.tsx
rename to apps/photos/src/components/Upload/UploadProgress/dialog.tsx
diff --git a/src/components/Upload/UploadProgress/footer.tsx b/apps/photos/src/components/Upload/UploadProgress/footer.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/footer.tsx
rename to apps/photos/src/components/Upload/UploadProgress/footer.tsx
diff --git a/src/components/Upload/UploadProgress/header.tsx b/apps/photos/src/components/Upload/UploadProgress/header.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/header.tsx
rename to apps/photos/src/components/Upload/UploadProgress/header.tsx
diff --git a/src/components/Upload/UploadProgress/inProgressSection.tsx b/apps/photos/src/components/Upload/UploadProgress/inProgressSection.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/inProgressSection.tsx
rename to apps/photos/src/components/Upload/UploadProgress/inProgressSection.tsx
diff --git a/src/components/Upload/UploadProgress/index.tsx b/apps/photos/src/components/Upload/UploadProgress/index.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/index.tsx
rename to apps/photos/src/components/Upload/UploadProgress/index.tsx
diff --git a/src/components/Upload/UploadProgress/minimized.tsx b/apps/photos/src/components/Upload/UploadProgress/minimized.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/minimized.tsx
rename to apps/photos/src/components/Upload/UploadProgress/minimized.tsx
diff --git a/src/components/Upload/UploadProgress/progressBar.tsx b/apps/photos/src/components/Upload/UploadProgress/progressBar.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/progressBar.tsx
rename to apps/photos/src/components/Upload/UploadProgress/progressBar.tsx
diff --git a/src/components/Upload/UploadProgress/resultSection.tsx b/apps/photos/src/components/Upload/UploadProgress/resultSection.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/resultSection.tsx
rename to apps/photos/src/components/Upload/UploadProgress/resultSection.tsx
diff --git a/src/components/Upload/UploadProgress/section.tsx b/apps/photos/src/components/Upload/UploadProgress/section.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/section.tsx
rename to apps/photos/src/components/Upload/UploadProgress/section.tsx
diff --git a/src/components/Upload/UploadProgress/styledComponents.tsx b/apps/photos/src/components/Upload/UploadProgress/styledComponents.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/styledComponents.tsx
rename to apps/photos/src/components/Upload/UploadProgress/styledComponents.tsx
diff --git a/src/components/Upload/UploadProgress/title.tsx b/apps/photos/src/components/Upload/UploadProgress/title.tsx
similarity index 100%
rename from src/components/Upload/UploadProgress/title.tsx
rename to apps/photos/src/components/Upload/UploadProgress/title.tsx
diff --git a/src/components/Upload/UploadStrategyChoiceModal.tsx b/apps/photos/src/components/Upload/UploadStrategyChoiceModal.tsx
similarity index 100%
rename from src/components/Upload/UploadStrategyChoiceModal.tsx
rename to apps/photos/src/components/Upload/UploadStrategyChoiceModal.tsx
diff --git a/src/components/Upload/UploadTypeSelector/index.tsx b/apps/photos/src/components/Upload/UploadTypeSelector/index.tsx
similarity index 100%
rename from src/components/Upload/UploadTypeSelector/index.tsx
rename to apps/photos/src/components/Upload/UploadTypeSelector/index.tsx
diff --git a/src/components/Upload/Uploader.tsx b/apps/photos/src/components/Upload/Uploader.tsx
similarity index 100%
rename from src/components/Upload/Uploader.tsx
rename to apps/photos/src/components/Upload/Uploader.tsx
diff --git a/src/components/UploadSelectorInputs.tsx b/apps/photos/src/components/UploadSelectorInputs.tsx
similarity index 100%
rename from src/components/UploadSelectorInputs.tsx
rename to apps/photos/src/components/UploadSelectorInputs.tsx
diff --git a/src/components/UserNameInputDialog.tsx b/apps/photos/src/components/UserNameInputDialog.tsx
similarity index 100%
rename from src/components/UserNameInputDialog.tsx
rename to apps/photos/src/components/UserNameInputDialog.tsx
diff --git a/src/components/VerifyMasterPasswordForm.tsx b/apps/photos/src/components/VerifyMasterPasswordForm.tsx
similarity index 100%
rename from src/components/VerifyMasterPasswordForm.tsx
rename to apps/photos/src/components/VerifyMasterPasswordForm.tsx
diff --git a/src/components/WatchFolder/index.tsx b/apps/photos/src/components/WatchFolder/index.tsx
similarity index 100%
rename from src/components/WatchFolder/index.tsx
rename to apps/photos/src/components/WatchFolder/index.tsx
diff --git a/src/components/WatchFolder/mappingEntry/entryHeading.tsx b/apps/photos/src/components/WatchFolder/mappingEntry/entryHeading.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingEntry/entryHeading.tsx
rename to apps/photos/src/components/WatchFolder/mappingEntry/entryHeading.tsx
diff --git a/src/components/WatchFolder/mappingEntry/index.tsx b/apps/photos/src/components/WatchFolder/mappingEntry/index.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingEntry/index.tsx
rename to apps/photos/src/components/WatchFolder/mappingEntry/index.tsx
diff --git a/src/components/WatchFolder/mappingEntry/mappingEntryOptions.tsx b/apps/photos/src/components/WatchFolder/mappingEntry/mappingEntryOptions.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingEntry/mappingEntryOptions.tsx
rename to apps/photos/src/components/WatchFolder/mappingEntry/mappingEntryOptions.tsx
diff --git a/src/components/WatchFolder/mappingList/index.tsx b/apps/photos/src/components/WatchFolder/mappingList/index.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingList/index.tsx
rename to apps/photos/src/components/WatchFolder/mappingList/index.tsx
diff --git a/src/components/WatchFolder/mappingList/noMappingsContent/checkmarkIcon.tsx b/apps/photos/src/components/WatchFolder/mappingList/noMappingsContent/checkmarkIcon.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingList/noMappingsContent/checkmarkIcon.tsx
rename to apps/photos/src/components/WatchFolder/mappingList/noMappingsContent/checkmarkIcon.tsx
diff --git a/src/components/WatchFolder/mappingList/noMappingsContent/noMappingsContent.tsx b/apps/photos/src/components/WatchFolder/mappingList/noMappingsContent/noMappingsContent.tsx
similarity index 100%
rename from src/components/WatchFolder/mappingList/noMappingsContent/noMappingsContent.tsx
rename to apps/photos/src/components/WatchFolder/mappingList/noMappingsContent/noMappingsContent.tsx
diff --git a/src/components/WatchFolder/styledComponents.tsx b/apps/photos/src/components/WatchFolder/styledComponents.tsx
similarity index 100%
rename from src/components/WatchFolder/styledComponents.tsx
rename to apps/photos/src/components/WatchFolder/styledComponents.tsx
diff --git a/src/components/icons/ObjectIcon.tsx b/apps/photos/src/components/icons/ObjectIcon.tsx
similarity index 100%
rename from src/components/icons/ObjectIcon.tsx
rename to apps/photos/src/components/icons/ObjectIcon.tsx
diff --git a/src/components/icons/TextIcon.tsx b/apps/photos/src/components/icons/TextIcon.tsx
similarity index 100%
rename from src/components/icons/TextIcon.tsx
rename to apps/photos/src/components/icons/TextIcon.tsx
diff --git a/src/components/icons/ente.tsx b/apps/photos/src/components/icons/ente.tsx
similarity index 100%
rename from src/components/icons/ente.tsx
rename to apps/photos/src/components/icons/ente.tsx
diff --git a/src/components/ml-debug/index.tsx b/apps/photos/src/components/ml-debug/index.tsx
similarity index 100%
rename from src/components/ml-debug/index.tsx
rename to apps/photos/src/components/ml-debug/index.tsx
diff --git a/src/components/pages/auth/Navbar.tsx b/apps/photos/src/components/pages/auth/Navbar.tsx
similarity index 100%
rename from src/components/pages/auth/Navbar.tsx
rename to apps/photos/src/components/pages/auth/Navbar.tsx
diff --git a/src/components/pages/dedupe/SelectedFileOptions.tsx b/apps/photos/src/components/pages/dedupe/SelectedFileOptions.tsx
similarity index 100%
rename from src/components/pages/dedupe/SelectedFileOptions.tsx
rename to apps/photos/src/components/pages/dedupe/SelectedFileOptions.tsx
diff --git a/src/components/pages/gallery/LinkButton.tsx b/apps/photos/src/components/pages/gallery/LinkButton.tsx
similarity index 100%
rename from src/components/pages/gallery/LinkButton.tsx
rename to apps/photos/src/components/pages/gallery/LinkButton.tsx
diff --git a/src/components/pages/gallery/Navbar.tsx b/apps/photos/src/components/pages/gallery/Navbar.tsx
similarity index 100%
rename from src/components/pages/gallery/Navbar.tsx
rename to apps/photos/src/components/pages/gallery/Navbar.tsx
diff --git a/src/components/pages/gallery/OptionIcon.tsx b/apps/photos/src/components/pages/gallery/OptionIcon.tsx
similarity index 100%
rename from src/components/pages/gallery/OptionIcon.tsx
rename to apps/photos/src/components/pages/gallery/OptionIcon.tsx
diff --git a/src/components/pages/gallery/PlanSelector/card/free.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/card/free.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/card/free.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/card/free.tsx
diff --git a/src/components/pages/gallery/PlanSelector/card/index.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/card/index.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/card/index.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/card/index.tsx
diff --git a/src/components/pages/gallery/PlanSelector/card/paid.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/card/paid.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/card/paid.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/card/paid.tsx
diff --git a/src/components/pages/gallery/PlanSelector/index.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/index.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/index.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/index.tsx
diff --git a/src/components/pages/gallery/PlanSelector/manageSubscription/button.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/manageSubscription/button.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/manageSubscription/button.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/manageSubscription/button.tsx
diff --git a/src/components/pages/gallery/PlanSelector/manageSubscription/index.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/manageSubscription/index.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/manageSubscription/index.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/manageSubscription/index.tsx
diff --git a/src/components/pages/gallery/PlanSelector/periodToggler.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/periodToggler.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/periodToggler.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/periodToggler.tsx
diff --git a/src/components/pages/gallery/PlanSelector/plans/FreePlanRow.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/plans/FreePlanRow.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/plans/FreePlanRow.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/plans/FreePlanRow.tsx
diff --git a/src/components/pages/gallery/PlanSelector/plans/button.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/plans/button.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/plans/button.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/plans/button.tsx
diff --git a/src/components/pages/gallery/PlanSelector/plans/index.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/plans/index.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/plans/index.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/plans/index.tsx
diff --git a/src/components/pages/gallery/PlanSelector/plans/planRow.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/plans/planRow.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/plans/planRow.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/plans/planRow.tsx
diff --git a/src/components/pages/gallery/PlanSelector/plans/planTile.tsx b/apps/photos/src/components/pages/gallery/PlanSelector/plans/planTile.tsx
similarity index 100%
rename from src/components/pages/gallery/PlanSelector/plans/planTile.tsx
rename to apps/photos/src/components/pages/gallery/PlanSelector/plans/planTile.tsx
diff --git a/src/components/pages/gallery/PreviewCard.tsx b/apps/photos/src/components/pages/gallery/PreviewCard.tsx
similarity index 100%
rename from src/components/pages/gallery/PreviewCard.tsx
rename to apps/photos/src/components/pages/gallery/PreviewCard.tsx
diff --git a/src/components/pages/gallery/SelectedFileOptions.tsx b/apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx
similarity index 100%
rename from src/components/pages/gallery/SelectedFileOptions.tsx
rename to apps/photos/src/components/pages/gallery/SelectedFileOptions.tsx
diff --git a/src/components/pages/sharedAlbum/GoToEnte.tsx b/apps/photos/src/components/pages/sharedAlbum/GoToEnte.tsx
similarity index 100%
rename from src/components/pages/sharedAlbum/GoToEnte.tsx
rename to apps/photos/src/components/pages/sharedAlbum/GoToEnte.tsx
diff --git a/src/components/pages/sharedAlbum/Navbar.tsx b/apps/photos/src/components/pages/sharedAlbum/Navbar.tsx
similarity index 100%
rename from src/components/pages/sharedAlbum/Navbar.tsx
rename to apps/photos/src/components/pages/sharedAlbum/Navbar.tsx
diff --git a/src/components/pages/sharedAlbum/ReportAbuse.tsx b/apps/photos/src/components/pages/sharedAlbum/ReportAbuse.tsx
similarity index 100%
rename from src/components/pages/sharedAlbum/ReportAbuse.tsx
rename to apps/photos/src/components/pages/sharedAlbum/ReportAbuse.tsx
diff --git a/src/constants/api/index.ts b/apps/photos/src/constants/api/index.ts
similarity index 100%
rename from src/constants/api/index.ts
rename to apps/photos/src/constants/api/index.ts
diff --git a/src/constants/apps/index.ts b/apps/photos/src/constants/apps/index.ts
similarity index 100%
rename from src/constants/apps/index.ts
rename to apps/photos/src/constants/apps/index.ts
diff --git a/src/constants/billing/index.ts b/apps/photos/src/constants/billing/index.ts
similarity index 100%
rename from src/constants/billing/index.ts
rename to apps/photos/src/constants/billing/index.ts
diff --git a/src/constants/cache/index.ts b/apps/photos/src/constants/cache/index.ts
similarity index 100%
rename from src/constants/cache/index.ts
rename to apps/photos/src/constants/cache/index.ts
diff --git a/src/constants/collection/index.ts b/apps/photos/src/constants/collection/index.ts
similarity index 100%
rename from src/constants/collection/index.ts
rename to apps/photos/src/constants/collection/index.ts
diff --git a/src/constants/crypto/index.ts b/apps/photos/src/constants/crypto/index.ts
similarity index 100%
rename from src/constants/crypto/index.ts
rename to apps/photos/src/constants/crypto/index.ts
diff --git a/src/constants/export/index.ts b/apps/photos/src/constants/export/index.ts
similarity index 100%
rename from src/constants/export/index.ts
rename to apps/photos/src/constants/export/index.ts
diff --git a/src/constants/ffmpeg/index.ts b/apps/photos/src/constants/ffmpeg/index.ts
similarity index 100%
rename from src/constants/ffmpeg/index.ts
rename to apps/photos/src/constants/ffmpeg/index.ts
diff --git a/src/constants/file/index.ts b/apps/photos/src/constants/file/index.ts
similarity index 100%
rename from src/constants/file/index.ts
rename to apps/photos/src/constants/file/index.ts
diff --git a/src/constants/gallery/index.ts b/apps/photos/src/constants/gallery/index.ts
similarity index 100%
rename from src/constants/gallery/index.ts
rename to apps/photos/src/constants/gallery/index.ts
diff --git a/src/constants/locale/index.ts b/apps/photos/src/constants/locale/index.ts
similarity index 100%
rename from src/constants/locale/index.ts
rename to apps/photos/src/constants/locale/index.ts
diff --git a/src/constants/machineLearning/config.ts b/apps/photos/src/constants/machineLearning/config.ts
similarity index 100%
rename from src/constants/machineLearning/config.ts
rename to apps/photos/src/constants/machineLearning/config.ts
diff --git a/src/constants/pages/index.ts b/apps/photos/src/constants/pages/index.ts
similarity index 100%
rename from src/constants/pages/index.ts
rename to apps/photos/src/constants/pages/index.ts
diff --git a/src/constants/photoViewer/index.ts b/apps/photos/src/constants/photoViewer/index.ts
similarity index 100%
rename from src/constants/photoViewer/index.ts
rename to apps/photos/src/constants/photoViewer/index.ts
diff --git a/src/constants/publicCollection/index.ts b/apps/photos/src/constants/publicCollection/index.ts
similarity index 100%
rename from src/constants/publicCollection/index.ts
rename to apps/photos/src/constants/publicCollection/index.ts
diff --git a/src/constants/sentry/index.ts b/apps/photos/src/constants/sentry/index.ts
similarity index 100%
rename from src/constants/sentry/index.ts
rename to apps/photos/src/constants/sentry/index.ts
diff --git a/src/constants/theme/index.ts b/apps/photos/src/constants/theme/index.ts
similarity index 100%
rename from src/constants/theme/index.ts
rename to apps/photos/src/constants/theme/index.ts
diff --git a/src/constants/upload/index.ts b/apps/photos/src/constants/upload/index.ts
similarity index 100%
rename from src/constants/upload/index.ts
rename to apps/photos/src/constants/upload/index.ts
diff --git a/src/constants/urls/index.ts b/apps/photos/src/constants/urls/index.ts
similarity index 100%
rename from src/constants/urls/index.ts
rename to apps/photos/src/constants/urls/index.ts
diff --git a/src/contexts/overflowMenu.tsx b/apps/photos/src/contexts/overflowMenu.tsx
similarity index 100%
rename from src/contexts/overflowMenu.tsx
rename to apps/photos/src/contexts/overflowMenu.tsx
diff --git a/src/contexts/uploadProgress.tsx b/apps/photos/src/contexts/uploadProgress.tsx
similarity index 100%
rename from src/contexts/uploadProgress.tsx
rename to apps/photos/src/contexts/uploadProgress.tsx
diff --git a/src/hooks/useComponentScroll.tsx b/apps/photos/src/hooks/useComponentScroll.tsx
similarity index 100%
rename from src/hooks/useComponentScroll.tsx
rename to apps/photos/src/hooks/useComponentScroll.tsx
diff --git a/src/hooks/useFileInput.tsx b/apps/photos/src/hooks/useFileInput.tsx
similarity index 100%
rename from src/hooks/useFileInput.tsx
rename to apps/photos/src/hooks/useFileInput.tsx
diff --git a/src/hooks/useLocalState.tsx b/apps/photos/src/hooks/useLocalState.tsx
similarity index 100%
rename from src/hooks/useLocalState.tsx
rename to apps/photos/src/hooks/useLocalState.tsx
diff --git a/src/hooks/useLongPress.ts b/apps/photos/src/hooks/useLongPress.ts
similarity index 100%
rename from src/hooks/useLongPress.ts
rename to apps/photos/src/hooks/useLongPress.ts
diff --git a/src/hooks/useWindowSize.tsx b/apps/photos/src/hooks/useWindowSize.tsx
similarity index 100%
rename from src/hooks/useWindowSize.tsx
rename to apps/photos/src/hooks/useWindowSize.tsx
diff --git a/src/i18n/index.ts b/apps/photos/src/i18n/index.ts
similarity index 100%
rename from src/i18n/index.ts
rename to apps/photos/src/i18n/index.ts
diff --git a/src/pages/404.tsx b/apps/photos/src/pages/404.tsx
similarity index 100%
rename from src/pages/404.tsx
rename to apps/photos/src/pages/404.tsx
diff --git a/src/pages/_app.tsx b/apps/photos/src/pages/_app.tsx
similarity index 100%
rename from src/pages/_app.tsx
rename to apps/photos/src/pages/_app.tsx
diff --git a/src/pages/_document.tsx b/apps/photos/src/pages/_document.tsx
similarity index 100%
rename from src/pages/_document.tsx
rename to apps/photos/src/pages/_document.tsx
diff --git a/src/pages/auth/index.tsx b/apps/photos/src/pages/auth/index.tsx
similarity index 100%
rename from src/pages/auth/index.tsx
rename to apps/photos/src/pages/auth/index.tsx
diff --git a/src/pages/change-email/index.tsx b/apps/photos/src/pages/change-email/index.tsx
similarity index 100%
rename from src/pages/change-email/index.tsx
rename to apps/photos/src/pages/change-email/index.tsx
diff --git a/src/pages/change-password/index.tsx b/apps/photos/src/pages/change-password/index.tsx
similarity index 100%
rename from src/pages/change-password/index.tsx
rename to apps/photos/src/pages/change-password/index.tsx
diff --git a/src/pages/credentials/index.tsx b/apps/photos/src/pages/credentials/index.tsx
similarity index 100%
rename from src/pages/credentials/index.tsx
rename to apps/photos/src/pages/credentials/index.tsx
diff --git a/src/pages/deduplicate/index.tsx b/apps/photos/src/pages/deduplicate/index.tsx
similarity index 100%
rename from src/pages/deduplicate/index.tsx
rename to apps/photos/src/pages/deduplicate/index.tsx
diff --git a/src/pages/gallery/index.tsx b/apps/photos/src/pages/gallery/index.tsx
similarity index 100%
rename from src/pages/gallery/index.tsx
rename to apps/photos/src/pages/gallery/index.tsx
diff --git a/src/pages/generate/index.tsx b/apps/photos/src/pages/generate/index.tsx
similarity index 100%
rename from src/pages/generate/index.tsx
rename to apps/photos/src/pages/generate/index.tsx
diff --git a/src/pages/index.tsx b/apps/photos/src/pages/index.tsx
similarity index 100%
rename from src/pages/index.tsx
rename to apps/photos/src/pages/index.tsx
diff --git a/src/pages/login/index.tsx b/apps/photos/src/pages/login/index.tsx
similarity index 100%
rename from src/pages/login/index.tsx
rename to apps/photos/src/pages/login/index.tsx
diff --git a/src/pages/recover/index.tsx b/apps/photos/src/pages/recover/index.tsx
similarity index 100%
rename from src/pages/recover/index.tsx
rename to apps/photos/src/pages/recover/index.tsx
diff --git a/src/pages/shared-albums/index.tsx b/apps/photos/src/pages/shared-albums/index.tsx
similarity index 100%
rename from src/pages/shared-albums/index.tsx
rename to apps/photos/src/pages/shared-albums/index.tsx
diff --git a/src/pages/signup/index.tsx b/apps/photos/src/pages/signup/index.tsx
similarity index 100%
rename from src/pages/signup/index.tsx
rename to apps/photos/src/pages/signup/index.tsx
diff --git a/src/pages/two-factor/recover/index.tsx b/apps/photos/src/pages/two-factor/recover/index.tsx
similarity index 100%
rename from src/pages/two-factor/recover/index.tsx
rename to apps/photos/src/pages/two-factor/recover/index.tsx
diff --git a/src/pages/two-factor/setup/ManualMode.tsx b/apps/photos/src/pages/two-factor/setup/ManualMode.tsx
similarity index 100%
rename from src/pages/two-factor/setup/ManualMode.tsx
rename to apps/photos/src/pages/two-factor/setup/ManualMode.tsx
diff --git a/src/pages/two-factor/setup/QRMode.tsx b/apps/photos/src/pages/two-factor/setup/QRMode.tsx
similarity index 100%
rename from src/pages/two-factor/setup/QRMode.tsx
rename to apps/photos/src/pages/two-factor/setup/QRMode.tsx
diff --git a/src/pages/two-factor/setup/index.tsx b/apps/photos/src/pages/two-factor/setup/index.tsx
similarity index 100%
rename from src/pages/two-factor/setup/index.tsx
rename to apps/photos/src/pages/two-factor/setup/index.tsx
diff --git a/src/pages/two-factor/verify/index.tsx b/apps/photos/src/pages/two-factor/verify/index.tsx
similarity index 100%
rename from src/pages/two-factor/verify/index.tsx
rename to apps/photos/src/pages/two-factor/verify/index.tsx
diff --git a/src/pages/verify/index.tsx b/apps/photos/src/pages/verify/index.tsx
similarity index 100%
rename from src/pages/verify/index.tsx
rename to apps/photos/src/pages/verify/index.tsx
diff --git a/src/services/HTTPService.ts b/apps/photos/src/services/HTTPService.ts
similarity index 100%
rename from src/services/HTTPService.ts
rename to apps/photos/src/services/HTTPService.ts
diff --git a/src/services/authenticator/authenticatorService.ts b/apps/photos/src/services/authenticator/authenticatorService.ts
similarity index 100%
rename from src/services/authenticator/authenticatorService.ts
rename to apps/photos/src/services/authenticator/authenticatorService.ts
diff --git a/src/services/billingService.ts b/apps/photos/src/services/billingService.ts
similarity index 100%
rename from src/services/billingService.ts
rename to apps/photos/src/services/billingService.ts
diff --git a/src/services/cache/cacheStorageFactory.ts b/apps/photos/src/services/cache/cacheStorageFactory.ts
similarity index 100%
rename from src/services/cache/cacheStorageFactory.ts
rename to apps/photos/src/services/cache/cacheStorageFactory.ts
diff --git a/src/services/cache/cacheStorageService.ts b/apps/photos/src/services/cache/cacheStorageService.ts
similarity index 100%
rename from src/services/cache/cacheStorageService.ts
rename to apps/photos/src/services/cache/cacheStorageService.ts
diff --git a/src/services/collectionService.ts b/apps/photos/src/services/collectionService.ts
similarity index 100%
rename from src/services/collectionService.ts
rename to apps/photos/src/services/collectionService.ts
diff --git a/src/services/deduplicationService.ts b/apps/photos/src/services/deduplicationService.ts
similarity index 100%
rename from src/services/deduplicationService.ts
rename to apps/photos/src/services/deduplicationService.ts
diff --git a/src/services/downloadManager.ts b/apps/photos/src/services/downloadManager.ts
similarity index 100%
rename from src/services/downloadManager.ts
rename to apps/photos/src/services/downloadManager.ts
diff --git a/src/services/electron/cache.ts b/apps/photos/src/services/electron/cache.ts
similarity index 100%
rename from src/services/electron/cache.ts
rename to apps/photos/src/services/electron/cache.ts
diff --git a/src/services/electron/common.ts b/apps/photos/src/services/electron/common.ts
similarity index 100%
rename from src/services/electron/common.ts
rename to apps/photos/src/services/electron/common.ts
diff --git a/src/services/electron/ffmpeg.ts b/apps/photos/src/services/electron/ffmpeg.ts
similarity index 100%
rename from src/services/electron/ffmpeg.ts
rename to apps/photos/src/services/electron/ffmpeg.ts
diff --git a/src/services/electron/fs.ts b/apps/photos/src/services/electron/fs.ts
similarity index 100%
rename from src/services/electron/fs.ts
rename to apps/photos/src/services/electron/fs.ts
diff --git a/src/services/electron/imageProcessor.ts b/apps/photos/src/services/electron/imageProcessor.ts
similarity index 100%
rename from src/services/electron/imageProcessor.ts
rename to apps/photos/src/services/electron/imageProcessor.ts
diff --git a/src/services/electron/safeStorage.tsx b/apps/photos/src/services/electron/safeStorage.tsx
similarity index 100%
rename from src/services/electron/safeStorage.tsx
rename to apps/photos/src/services/electron/safeStorage.tsx
diff --git a/src/services/electron/update.ts b/apps/photos/src/services/electron/update.ts
similarity index 100%
rename from src/services/electron/update.ts
rename to apps/photos/src/services/electron/update.ts
diff --git a/src/services/events.ts b/apps/photos/src/services/events.ts
similarity index 100%
rename from src/services/events.ts
rename to apps/photos/src/services/events.ts
diff --git a/src/services/exportService.ts b/apps/photos/src/services/exportService.ts
similarity index 100%
rename from src/services/exportService.ts
rename to apps/photos/src/services/exportService.ts
diff --git a/src/services/ffmpeg/ffmpegFactory.ts b/apps/photos/src/services/ffmpeg/ffmpegFactory.ts
similarity index 100%
rename from src/services/ffmpeg/ffmpegFactory.ts
rename to apps/photos/src/services/ffmpeg/ffmpegFactory.ts
diff --git a/src/services/ffmpeg/ffmpegService.ts b/apps/photos/src/services/ffmpeg/ffmpegService.ts
similarity index 100%
rename from src/services/ffmpeg/ffmpegService.ts
rename to apps/photos/src/services/ffmpeg/ffmpegService.ts
diff --git a/src/services/fileService.ts b/apps/photos/src/services/fileService.ts
similarity index 100%
rename from src/services/fileService.ts
rename to apps/photos/src/services/fileService.ts
diff --git a/src/services/heicConversionService.ts b/apps/photos/src/services/heicConversionService.ts
similarity index 100%
rename from src/services/heicConversionService.ts
rename to apps/photos/src/services/heicConversionService.ts
diff --git a/src/services/importService.ts b/apps/photos/src/services/importService.ts
similarity index 100%
rename from src/services/importService.ts
rename to apps/photos/src/services/importService.ts
diff --git a/src/services/machineLearning/arcfaceAlignmentService.ts b/apps/photos/src/services/machineLearning/arcfaceAlignmentService.ts
similarity index 100%
rename from src/services/machineLearning/arcfaceAlignmentService.ts
rename to apps/photos/src/services/machineLearning/arcfaceAlignmentService.ts
diff --git a/src/services/machineLearning/arcfaceCropService.ts b/apps/photos/src/services/machineLearning/arcfaceCropService.ts
similarity index 100%
rename from src/services/machineLearning/arcfaceCropService.ts
rename to apps/photos/src/services/machineLearning/arcfaceCropService.ts
diff --git a/src/services/machineLearning/blazeFaceDetectionService.ts b/apps/photos/src/services/machineLearning/blazeFaceDetectionService.ts
similarity index 100%
rename from src/services/machineLearning/blazeFaceDetectionService.ts
rename to apps/photos/src/services/machineLearning/blazeFaceDetectionService.ts
diff --git a/src/services/machineLearning/clusteringService.ts b/apps/photos/src/services/machineLearning/clusteringService.ts
similarity index 100%
rename from src/services/machineLearning/clusteringService.ts
rename to apps/photos/src/services/machineLearning/clusteringService.ts
diff --git a/src/services/machineLearning/dbscanClusteringService.ts b/apps/photos/src/services/machineLearning/dbscanClusteringService.ts
similarity index 100%
rename from src/services/machineLearning/dbscanClusteringService.ts
rename to apps/photos/src/services/machineLearning/dbscanClusteringService.ts
diff --git a/src/services/machineLearning/faceService.ts b/apps/photos/src/services/machineLearning/faceService.ts
similarity index 100%
rename from src/services/machineLearning/faceService.ts
rename to apps/photos/src/services/machineLearning/faceService.ts
diff --git a/src/services/machineLearning/hdbscanClusteringService.ts b/apps/photos/src/services/machineLearning/hdbscanClusteringService.ts
similarity index 100%
rename from src/services/machineLearning/hdbscanClusteringService.ts
rename to apps/photos/src/services/machineLearning/hdbscanClusteringService.ts
diff --git a/src/services/machineLearning/imageSceneService.ts b/apps/photos/src/services/machineLearning/imageSceneService.ts
similarity index 100%
rename from src/services/machineLearning/imageSceneService.ts
rename to apps/photos/src/services/machineLearning/imageSceneService.ts
diff --git a/src/services/machineLearning/machineLearningFactory.ts b/apps/photos/src/services/machineLearning/machineLearningFactory.ts
similarity index 100%
rename from src/services/machineLearning/machineLearningFactory.ts
rename to apps/photos/src/services/machineLearning/machineLearningFactory.ts
diff --git a/src/services/machineLearning/machineLearningService.ts b/apps/photos/src/services/machineLearning/machineLearningService.ts
similarity index 100%
rename from src/services/machineLearning/machineLearningService.ts
rename to apps/photos/src/services/machineLearning/machineLearningService.ts
diff --git a/src/services/machineLearning/mlSyncJob.ts b/apps/photos/src/services/machineLearning/mlSyncJob.ts
similarity index 100%
rename from src/services/machineLearning/mlSyncJob.ts
rename to apps/photos/src/services/machineLearning/mlSyncJob.ts
diff --git a/src/services/machineLearning/mlWorkManager.ts b/apps/photos/src/services/machineLearning/mlWorkManager.ts
similarity index 100%
rename from src/services/machineLearning/mlWorkManager.ts
rename to apps/photos/src/services/machineLearning/mlWorkManager.ts
diff --git a/src/services/machineLearning/mobileFaceNetEmbeddingService.ts b/apps/photos/src/services/machineLearning/mobileFaceNetEmbeddingService.ts
similarity index 100%
rename from src/services/machineLearning/mobileFaceNetEmbeddingService.ts
rename to apps/photos/src/services/machineLearning/mobileFaceNetEmbeddingService.ts
diff --git a/src/services/machineLearning/objectService.ts b/apps/photos/src/services/machineLearning/objectService.ts
similarity index 100%
rename from src/services/machineLearning/objectService.ts
rename to apps/photos/src/services/machineLearning/objectService.ts
diff --git a/src/services/machineLearning/peopleService.ts b/apps/photos/src/services/machineLearning/peopleService.ts
similarity index 100%
rename from src/services/machineLearning/peopleService.ts
rename to apps/photos/src/services/machineLearning/peopleService.ts
diff --git a/src/services/machineLearning/readerService.ts b/apps/photos/src/services/machineLearning/readerService.ts
similarity index 100%
rename from src/services/machineLearning/readerService.ts
rename to apps/photos/src/services/machineLearning/readerService.ts
diff --git a/src/services/machineLearning/ssdMobileNetV2Service.ts b/apps/photos/src/services/machineLearning/ssdMobileNetV2Service.ts
similarity index 100%
rename from src/services/machineLearning/ssdMobileNetV2Service.ts
rename to apps/photos/src/services/machineLearning/ssdMobileNetV2Service.ts
diff --git a/src/services/migrateThumbnailService.ts b/apps/photos/src/services/migrateThumbnailService.ts
similarity index 100%
rename from src/services/migrateThumbnailService.ts
rename to apps/photos/src/services/migrateThumbnailService.ts
diff --git a/src/services/motionPhotoService.ts b/apps/photos/src/services/motionPhotoService.ts
similarity index 100%
rename from src/services/motionPhotoService.ts
rename to apps/photos/src/services/motionPhotoService.ts
diff --git a/src/services/publicCollectionDownloadManager.ts b/apps/photos/src/services/publicCollectionDownloadManager.ts
similarity index 100%
rename from src/services/publicCollectionDownloadManager.ts
rename to apps/photos/src/services/publicCollectionDownloadManager.ts
diff --git a/src/services/publicCollectionService.ts b/apps/photos/src/services/publicCollectionService.ts
similarity index 100%
rename from src/services/publicCollectionService.ts
rename to apps/photos/src/services/publicCollectionService.ts
diff --git a/src/services/queueProcessor.ts b/apps/photos/src/services/queueProcessor.ts
similarity index 100%
rename from src/services/queueProcessor.ts
rename to apps/photos/src/services/queueProcessor.ts
diff --git a/src/services/readerService.ts b/apps/photos/src/services/readerService.ts
similarity index 100%
rename from src/services/readerService.ts
rename to apps/photos/src/services/readerService.ts
diff --git a/src/services/searchService.ts b/apps/photos/src/services/searchService.ts
similarity index 100%
rename from src/services/searchService.ts
rename to apps/photos/src/services/searchService.ts
diff --git a/src/services/trashService.ts b/apps/photos/src/services/trashService.ts
similarity index 100%
rename from src/services/trashService.ts
rename to apps/photos/src/services/trashService.ts
diff --git a/src/services/typeDetectionService.ts b/apps/photos/src/services/typeDetectionService.ts
similarity index 100%
rename from src/services/typeDetectionService.ts
rename to apps/photos/src/services/typeDetectionService.ts
diff --git a/src/services/updateCreationTimeWithExif.ts b/apps/photos/src/services/updateCreationTimeWithExif.ts
similarity index 100%
rename from src/services/updateCreationTimeWithExif.ts
rename to apps/photos/src/services/updateCreationTimeWithExif.ts
diff --git a/src/services/upload/encryptionService.ts b/apps/photos/src/services/upload/encryptionService.ts
similarity index 100%
rename from src/services/upload/encryptionService.ts
rename to apps/photos/src/services/upload/encryptionService.ts
diff --git a/src/services/upload/exifService.ts b/apps/photos/src/services/upload/exifService.ts
similarity index 100%
rename from src/services/upload/exifService.ts
rename to apps/photos/src/services/upload/exifService.ts
diff --git a/src/services/upload/fileService.ts b/apps/photos/src/services/upload/fileService.ts
similarity index 100%
rename from src/services/upload/fileService.ts
rename to apps/photos/src/services/upload/fileService.ts
diff --git a/src/services/upload/hashService.tsx b/apps/photos/src/services/upload/hashService.tsx
similarity index 100%
rename from src/services/upload/hashService.tsx
rename to apps/photos/src/services/upload/hashService.tsx
diff --git a/src/services/upload/livePhotoService.ts b/apps/photos/src/services/upload/livePhotoService.ts
similarity index 100%
rename from src/services/upload/livePhotoService.ts
rename to apps/photos/src/services/upload/livePhotoService.ts
diff --git a/src/services/upload/magicMetadataService.ts b/apps/photos/src/services/upload/magicMetadataService.ts
similarity index 100%
rename from src/services/upload/magicMetadataService.ts
rename to apps/photos/src/services/upload/magicMetadataService.ts
diff --git a/src/services/upload/metadataService.ts b/apps/photos/src/services/upload/metadataService.ts
similarity index 100%
rename from src/services/upload/metadataService.ts
rename to apps/photos/src/services/upload/metadataService.ts
diff --git a/src/services/upload/multiPartUploadService.ts b/apps/photos/src/services/upload/multiPartUploadService.ts
similarity index 100%
rename from src/services/upload/multiPartUploadService.ts
rename to apps/photos/src/services/upload/multiPartUploadService.ts
diff --git a/src/services/upload/publicUploadHttpClient.ts b/apps/photos/src/services/upload/publicUploadHttpClient.ts
similarity index 100%
rename from src/services/upload/publicUploadHttpClient.ts
rename to apps/photos/src/services/upload/publicUploadHttpClient.ts
diff --git a/src/services/upload/thumbnailService.ts b/apps/photos/src/services/upload/thumbnailService.ts
similarity index 100%
rename from src/services/upload/thumbnailService.ts
rename to apps/photos/src/services/upload/thumbnailService.ts
diff --git a/src/services/upload/uiService.ts b/apps/photos/src/services/upload/uiService.ts
similarity index 100%
rename from src/services/upload/uiService.ts
rename to apps/photos/src/services/upload/uiService.ts
diff --git a/src/services/upload/uploadCancelService.ts b/apps/photos/src/services/upload/uploadCancelService.ts
similarity index 100%
rename from src/services/upload/uploadCancelService.ts
rename to apps/photos/src/services/upload/uploadCancelService.ts
diff --git a/src/services/upload/uploadHttpClient.ts b/apps/photos/src/services/upload/uploadHttpClient.ts
similarity index 100%
rename from src/services/upload/uploadHttpClient.ts
rename to apps/photos/src/services/upload/uploadHttpClient.ts
diff --git a/src/services/upload/uploadManager.ts b/apps/photos/src/services/upload/uploadManager.ts
similarity index 100%
rename from src/services/upload/uploadManager.ts
rename to apps/photos/src/services/upload/uploadManager.ts
diff --git a/src/services/upload/uploadService.ts b/apps/photos/src/services/upload/uploadService.ts
similarity index 100%
rename from src/services/upload/uploadService.ts
rename to apps/photos/src/services/upload/uploadService.ts
diff --git a/src/services/upload/uploader.ts b/apps/photos/src/services/upload/uploader.ts
similarity index 100%
rename from src/services/upload/uploader.ts
rename to apps/photos/src/services/upload/uploader.ts
diff --git a/src/services/upload/videoMetadataService.ts b/apps/photos/src/services/upload/videoMetadataService.ts
similarity index 100%
rename from src/services/upload/videoMetadataService.ts
rename to apps/photos/src/services/upload/videoMetadataService.ts
diff --git a/src/services/userService.ts b/apps/photos/src/services/userService.ts
similarity index 100%
rename from src/services/userService.ts
rename to apps/photos/src/services/userService.ts
diff --git a/src/services/wasm/ffmpeg.ts b/apps/photos/src/services/wasm/ffmpeg.ts
similarity index 100%
rename from src/services/wasm/ffmpeg.ts
rename to apps/photos/src/services/wasm/ffmpeg.ts
diff --git a/src/services/wasmHeicConverter/wasmHEICConverterClient.ts b/apps/photos/src/services/wasmHeicConverter/wasmHEICConverterClient.ts
similarity index 100%
rename from src/services/wasmHeicConverter/wasmHEICConverterClient.ts
rename to apps/photos/src/services/wasmHeicConverter/wasmHEICConverterClient.ts
diff --git a/src/services/wasmHeicConverter/wasmHEICConverterService.ts b/apps/photos/src/services/wasmHeicConverter/wasmHEICConverterService.ts
similarity index 100%
rename from src/services/wasmHeicConverter/wasmHEICConverterService.ts
rename to apps/photos/src/services/wasmHeicConverter/wasmHEICConverterService.ts
diff --git a/src/services/watchFolder/utils.ts b/apps/photos/src/services/watchFolder/utils.ts
similarity index 100%
rename from src/services/watchFolder/utils.ts
rename to apps/photos/src/services/watchFolder/utils.ts
diff --git a/src/services/watchFolder/watchFolderEventHandlers.ts b/apps/photos/src/services/watchFolder/watchFolderEventHandlers.ts
similarity index 100%
rename from src/services/watchFolder/watchFolderEventHandlers.ts
rename to apps/photos/src/services/watchFolder/watchFolderEventHandlers.ts
diff --git a/src/services/watchFolder/watchFolderService.ts b/apps/photos/src/services/watchFolder/watchFolderService.ts
similarity index 100%
rename from src/services/watchFolder/watchFolderService.ts
rename to apps/photos/src/services/watchFolder/watchFolderService.ts
diff --git a/src/services/workerElectronCache/client.ts b/apps/photos/src/services/workerElectronCache/client.ts
similarity index 100%
rename from src/services/workerElectronCache/client.ts
rename to apps/photos/src/services/workerElectronCache/client.ts
diff --git a/src/services/workerElectronCache/service.ts b/apps/photos/src/services/workerElectronCache/service.ts
similarity index 100%
rename from src/services/workerElectronCache/service.ts
rename to apps/photos/src/services/workerElectronCache/service.ts
diff --git a/src/styles/dropdown.ts b/apps/photos/src/styles/dropdown.ts
similarity index 100%
rename from src/styles/dropdown.ts
rename to apps/photos/src/styles/dropdown.ts
diff --git a/src/styles/global.css b/apps/photos/src/styles/global.css
similarity index 100%
rename from src/styles/global.css
rename to apps/photos/src/styles/global.css
diff --git a/src/styles/linkExpiry.tsx b/apps/photos/src/styles/linkExpiry.tsx
similarity index 100%
rename from src/styles/linkExpiry.tsx
rename to apps/photos/src/styles/linkExpiry.tsx
diff --git a/src/styles/search.ts b/apps/photos/src/styles/search.ts
similarity index 100%
rename from src/styles/search.ts
rename to apps/photos/src/styles/search.ts
diff --git a/src/themes/colors/dark.ts b/apps/photos/src/themes/colors/dark.ts
similarity index 100%
rename from src/themes/colors/dark.ts
rename to apps/photos/src/themes/colors/dark.ts
diff --git a/src/themes/colors/fixed.ts b/apps/photos/src/themes/colors/fixed.ts
similarity index 100%
rename from src/themes/colors/fixed.ts
rename to apps/photos/src/themes/colors/fixed.ts
diff --git a/src/themes/colors/index.ts b/apps/photos/src/themes/colors/index.ts
similarity index 100%
rename from src/themes/colors/index.ts
rename to apps/photos/src/themes/colors/index.ts
diff --git a/src/themes/colors/light.ts b/apps/photos/src/themes/colors/light.ts
similarity index 100%
rename from src/themes/colors/light.ts
rename to apps/photos/src/themes/colors/light.ts
diff --git a/src/themes/components.ts b/apps/photos/src/themes/components.ts
similarity index 100%
rename from src/themes/components.ts
rename to apps/photos/src/themes/components.ts
diff --git a/src/themes/createEmotionCache.ts b/apps/photos/src/themes/createEmotionCache.ts
similarity index 100%
rename from src/themes/createEmotionCache.ts
rename to apps/photos/src/themes/createEmotionCache.ts
diff --git a/src/themes/index.ts b/apps/photos/src/themes/index.ts
similarity index 100%
rename from src/themes/index.ts
rename to apps/photos/src/themes/index.ts
diff --git a/src/themes/palette/index.tsx b/apps/photos/src/themes/palette/index.tsx
similarity index 100%
rename from src/themes/palette/index.tsx
rename to apps/photos/src/themes/palette/index.tsx
diff --git a/src/themes/types.ts b/apps/photos/src/themes/types.ts
similarity index 100%
rename from src/themes/types.ts
rename to apps/photos/src/themes/types.ts
diff --git a/src/themes/typography.ts b/apps/photos/src/themes/typography.ts
similarity index 100%
rename from src/themes/typography.ts
rename to apps/photos/src/themes/typography.ts
diff --git a/src/types/Notification/index.tsx b/apps/photos/src/types/Notification/index.tsx
similarity index 100%
rename from src/types/Notification/index.tsx
rename to apps/photos/src/types/Notification/index.tsx
diff --git a/src/types/authenticator/api.ts b/apps/photos/src/types/authenticator/api.ts
similarity index 100%
rename from src/types/authenticator/api.ts
rename to apps/photos/src/types/authenticator/api.ts
diff --git a/src/types/authenticator/code.ts b/apps/photos/src/types/authenticator/code.ts
similarity index 100%
rename from src/types/authenticator/code.ts
rename to apps/photos/src/types/authenticator/code.ts
diff --git a/src/types/billing/index.ts b/apps/photos/src/types/billing/index.ts
similarity index 100%
rename from src/types/billing/index.ts
rename to apps/photos/src/types/billing/index.ts
diff --git a/src/types/cache/index.ts b/apps/photos/src/types/cache/index.ts
similarity index 100%
rename from src/types/cache/index.ts
rename to apps/photos/src/types/cache/index.ts
diff --git a/src/types/collection/index.ts b/apps/photos/src/types/collection/index.ts
similarity index 100%
rename from src/types/collection/index.ts
rename to apps/photos/src/types/collection/index.ts
diff --git a/src/types/common/config.ts b/apps/photos/src/types/common/config.ts
similarity index 100%
rename from src/types/common/config.ts
rename to apps/photos/src/types/common/config.ts
diff --git a/src/types/common/job.ts b/apps/photos/src/types/common/job.ts
similarity index 100%
rename from src/types/common/job.ts
rename to apps/photos/src/types/common/job.ts
diff --git a/src/types/crypto/index.ts b/apps/photos/src/types/crypto/index.ts
similarity index 100%
rename from src/types/crypto/index.ts
rename to apps/photos/src/types/crypto/index.ts
diff --git a/src/types/deduplicate/index.ts b/apps/photos/src/types/deduplicate/index.ts
similarity index 100%
rename from src/types/deduplicate/index.ts
rename to apps/photos/src/types/deduplicate/index.ts
diff --git a/src/types/dialogBox/index.ts b/apps/photos/src/types/dialogBox/index.ts
similarity index 100%
rename from src/types/dialogBox/index.ts
rename to apps/photos/src/types/dialogBox/index.ts
diff --git a/src/types/electron/index.ts b/apps/photos/src/types/electron/index.ts
similarity index 100%
rename from src/types/electron/index.ts
rename to apps/photos/src/types/electron/index.ts
diff --git a/src/types/export/index.ts b/apps/photos/src/types/export/index.ts
similarity index 100%
rename from src/types/export/index.ts
rename to apps/photos/src/types/export/index.ts
diff --git a/src/types/file/index.ts b/apps/photos/src/types/file/index.ts
similarity index 100%
rename from src/types/file/index.ts
rename to apps/photos/src/types/file/index.ts
diff --git a/src/types/gallery/index.ts b/apps/photos/src/types/gallery/index.ts
similarity index 100%
rename from src/types/gallery/index.ts
rename to apps/photos/src/types/gallery/index.ts
diff --git a/src/types/image/index.ts b/apps/photos/src/types/image/index.ts
similarity index 100%
rename from src/types/image/index.ts
rename to apps/photos/src/types/image/index.ts
diff --git a/src/types/machineLearning/archface.ts b/apps/photos/src/types/machineLearning/archface.ts
similarity index 100%
rename from src/types/machineLearning/archface.ts
rename to apps/photos/src/types/machineLearning/archface.ts
diff --git a/src/types/machineLearning/index.ts b/apps/photos/src/types/machineLearning/index.ts
similarity index 100%
rename from src/types/machineLearning/index.ts
rename to apps/photos/src/types/machineLearning/index.ts
diff --git a/src/types/machineLearning/ui.ts b/apps/photos/src/types/machineLearning/ui.ts
similarity index 100%
rename from src/types/machineLearning/ui.ts
rename to apps/photos/src/types/machineLearning/ui.ts
diff --git a/src/types/magicMetadata/index.ts b/apps/photos/src/types/magicMetadata/index.ts
similarity index 100%
rename from src/types/magicMetadata/index.ts
rename to apps/photos/src/types/magicMetadata/index.ts
diff --git a/src/types/publicCollection/index.ts b/apps/photos/src/types/publicCollection/index.ts
similarity index 100%
rename from src/types/publicCollection/index.ts
rename to apps/photos/src/types/publicCollection/index.ts
diff --git a/src/types/search/index.ts b/apps/photos/src/types/search/index.ts
similarity index 100%
rename from src/types/search/index.ts
rename to apps/photos/src/types/search/index.ts
diff --git a/src/types/theme/index.ts b/apps/photos/src/types/theme/index.ts
similarity index 100%
rename from src/types/theme/index.ts
rename to apps/photos/src/types/theme/index.ts
diff --git a/src/types/trash/index.ts b/apps/photos/src/types/trash/index.ts
similarity index 100%
rename from src/types/trash/index.ts
rename to apps/photos/src/types/trash/index.ts
diff --git a/src/types/upload/index.ts b/apps/photos/src/types/upload/index.ts
similarity index 100%
rename from src/types/upload/index.ts
rename to apps/photos/src/types/upload/index.ts
diff --git a/src/types/upload/ui.ts b/apps/photos/src/types/upload/ui.ts
similarity index 100%
rename from src/types/upload/ui.ts
rename to apps/photos/src/types/upload/ui.ts
diff --git a/src/types/user/index.ts b/apps/photos/src/types/user/index.ts
similarity index 100%
rename from src/types/user/index.ts
rename to apps/photos/src/types/user/index.ts
diff --git a/src/types/watchFolder/index.ts b/apps/photos/src/types/watchFolder/index.ts
similarity index 100%
rename from src/types/watchFolder/index.ts
rename to apps/photos/src/types/watchFolder/index.ts
diff --git a/src/utils/billing/index.ts b/apps/photos/src/utils/billing/index.ts
similarity index 100%
rename from src/utils/billing/index.ts
rename to apps/photos/src/utils/billing/index.ts
diff --git a/src/utils/collection/index.ts b/apps/photos/src/utils/collection/index.ts
similarity index 100%
rename from src/utils/collection/index.ts
rename to apps/photos/src/utils/collection/index.ts
diff --git a/src/utils/comlink/ComlinkConvertWorker.ts b/apps/photos/src/utils/comlink/ComlinkConvertWorker.ts
similarity index 100%
rename from src/utils/comlink/ComlinkConvertWorker.ts
rename to apps/photos/src/utils/comlink/ComlinkConvertWorker.ts
diff --git a/src/utils/comlink/ComlinkCryptoWorker.ts b/apps/photos/src/utils/comlink/ComlinkCryptoWorker.ts
similarity index 100%
rename from src/utils/comlink/ComlinkCryptoWorker.ts
rename to apps/photos/src/utils/comlink/ComlinkCryptoWorker.ts
diff --git a/src/utils/comlink/ComlinkFFmpegWorker.ts b/apps/photos/src/utils/comlink/ComlinkFFmpegWorker.ts
similarity index 100%
rename from src/utils/comlink/ComlinkFFmpegWorker.ts
rename to apps/photos/src/utils/comlink/ComlinkFFmpegWorker.ts
diff --git a/src/utils/comlink/ComlinkMLWorker.ts b/apps/photos/src/utils/comlink/ComlinkMLWorker.ts
similarity index 100%
rename from src/utils/comlink/ComlinkMLWorker.ts
rename to apps/photos/src/utils/comlink/ComlinkMLWorker.ts
diff --git a/src/utils/comlink/comlinkWorker.ts b/apps/photos/src/utils/comlink/comlinkWorker.ts
similarity index 100%
rename from src/utils/comlink/comlinkWorker.ts
rename to apps/photos/src/utils/comlink/comlinkWorker.ts
diff --git a/src/utils/common/apiUtil.ts b/apps/photos/src/utils/common/apiUtil.ts
similarity index 100%
rename from src/utils/common/apiUtil.ts
rename to apps/photos/src/utils/common/apiUtil.ts
diff --git a/src/utils/common/concurrency.ts b/apps/photos/src/utils/common/concurrency.ts
similarity index 100%
rename from src/utils/common/concurrency.ts
rename to apps/photos/src/utils/common/concurrency.ts
diff --git a/src/utils/common/deviceDetection.ts b/apps/photos/src/utils/common/deviceDetection.ts
similarity index 100%
rename from src/utils/common/deviceDetection.ts
rename to apps/photos/src/utils/common/deviceDetection.ts
diff --git a/src/utils/common/index.ts b/apps/photos/src/utils/common/index.ts
similarity index 100%
rename from src/utils/common/index.ts
rename to apps/photos/src/utils/common/index.ts
diff --git a/src/utils/common/job.ts b/apps/photos/src/utils/common/job.ts
similarity index 100%
rename from src/utils/common/job.ts
rename to apps/photos/src/utils/common/job.ts
diff --git a/src/utils/common/key.ts b/apps/photos/src/utils/common/key.ts
similarity index 100%
rename from src/utils/common/key.ts
rename to apps/photos/src/utils/common/key.ts
diff --git a/src/utils/common/promiseTimeout.ts b/apps/photos/src/utils/common/promiseTimeout.ts
similarity index 100%
rename from src/utils/common/promiseTimeout.ts
rename to apps/photos/src/utils/common/promiseTimeout.ts
diff --git a/src/utils/crypto/index.ts b/apps/photos/src/utils/crypto/index.ts
similarity index 100%
rename from src/utils/crypto/index.ts
rename to apps/photos/src/utils/crypto/index.ts
diff --git a/src/utils/crypto/libsodium.ts b/apps/photos/src/utils/crypto/libsodium.ts
similarity index 100%
rename from src/utils/crypto/libsodium.ts
rename to apps/photos/src/utils/crypto/libsodium.ts
diff --git a/src/utils/error/index.ts b/apps/photos/src/utils/error/index.ts
similarity index 100%
rename from src/utils/error/index.ts
rename to apps/photos/src/utils/error/index.ts
diff --git a/src/utils/error/ui.ts b/apps/photos/src/utils/error/ui.ts
similarity index 100%
rename from src/utils/error/ui.ts
rename to apps/photos/src/utils/error/ui.ts
diff --git a/src/utils/export/index.ts b/apps/photos/src/utils/export/index.ts
similarity index 100%
rename from src/utils/export/index.ts
rename to apps/photos/src/utils/export/index.ts
diff --git a/src/utils/ffmpeg/index.ts b/apps/photos/src/utils/ffmpeg/index.ts
similarity index 100%
rename from src/utils/ffmpeg/index.ts
rename to apps/photos/src/utils/ffmpeg/index.ts
diff --git a/src/utils/file/blob.ts b/apps/photos/src/utils/file/blob.ts
similarity index 100%
rename from src/utils/file/blob.ts
rename to apps/photos/src/utils/file/blob.ts
diff --git a/src/utils/file/index.ts b/apps/photos/src/utils/file/index.ts
similarity index 100%
rename from src/utils/file/index.ts
rename to apps/photos/src/utils/file/index.ts
diff --git a/src/utils/file/livePhoto.ts b/apps/photos/src/utils/file/livePhoto.ts
similarity index 100%
rename from src/utils/file/livePhoto.ts
rename to apps/photos/src/utils/file/livePhoto.ts
diff --git a/src/utils/file/size.ts b/apps/photos/src/utils/file/size.ts
similarity index 100%
rename from src/utils/file/size.ts
rename to apps/photos/src/utils/file/size.ts
diff --git a/src/utils/i18n/index.ts b/apps/photos/src/utils/i18n/index.ts
similarity index 100%
rename from src/utils/i18n/index.ts
rename to apps/photos/src/utils/i18n/index.ts
diff --git a/src/utils/image/index.ts b/apps/photos/src/utils/image/index.ts
similarity index 100%
rename from src/utils/image/index.ts
rename to apps/photos/src/utils/image/index.ts
diff --git a/src/utils/logging/index.ts b/apps/photos/src/utils/logging/index.ts
similarity index 100%
rename from src/utils/logging/index.ts
rename to apps/photos/src/utils/logging/index.ts
diff --git a/src/utils/machineLearning/clustering.ts b/apps/photos/src/utils/machineLearning/clustering.ts
similarity index 100%
rename from src/utils/machineLearning/clustering.ts
rename to apps/photos/src/utils/machineLearning/clustering.ts
diff --git a/src/utils/machineLearning/compatibility.ts b/apps/photos/src/utils/machineLearning/compatibility.ts
similarity index 100%
rename from src/utils/machineLearning/compatibility.ts
rename to apps/photos/src/utils/machineLearning/compatibility.ts
diff --git a/src/utils/machineLearning/config.ts b/apps/photos/src/utils/machineLearning/config.ts
similarity index 100%
rename from src/utils/machineLearning/config.ts
rename to apps/photos/src/utils/machineLearning/config.ts
diff --git a/src/utils/machineLearning/faceAlign.ts b/apps/photos/src/utils/machineLearning/faceAlign.ts
similarity index 100%
rename from src/utils/machineLearning/faceAlign.ts
rename to apps/photos/src/utils/machineLearning/faceAlign.ts
diff --git a/src/utils/machineLearning/faceCrop.ts b/apps/photos/src/utils/machineLearning/faceCrop.ts
similarity index 100%
rename from src/utils/machineLearning/faceCrop.ts
rename to apps/photos/src/utils/machineLearning/faceCrop.ts
diff --git a/src/utils/machineLearning/faceDetection.ts b/apps/photos/src/utils/machineLearning/faceDetection.ts
similarity index 100%
rename from src/utils/machineLearning/faceDetection.ts
rename to apps/photos/src/utils/machineLearning/faceDetection.ts
diff --git a/src/utils/machineLearning/index.ts b/apps/photos/src/utils/machineLearning/index.ts
similarity index 100%
rename from src/utils/machineLearning/index.ts
rename to apps/photos/src/utils/machineLearning/index.ts
diff --git a/src/utils/machineLearning/migrations.ts b/apps/photos/src/utils/machineLearning/migrations.ts
similarity index 100%
rename from src/utils/machineLearning/migrations.ts
rename to apps/photos/src/utils/machineLearning/migrations.ts
diff --git a/src/utils/machineLearning/mldataExport.ts b/apps/photos/src/utils/machineLearning/mldataExport.ts
similarity index 100%
rename from src/utils/machineLearning/mldataExport.ts
rename to apps/photos/src/utils/machineLearning/mldataExport.ts
diff --git a/src/utils/machineLearning/transform.ts b/apps/photos/src/utils/machineLearning/transform.ts
similarity index 100%
rename from src/utils/machineLearning/transform.ts
rename to apps/photos/src/utils/machineLearning/transform.ts
diff --git a/src/utils/machineLearning/visualization.ts b/apps/photos/src/utils/machineLearning/visualization.ts
similarity index 100%
rename from src/utils/machineLearning/visualization.ts
rename to apps/photos/src/utils/machineLearning/visualization.ts
diff --git a/src/utils/magicMetadata/index.ts b/apps/photos/src/utils/magicMetadata/index.ts
similarity index 100%
rename from src/utils/magicMetadata/index.ts
rename to apps/photos/src/utils/magicMetadata/index.ts
diff --git a/src/utils/network/index.ts b/apps/photos/src/utils/network/index.ts
similarity index 100%
rename from src/utils/network/index.ts
rename to apps/photos/src/utils/network/index.ts
diff --git a/src/utils/number/format.ts b/apps/photos/src/utils/number/format.ts
similarity index 100%
rename from src/utils/number/format.ts
rename to apps/photos/src/utils/number/format.ts
diff --git a/src/utils/photoFrame/index.ts b/apps/photos/src/utils/photoFrame/index.ts
similarity index 100%
rename from src/utils/photoFrame/index.ts
rename to apps/photos/src/utils/photoFrame/index.ts
diff --git a/src/utils/publicCollectionGallery/index.ts b/apps/photos/src/utils/publicCollectionGallery/index.ts
similarity index 100%
rename from src/utils/publicCollectionGallery/index.ts
rename to apps/photos/src/utils/publicCollectionGallery/index.ts
diff --git a/src/utils/search/index.ts b/apps/photos/src/utils/search/index.ts
similarity index 100%
rename from src/utils/search/index.ts
rename to apps/photos/src/utils/search/index.ts
diff --git a/src/utils/sentry/index.ts b/apps/photos/src/utils/sentry/index.ts
similarity index 100%
rename from src/utils/sentry/index.ts
rename to apps/photos/src/utils/sentry/index.ts
diff --git a/src/utils/storage/cache.ts b/apps/photos/src/utils/storage/cache.ts
similarity index 100%
rename from src/utils/storage/cache.ts
rename to apps/photos/src/utils/storage/cache.ts
diff --git a/src/utils/storage/index.ts b/apps/photos/src/utils/storage/index.ts
similarity index 100%
rename from src/utils/storage/index.ts
rename to apps/photos/src/utils/storage/index.ts
diff --git a/src/utils/storage/localForage.ts b/apps/photos/src/utils/storage/localForage.ts
similarity index 100%
rename from src/utils/storage/localForage.ts
rename to apps/photos/src/utils/storage/localForage.ts
diff --git a/src/utils/storage/localStorage.ts b/apps/photos/src/utils/storage/localStorage.ts
similarity index 100%
rename from src/utils/storage/localStorage.ts
rename to apps/photos/src/utils/storage/localStorage.ts
diff --git a/src/utils/storage/mlIDbStorage.ts b/apps/photos/src/utils/storage/mlIDbStorage.ts
similarity index 100%
rename from src/utils/storage/mlIDbStorage.ts
rename to apps/photos/src/utils/storage/mlIDbStorage.ts
diff --git a/src/utils/storage/mlStorage.ts b/apps/photos/src/utils/storage/mlStorage.ts
similarity index 100%
rename from src/utils/storage/mlStorage.ts
rename to apps/photos/src/utils/storage/mlStorage.ts
diff --git a/src/utils/storage/sessionStorage.ts b/apps/photos/src/utils/storage/sessionStorage.ts
similarity index 100%
rename from src/utils/storage/sessionStorage.ts
rename to apps/photos/src/utils/storage/sessionStorage.ts
diff --git a/src/utils/temp/index.ts b/apps/photos/src/utils/temp/index.ts
similarity index 100%
rename from src/utils/temp/index.ts
rename to apps/photos/src/utils/temp/index.ts
diff --git a/src/utils/time/format.ts b/apps/photos/src/utils/time/format.ts
similarity index 100%
rename from src/utils/time/format.ts
rename to apps/photos/src/utils/time/format.ts
diff --git a/src/utils/time/index.ts b/apps/photos/src/utils/time/index.ts
similarity index 100%
rename from src/utils/time/index.ts
rename to apps/photos/src/utils/time/index.ts
diff --git a/src/utils/ui/index.tsx b/apps/photos/src/utils/ui/index.tsx
similarity index 100%
rename from src/utils/ui/index.tsx
rename to apps/photos/src/utils/ui/index.tsx
diff --git a/src/utils/upload/index.ts b/apps/photos/src/utils/upload/index.ts
similarity index 100%
rename from src/utils/upload/index.ts
rename to apps/photos/src/utils/upload/index.ts
diff --git a/src/utils/upload/isCanvasBlocked.ts b/apps/photos/src/utils/upload/isCanvasBlocked.ts
similarity index 100%
rename from src/utils/upload/isCanvasBlocked.ts
rename to apps/photos/src/utils/upload/isCanvasBlocked.ts
diff --git a/src/utils/upload/uploadRetrier.ts b/apps/photos/src/utils/upload/uploadRetrier.ts
similarity index 100%
rename from src/utils/upload/uploadRetrier.ts
rename to apps/photos/src/utils/upload/uploadRetrier.ts
diff --git a/src/utils/user/family.ts b/apps/photos/src/utils/user/family.ts
similarity index 100%
rename from src/utils/user/family.ts
rename to apps/photos/src/utils/user/family.ts
diff --git a/src/utils/user/index.ts b/apps/photos/src/utils/user/index.ts
similarity index 100%
rename from src/utils/user/index.ts
rename to apps/photos/src/utils/user/index.ts
diff --git a/src/utils/watch/index.ts b/apps/photos/src/utils/watch/index.ts
similarity index 100%
rename from src/utils/watch/index.ts
rename to apps/photos/src/utils/watch/index.ts
diff --git a/src/utils/workerElectronCache/proxy.ts b/apps/photos/src/utils/workerElectronCache/proxy.ts
similarity index 100%
rename from src/utils/workerElectronCache/proxy.ts
rename to apps/photos/src/utils/workerElectronCache/proxy.ts
diff --git a/src/utils/workerElectronCache/transferHandler.ts b/apps/photos/src/utils/workerElectronCache/transferHandler.ts
similarity index 100%
rename from src/utils/workerElectronCache/transferHandler.ts
rename to apps/photos/src/utils/workerElectronCache/transferHandler.ts
diff --git a/src/worker/convert.worker.ts b/apps/photos/src/worker/convert.worker.ts
similarity index 100%
rename from src/worker/convert.worker.ts
rename to apps/photos/src/worker/convert.worker.ts
diff --git a/src/worker/crypto.worker.ts b/apps/photos/src/worker/crypto.worker.ts
similarity index 100%
rename from src/worker/crypto.worker.ts
rename to apps/photos/src/worker/crypto.worker.ts
diff --git a/src/worker/ffmpeg.worker.ts b/apps/photos/src/worker/ffmpeg.worker.ts
similarity index 100%
rename from src/worker/ffmpeg.worker.ts
rename to apps/photos/src/worker/ffmpeg.worker.ts
diff --git a/src/worker/ml.worker.ts b/apps/photos/src/worker/ml.worker.ts
similarity index 100%
rename from src/worker/ml.worker.ts
rename to apps/photos/src/worker/ml.worker.ts
diff --git a/tests/upload.test.ts b/apps/photos/tests/upload.test.ts
similarity index 100%
rename from tests/upload.test.ts
rename to apps/photos/tests/upload.test.ts
diff --git a/tests/zip-file-reading.test.ts b/apps/photos/tests/zip-file-reading.test.ts
similarity index 100%
rename from tests/zip-file-reading.test.ts
rename to apps/photos/tests/zip-file-reading.test.ts
diff --git a/thirdparty/face-api/classes/BoundingBox.ts b/apps/photos/thirdparty/face-api/classes/BoundingBox.ts
similarity index 100%
rename from thirdparty/face-api/classes/BoundingBox.ts
rename to apps/photos/thirdparty/face-api/classes/BoundingBox.ts
diff --git a/thirdparty/face-api/classes/Box.ts b/apps/photos/thirdparty/face-api/classes/Box.ts
similarity index 100%
rename from thirdparty/face-api/classes/Box.ts
rename to apps/photos/thirdparty/face-api/classes/Box.ts
diff --git a/thirdparty/face-api/classes/Dimensions.ts b/apps/photos/thirdparty/face-api/classes/Dimensions.ts
similarity index 100%
rename from thirdparty/face-api/classes/Dimensions.ts
rename to apps/photos/thirdparty/face-api/classes/Dimensions.ts
diff --git a/thirdparty/face-api/classes/Point.ts b/apps/photos/thirdparty/face-api/classes/Point.ts
similarity index 100%
rename from thirdparty/face-api/classes/Point.ts
rename to apps/photos/thirdparty/face-api/classes/Point.ts
diff --git a/thirdparty/face-api/classes/Rect.ts b/apps/photos/thirdparty/face-api/classes/Rect.ts
similarity index 100%
rename from thirdparty/face-api/classes/Rect.ts
rename to apps/photos/thirdparty/face-api/classes/Rect.ts
diff --git a/thirdparty/face-api/classes/index.ts b/apps/photos/thirdparty/face-api/classes/index.ts
similarity index 100%
rename from thirdparty/face-api/classes/index.ts
rename to apps/photos/thirdparty/face-api/classes/index.ts
diff --git a/thirdparty/face-api/utils/index.ts b/apps/photos/thirdparty/face-api/utils/index.ts
similarity index 100%
rename from thirdparty/face-api/utils/index.ts
rename to apps/photos/thirdparty/face-api/utils/index.ts
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.eslintrc b/apps/photos/thirdparty/ffmpeg-wasm/.eslintrc
new file mode 100644
index 000000000..28bb0060b
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.eslintrc
@@ -0,0 +1,14 @@
+{
+ "extends": "airbnb-base",
+ "rules": {
+ "no-underscore-dangle": 0,
+ "linebreak-style": 0,
+ "global-require": 0,
+ "no-await-in-loop": 0,
+ "no-console": 0,
+ },
+ "env": {
+ "browser": true,
+ "node": true
+ }
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/FUNDING.yml b/apps/photos/thirdparty/ffmpeg-wasm/.github/FUNDING.yml
new file mode 100644
index 000000000..fb5b9157d
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [jeromewu]# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: "npm/@ffmpeg/ffmpeg"
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom:
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/bug_report.md b/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..dd84ea782
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,38 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Browser [e.g. chrome, safari]
+ - Version [e.g. 22]
+
+**Smartphone (please complete the following information):**
+ - Device: [e.g. iPhone6]
+ - OS: [e.g. iOS8.1]
+ - Browser [e.g. stock browser, safari]
+ - Version [e.g. 22]
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/feature_request.md b/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 000000000..bbcbbe7d6
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/SECURITY.md b/apps/photos/thirdparty/ffmpeg-wasm/.github/SECURITY.md
new file mode 100644
index 000000000..da9c516dd
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/SECURITY.md
@@ -0,0 +1,5 @@
+## Security contact information
+
+To report a security vulnerability, please use the
+[Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/codeql-analysis.yml b/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/codeql-analysis.yml
new file mode 100644
index 000000000..fe5e49e7a
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,68 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+# ******** NOTE ********
+
+name: "CodeQL"
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ master ]
+ schedule:
+ - cron: '35 5 * * 4'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'javascript' ]
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
+ # Learn more...
+ # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually (see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
+
+ # ℹ️ Command-line programs to run using the OS shell.
+ # 📚 https://git.io/JvXDl
+
+ # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+ #- run: |
+ # make bootstrap
+ # make release
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/main.yml b/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/main.yml
new file mode 100644
index 000000000..1f997f3ad
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.github/workflows/main.yml
@@ -0,0 +1,31 @@
+name: CI
+
+on:
+ pull_request:
+ branches:
+ - master
+ push:
+ branches:
+ - master
+
+jobs:
+ test:
+ name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ node_version: ['12'] #['8', '10', '12']
+ os: [ubuntu-latest] #[ubuntu-latest, windows-latest, macOS-latest]
+
+ steps:
+ - uses: actions/checkout@v1
+ - name: Use Node.js ${{ matrix.node_version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node_version }}
+
+ - name: npm install, build and test
+ run: |
+ npm install
+ npm run lint
+ npm test
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.gitignore b/apps/photos/thirdparty/ffmpeg-wasm/.gitignore
new file mode 100644
index 000000000..064213fd6
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.gitignore
@@ -0,0 +1,4 @@
+node_modules
+dist
+/.nyc_output
+.DS_Store
\ No newline at end of file
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.Dockerfile b/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.Dockerfile
new file mode 100644
index 000000000..dc5632c5b
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.Dockerfile
@@ -0,0 +1,2 @@
+FROM gitpod/workspace-full
+RUN sudo apt-get update && sudo apt-get install -y libgtk-3-0 libx11-xcb1 libnss3 libxss1 libasound2
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.yml b/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.yml
new file mode 100644
index 000000000..371e1c9d6
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.gitpod.yml
@@ -0,0 +1,7 @@
+image:
+ file: .gitpod.Dockerfile
+tasks:
+- init: >
+ wget https://github.com/jeromewu/docker-workspace/raw/master/vim.zip -O /tmp/vim.zip &> /dev/null &&
+ unzip /tmp/vim.zip -d /home/gitpod &> /dev/null &&
+ npm install
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/.npmignore b/apps/photos/thirdparty/ffmpeg-wasm/.npmignore
new file mode 100644
index 000000000..42182d05b
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/.npmignore
@@ -0,0 +1,6 @@
+.eslintrc
+.github
+.nyc_output
+docs
+tests
+examples
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/CODE_OF_CONDUCT.md b/apps/photos/thirdparty/ffmpeg-wasm/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..e8b22d6e2
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at jeromewus@gmail.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/CONTRIBUTING.md b/apps/photos/thirdparty/ffmpeg-wasm/CONTRIBUTING.md
new file mode 100644
index 000000000..00d7bdd40
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/CONTRIBUTING.md
@@ -0,0 +1 @@
+WIP
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/LICENSE b/apps/photos/thirdparty/ffmpeg-wasm/LICENSE
new file mode 100644
index 000000000..3032c6744
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Jerome Wu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/README.md b/apps/photos/thirdparty/ffmpeg-wasm/README.md
new file mode 100644
index 000000000..27e05f8cf
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/README.md
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+# ffmpeg.wasm
+
+[![Node Version](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg)](https://img.shields.io/node/v/@ffmpeg/ffmpeg.svg)
+[![Actions Status](https://github.com/ffmpegwasm/ffmpeg.wasm/workflows/CI/badge.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/actions)
+![CodeQL](https://github.com/ffmpegwasm/ffmpeg.wasm/workflows/CodeQL/badge.svg)
+![npm (tag)](https://img.shields.io/npm/v/@ffmpeg/ffmpeg/latest)
+[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://github.com/ffmpegwasm/ffmpeg.wasm/graphs/commit-activity)
+[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
+[![Code Style](https://badgen.net/badge/code%20style/airbnb/ff5a5f?icon=airbnb)](https://github.com/airbnb/javascript)
+[![Downloads Total](https://img.shields.io/npm/dt/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg)
+[![Downloads Month](https://img.shields.io/npm/dm/@ffmpeg/ffmpeg.svg)](https://www.npmjs.com/package/@ffmpeg/ffmpeg)
+
+ffmpeg.wasm is a pure Webassembly / Javascript port of FFmpeg. It enables video & audio record, convert and stream right inside browsers.
+
+**AVI to MP4 Demo**
+
+
+
+
+
+
+Try it: [https://ffmpegwasm.netlify.app](https://ffmpegwasm.netlify.app#demo)
+
+
+## Installation
+
+**Node**
+
+```
+$ npm install @ffmpeg/ffmpeg @ffmpeg/core
+```
+
+> As we are using the latest experimental features, you need to add few flags to run in Node.js
+
+```
+$ node --experimental-wasm-threads --experimental-wasm-bulk-memory transcode.js
+```
+
+**Browser**
+
+Or, using a script tag in the browser (only works in some browsers, see list below):
+
+> SharedArrayBuffer is only available to pages that are [cross-origin isolated](https://developer.chrome.com/blog/enabling-shared-array-buffer/#cross-origin-isolation). So you need to host [your own server](https://github.com/ffmpegwasm/ffmpegwasm.github.io/blob/main/server/server.js) with `Cross-Origin-Embedder-Policy: require-corp` and `Cross-Origin-Opener-Policy: same-origin` headers to use ffmpeg.wasm.
+
+```html
+
+
+```
+
+> Only browsers with SharedArrayBuffer support can use ffmpeg.wasm, you can check [HERE](https://caniuse.com/sharedarraybuffer) for the complete list.
+
+## Usage
+
+ffmpeg.wasm provides simple to use APIs, to transcode a video you only need few lines of code:
+
+```javascript
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'test.avi', await fetchFile('./test.avi'));
+ await ffmpeg.run('-i', 'test.avi', 'test.mp4');
+ await fs.promises.writeFile('./test.mp4', ffmpeg.FS('readFile', 'test.mp4'));
+ process.exit(0);
+})();
+```
+
+### Use other version of ffmpeg.wasm-core / @ffmpeg/core
+
+For each version of ffmpeg.wasm, there is a default version of @ffmpeg/core (you can find it in **devDependencies** section of [package.json](https://github.com/ffmpegwasm/ffmpeg.wasm/blob/master/package.json)), but sometimes you may need to use newer version of @ffmpeg/core to use the latest/experimental features.
+
+**Node**
+
+Just install the specific version you need:
+
+```bash
+$ npm install @ffmpeg/core@latest
+```
+
+Or use your own version with customized path
+
+```javascript
+const ffmpeg = createFFmpeg({
+ corePath: '../../../src/ffmpeg-core.js',
+});
+```
+
+**Browser**
+
+```javascript
+const ffmpeg = createFFmpeg({
+ corePath: 'static/js/ffmpeg-core.js',
+});
+```
+
+For the list available versions and their changelog, please check: https://github.com/ffmpegwasm/ffmpeg.wasm-core/releases
+
+## Multi-threading
+
+Multi-threading need to be configured per external libraries, only following libraries supports it now:
+
+### x264
+
+Run it multi-threading mode by default, no need to pass any arguments.
+
+### libvpx / webm
+
+Need to pass `-row-mt 1`, but can only use one thread to help, can speed up around 30%
+
+## Documentation
+
+- [API](https://github.com/ffmpegwasm/ffmpeg.wasm/blob/master/docs/api.md)
+- [Supported External Libraries](https://github.com/ffmpegwasm/ffmpeg.wasm-core#configuration)
+
+## FAQ
+
+### What is the license of ffmpeg.wasm?
+
+There are two components inside ffmpeg.wasm:
+
+- @ffmpeg/ffmpeg (https://github.com/ffmpegwasm/ffmpeg.wasm)
+- @ffmpeg/core (https://github.com/ffmpegwasm/ffmpeg.wasm-core)
+
+@ffmpeg/core contains WebAssembly code which is transpiled from original FFmpeg C code with minor modifications, but overall it still following the same licenses as FFmpeg and its external libraries (as each external libraries might have its own license).
+
+@ffmpeg/ffmpeg contains kind of a wrapper to handle the complexity of loading core and calling low-level APIs. It is a small code base and under MIT license.
+
+### Can I use ffmpeg.wasm in Firefox?
+
+Yes, but only for Firefox 79+ with proper header in both client and server, visit https://ffmpegwasm.netlify.app to try whether your Firefox works.
+
+![](https://user-images.githubusercontent.com/5723124/98955802-4cb20c80-253a-11eb-8f16-ce0298720a2a.png)
+
+For more details: https://github.com/ffmpegwasm/ffmpeg.wasm/issues/106
+
+### What is the maximum size of input file?
+
+2 GB, which is a hard limit in WebAssembly. Might become 4 GB in the future.
+
+### How can I build my own ffmpeg.wasm?
+
+In fact, it is ffmpeg.wasm-core most people would like to build.
+
+To build on your own, you can check build.sh inside https://github.com/ffmpegwasm/ffmpeg.wasm-core repository.
+
+Also you can check this series of posts to learn more fundamental concepts:
+
+- https://jeromewu.github.io/build-ffmpeg-webassembly-version-part-1-preparation/
+- https://jeromewu.github.io/build-ffmpeg-webassembly-version-part-2-compile-with-emscripten/
+- https://jeromewu.github.io/build-ffmpeg-webassembly-version-part-3-v0.1/
+- https://jeromewu.github.io/build-ffmpeg-webassembly-version-part-4-v0.2/
+
+### Why it doesn't work in my local environment?
+
+When calling `ffmpeg.load()`, by default it looks for `http://localhost:3000/node_modules/@ffmpeg/core/dist/` to download essential files (ffmpeg-core.js, ffmpeg-core.wasm, ffmpeg-core.worker.js). It is necessary to make sure you have those files served there.
+
+If you have those files serving in other location, you can rewrite the default behavior when calling `createFFmpeg()`:
+
+```javascript
+const { createFFmpeg } = FFmpeg;
+const ffmpeg = createFFmpeg({
+ corePath: "http://localhost:3000/public/ffmpeg-core.js",
+ // Use public address if you don't want to host your own.
+ // corePath: 'https://unpkg.com/@ffmpeg/core@0.10.0/dist/ffmpeg-core.js'
+ log: true,
+});
+```
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/_config.yml b/apps/photos/thirdparty/ffmpeg-wasm/_config.yml
new file mode 100644
index 000000000..c4192631f
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-cayman
\ No newline at end of file
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/docs/api.md b/apps/photos/thirdparty/ffmpeg-wasm/docs/api.md
new file mode 100644
index 000000000..0c2d815c4
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/docs/api.md
@@ -0,0 +1,205 @@
+# API
+
+- [createFFmpeg()](#create-ffmpeg)
+ - [ffmpeg.load()](#ffmpeg-load)
+ - [ffmpeg.run()](#ffmpeg-run)
+ - [ffmpeg.FS()](#ffmpeg-fs)
+ - [ffmpeg.exit()](#ffmpeg-exit)
+ - [ffmpeg.setLogging()](#ffmpeg-setlogging)
+ - [ffmpeg.setLogger()](#ffmpeg-setlogger)
+ - [ffmpeg.setProgress()](#ffmpeg-setProgress)
+- [fetchFile()](#fetch-file)
+
+---
+
+
+
+## createFFmpeg(options): ffmpeg
+
+createFFmpeg is a factory function that creates a ffmpeg instance.
+
+**Arguments:**
+
+- `options` an object of customized options
+ - `corePath` path for ffmpeg-core.js script
+ - `log` a boolean to turn on all logs, default is `false`
+ - `logger` a function to get log messages, a quick example is `({ message }) => console.log(message)`
+ - `progress` a function to trace the progress, a quick example is `p => console.log(p)`
+
+**Examples:**
+
+```javascript
+const { createFFmpeg } = FFmpeg;
+const ffmpeg = createFFmpeg({
+ corePath: "./node_modules/@ffmpeg/core/dist/ffmpeg-core.js",
+ log: true,
+});
+```
+
+
+
+### ffmpeg.load(): Promise
+
+Load ffmpeg.wasm-core script.
+
+In browser environment, the ffmpeg.wasm-core script is fetch from CDN and can be assign to a local path by assigning `corePath`. In node environment, we use dynamic require and the default `corePath` is `$ffmpeg/core`.
+
+Typically the load() func might take few seconds to minutes to complete, better to do it as early as possible.
+
+**Examples:**
+
+```javascript
+(async () => {
+ await ffmpeg.load();
+})();
+```
+
+
+
+### ffmpeg.run(...args): Promise
+
+This is the major function in ffmpeg.wasm, you can just imagine it as ffmpeg native cli and what you need to pass is the same.
+
+**Arguments:**
+
+- `args` string arguments just like cli tool.
+
+**Examples:**
+
+```javascript
+(async () => {
+ await ffmpeg.run('-i', 'flame.avi', '-s', '1920x1080', 'output.mp4');
+ /* equals to `$ ffmpeg -i flame.avi -s 1920x1080 output.mp4` */
+})();
+```
+
+
+
+### ffmpeg.FS(method, ...args): any
+
+Run FS operations.
+
+For input/output file of ffmpeg.wasm, it is required to save them to MEMFS first so that ffmpeg.wasm is able to consume them. Here we rely on the FS methods provided by Emscripten.
+
+For more info, check https://emscripten.org/docs/api_reference/Filesystem-API.html
+
+**Arguments:**
+
+- `method` string method name
+- `args` arguments to pass to method
+
+**Examples:**
+
+```javascript
+/* Write data to MEMFS, need to use Uint8Array for binary data */
+ffmpeg.FS('writeFile', 'video.avi', new Uint8Array(...));
+/* Read data from MEMFS */
+ffmpeg.FS('readFile', 'video.mp4');
+/* Delete file in MEMFS */
+ffmpeg.FS('unlink', 'video.mp4');
+```
+
+
+
+### ffmpeg.exit()
+
+Kill the execution of the program, also remove MEMFS to free memory
+
+**Examples:**
+
+```javascript
+const ffmpeg = createFFmpeg({ log: true });
+await ffmpeg.load(...);
+setTimeout(() => {
+ ffmpeg.exit(); // ffmpeg.exit() is callable only after load() stage.
+}, 1000);
+await ffmpeg.run(...);
+```
+
+
+
+### ffmpeg.setLogging(logging)
+
+Control whether to output log information to console
+
+**Arguments**
+
+- `logging` a boolean to turn of/off log messages in console
+
+**Examples:**
+
+```javascript
+ffmpeg.setLogging(true);
+```
+
+
+
+### ffmpeg.setLogger(logger)
+
+Set customer logger to get ffmpeg.wasm output messages.
+
+**Arguments**
+
+- `logger` a function to handle the messages
+
+**Examples:**
+
+```javascript
+ffmpeg.setLogger(({ type, message }) => {
+ console.log(type, message);
+ /*
+ * type can be one of following:
+ *
+ * info: internal workflow debug messages
+ * fferr: ffmpeg native stderr output
+ * ffout: ffmpeg native stdout output
+ */
+});
+```
+
+
+
+### ffmpeg.setProgress(progress)
+
+Progress handler to get current progress of ffmpeg command.
+
+**Arguments**
+
+- `progress` a function to handle progress info
+
+**Examples:**
+
+```javascript
+
+ffmpeg.setProgress(({ ratio }) => {
+ console.log(ratio);
+ /*
+ * ratio is a float number between 0 to 1.
+ */
+});
+```
+
+
+
+### fetchFile(media): Promise
+
+Helper function for fetching files from various resource.
+
+Sometimes the video/audio file you want to process may located in a remote URL and somewhere in your local file system.
+
+This helper function helps you to fetch to file and return an Uint8Array variable for ffmpeg.wasm to consume.
+
+**Arguments**
+
+- `media` an URL string, base64 string or File, Blob, Buffer object
+
+**Examples:**
+
+```javascript
+(async () => {
+ const data = await fetchFile('https://github.com/ffmpegwasm/testdata/raw/master/video-3s.avi');
+ /*
+ * data will be in Uint8Array format
+ */
+})();
+```
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/docs/images/ffmpegwasm-icon.png b/apps/photos/thirdparty/ffmpeg-wasm/docs/images/ffmpegwasm-icon.png
new file mode 100644
index 000000000..5d2feaa71
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/docs/images/ffmpegwasm-icon.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/docs/images/transcode.gif b/apps/photos/thirdparty/ffmpeg-wasm/docs/images/transcode.gif
new file mode 100644
index 000000000..1dbfd7f54
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/docs/images/transcode.gif differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/StarWars3.wav b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/StarWars3.wav
new file mode 100644
index 000000000..1a2dd7a19
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/StarWars3.wav differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/flame.avi b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/flame.avi
new file mode 100644
index 000000000..e8e96e30a
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/flame.avi differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/audio.ogg b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/audio.ogg
new file mode 100644
index 000000000..94bcb3ed0
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/audio.ogg differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.000.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.000.png
new file mode 100644
index 000000000..a576569b6
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.000.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.001.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.001.png
new file mode 100644
index 000000000..2c371d07b
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.001.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.002.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.002.png
new file mode 100644
index 000000000..7f8420158
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.002.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.003.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.003.png
new file mode 100644
index 000000000..875b6da6a
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.003.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.004.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.004.png
new file mode 100644
index 000000000..7ec94321b
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.004.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.005.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.005.png
new file mode 100644
index 000000000..9efa064dd
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.005.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.006.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.006.png
new file mode 100644
index 000000000..888226443
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.006.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.007.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.007.png
new file mode 100644
index 000000000..e2fa319a4
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.007.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.008.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.008.png
new file mode 100644
index 000000000..86517c19e
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.008.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.009.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.009.png
new file mode 100644
index 000000000..0cce90d8c
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.009.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.010.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.010.png
new file mode 100644
index 000000000..d4db4b4fd
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.010.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.011.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.011.png
new file mode 100644
index 000000000..daf149aaf
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.011.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.012.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.012.png
new file mode 100644
index 000000000..c077a90f5
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.012.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.013.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.013.png
new file mode 100644
index 000000000..0b4b5730f
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.013.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.014.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.014.png
new file mode 100644
index 000000000..8789354e3
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.014.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.015.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.015.png
new file mode 100644
index 000000000..ab5e89efc
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.015.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.016.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.016.png
new file mode 100644
index 000000000..b2693870e
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.016.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.017.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.017.png
new file mode 100644
index 000000000..db8a243ab
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.017.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.018.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.018.png
new file mode 100644
index 000000000..b374ed72f
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.018.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.019.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.019.png
new file mode 100644
index 000000000..23442292c
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.019.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.020.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.020.png
new file mode 100644
index 000000000..1c9a9ec56
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.020.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.021.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.021.png
new file mode 100644
index 000000000..36e1cc656
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.021.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.022.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.022.png
new file mode 100644
index 000000000..eb7140bbc
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.022.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.023.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.023.png
new file mode 100644
index 000000000..b0131a7ce
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.023.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.024.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.024.png
new file mode 100644
index 000000000..0de537fbf
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.024.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.025.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.025.png
new file mode 100644
index 000000000..3c1ef9de0
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.025.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.026.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.026.png
new file mode 100644
index 000000000..e9205e755
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.026.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.027.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.027.png
new file mode 100644
index 000000000..e9b4c3ea1
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.027.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.028.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.028.png
new file mode 100644
index 000000000..0a940e7c3
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.028.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.029.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.029.png
new file mode 100644
index 000000000..4af8e934b
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.029.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.030.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.030.png
new file mode 100644
index 000000000..508f43c42
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.030.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.031.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.031.png
new file mode 100644
index 000000000..600ccec6d
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.031.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.032.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.032.png
new file mode 100644
index 000000000..8c795c148
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.032.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.033.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.033.png
new file mode 100644
index 000000000..1ad2c2a29
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.033.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.034.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.034.png
new file mode 100644
index 000000000..cba17c9a9
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.034.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.035.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.035.png
new file mode 100644
index 000000000..61106b5f1
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.035.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.036.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.036.png
new file mode 100644
index 000000000..da4a6c3a3
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.036.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.037.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.037.png
new file mode 100644
index 000000000..9ee3a72b6
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.037.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.038.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.038.png
new file mode 100644
index 000000000..16796272b
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.038.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.039.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.039.png
new file mode 100644
index 000000000..cb8a2ec8e
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.039.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.040.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.040.png
new file mode 100644
index 000000000..ad825d914
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.040.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.041.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.041.png
new file mode 100644
index 000000000..37768aabb
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.041.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.042.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.042.png
new file mode 100644
index 000000000..f5d3e62ae
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.042.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.043.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.043.png
new file mode 100644
index 000000000..09f9358e7
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.043.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.044.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.044.png
new file mode 100644
index 000000000..3aa05892e
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.044.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.045.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.045.png
new file mode 100644
index 000000000..b51608000
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.045.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.046.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.046.png
new file mode 100644
index 000000000..d65c15799
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.046.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.047.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.047.png
new file mode 100644
index 000000000..ad444b23a
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.047.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.048.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.048.png
new file mode 100644
index 000000000..b15413a6e
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.048.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.049.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.049.png
new file mode 100644
index 000000000..7ad2101f5
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.049.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.050.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.050.png
new file mode 100644
index 000000000..90cd4fcb8
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.050.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.051.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.051.png
new file mode 100644
index 000000000..cfd4a78fd
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.051.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.052.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.052.png
new file mode 100644
index 000000000..f9c55e135
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.052.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.053.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.053.png
new file mode 100644
index 000000000..32e694939
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.053.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.054.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.054.png
new file mode 100644
index 000000000..703ba6baf
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.054.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.055.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.055.png
new file mode 100644
index 000000000..0119dcf92
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.055.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.056.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.056.png
new file mode 100644
index 000000000..a4813f172
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.056.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.057.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.057.png
new file mode 100644
index 000000000..0cecb9672
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.057.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.058.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.058.png
new file mode 100644
index 000000000..cb1373774
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.058.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.059.png b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.059.png
new file mode 100644
index 000000000..e557cc1c8
Binary files /dev/null and b/apps/photos/thirdparty/ffmpeg-wasm/examples/assets/triangle/tmp.059.png differ
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/README.md b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/README.md
new file mode 100644
index 000000000..0d75e27a3
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/README.md
@@ -0,0 +1,10 @@
+Browser Examples
+==================
+
+To run this example, execute:
+
+```
+$ npm start
+```
+
+Visit http://localhost:3000/examples/browser/transcode.html
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/concatDemuxer.html b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/concatDemuxer.html
new file mode 100644
index 000000000..dc6fb005f
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/concatDemuxer.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+ Select multiple video files to Concatenate
+
+
+
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/image2video.html b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/image2video.html
new file mode 100644
index 000000000..2ca78109e
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/image2video.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ Click start to transcode images to mp4 (x264) and play!
+
+ Start
+
+ Data Set
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/transcode.html b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/transcode.html
new file mode 100644
index 000000000..197863ff7
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/transcode.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+ Upload a video to transcode to mp4 (x264) and play!
+
+
+ Cancel
+
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/trim.html b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/trim.html
new file mode 100644
index 000000000..003b915fb
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/trim.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ Upload a mp4 (x264) video and trim its first 1 seconds and play!
+
+
+
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/webcam.html b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/webcam.html
new file mode 100644
index 000000000..eb9c5e8df
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/browser/webcam.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+ Record video from webcam and transcode to mp4 (x264) and play!
+
+
+
+
+ Start Recording
+
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/concatDemuxer.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/concatDemuxer.js
new file mode 100755
index 000000000..9f8455400
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/concatDemuxer.js
@@ -0,0 +1,13 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'flame.avi', await fetchFile('../assets/flame.avi'));
+ ffmpeg.FS('writeFile', 'concat_list.txt', 'file flame.avi\nfile flame.avi');
+ await ffmpeg.run('-f', 'concat', '-safe', '0', '-i', 'concat_list.txt', 'flame.mp4');
+ await fs.promises.writeFile('flame.mp4', ffmpeg.FS('readFile', 'flame.mp4'));
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/hstack.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/hstack.js
new file mode 100755
index 000000000..ae4c760ec
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/hstack.js
@@ -0,0 +1,12 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'flame.avi', await fetchFile('../assets/flame.avi'));
+ await ffmpeg.run('-i', 'flame.avi', '-i', 'flame.avi', '-filter_complex', 'hstack', 'flame.mp4');
+ await fs.promises.writeFile('flame.mp4', ffmpeg.FS('readFile', 'flame.mp4'));
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/image2video.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/image2video.js
new file mode 100755
index 000000000..7bf55af77
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/image2video.js
@@ -0,0 +1,22 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'audio.ogg', await fetchFile('../assets/triangle/audio.ogg'));
+ for (let i = 0; i < 60; i += 1) {
+ const num = `00${i}`.slice(-3);
+ ffmpeg.FS('writeFile', `tmp.${num}.png`, await fetchFile(`../assets/triangle/tmp.${num}.png`));
+ }
+ console.log(ffmpeg.FS('readdir', '/'));
+ await ffmpeg.run('-framerate', '30', '-pattern_type', 'glob', '-i', '*.png', '-i', 'audio.ogg', '-c:a', 'copy', '-shortest', '-c:v', 'libx264', '-pix_fmt', 'yuv420p', 'out.mp4');
+ await ffmpeg.FS('unlink', 'audio.ogg');
+ for (let i = 0; i < 60; i += 1) {
+ const num = `00${i}`.slice(-3);
+ await ffmpeg.FS('unlink', `tmp.${num}.png`);
+ }
+ await fs.promises.writeFile('out.mp4', ffmpeg.FS('readFile', 'out.mp4'));
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/multiple-output.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/multiple-output.js
new file mode 100755
index 000000000..6190d0f80
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/multiple-output.js
@@ -0,0 +1,14 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'flame.avi', await fetchFile('../assets/flame.avi'));
+ await ffmpeg.run('-i', 'flame.avi', '-map', '0:v', '-r', '25', 'out_%06d.bmp');
+ ffmpeg.FS('readdir', '/').filter((p) => p.endsWith('.bmp')).forEach(async (p) => {
+ fs.writeFileSync(p, ffmpeg.FS('readFile', p));
+ });
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/transcode.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/transcode.js
new file mode 100755
index 000000000..83fe48366
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/transcode.js
@@ -0,0 +1,14 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({
+ log: true,
+});
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'flame.avi', await fetchFile('../assets/flame.avi'));
+ await ffmpeg.run('-i', 'flame.avi', 'flame.mp4');
+ await fs.promises.writeFile('flame.mp4', ffmpeg.FS('readFile', 'flame.mp4'));
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/examples/node/trim.js b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/trim.js
new file mode 100755
index 000000000..adfb01153
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/examples/node/trim.js
@@ -0,0 +1,12 @@
+const fs = require('fs');
+const { createFFmpeg, fetchFile } = require('../../src');
+
+const ffmpeg = createFFmpeg({ log: true });
+
+(async () => {
+ await ffmpeg.load();
+ ffmpeg.FS('writeFile', 'flame.avi', await fetchFile('../assets/flame.avi'));
+ await ffmpeg.run('-i', 'flame.avi', '-ss', '0', '-to', '1', 'flame_trim.avi');
+ await fs.promises.writeFile('flame_trim.avi', ffmpeg.FS('readFile', 'flame_trim.avi'));
+ process.exit(0);
+})();
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/package-lock.json b/apps/photos/thirdparty/ffmpeg-wasm/package-lock.json
new file mode 100644
index 000000000..098a6264a
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/package-lock.json
@@ -0,0 +1,16447 @@
+{
+ "name": "@ffmpeg/ffmpeg",
+ "version": "0.10.1",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@ffmpeg/ffmpeg",
+ "version": "0.10.1",
+ "license": "MIT",
+ "dependencies": {
+ "is-url": "^1.2.4",
+ "node-fetch": "^2.6.1",
+ "regenerator-runtime": "^0.13.7"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/preset-env": "^7.12.1",
+ "@ffmpeg/core": "^0.10.0",
+ "@types/emscripten": "^1.39.4",
+ "babel-loader": "^8.1.0",
+ "chai": "^4.2.0",
+ "cors": "^2.8.5",
+ "eslint": "^7.12.1",
+ "eslint-config-airbnb-base": "^14.1.0",
+ "eslint-plugin-import": "^2.22.1",
+ "express": "^4.17.1",
+ "mocha": "^8.2.1",
+ "mocha-headless-chrome": "^2.0.3",
+ "npm-run-all": "^4.1.5",
+ "wait-on": "^5.3.0",
+ "webpack": "^5.3.2",
+ "webpack-cli": "^4.1.0",
+ "webpack-dev-middleware": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12.16.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz",
+ "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==",
+ "dev": true
+ },
+ "node_modules/@babel/core": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz",
+ "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.1",
+ "@babel/parser": "^7.12.3",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+ "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-module-imports": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
+ "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-replace-supers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
+ "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "node_modules/@babel/core/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/core/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+ "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+ "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz",
+ "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.12.1",
+ "@babel/helper-validator-option": "^7.12.1",
+ "browserslist": "^4.12.0",
+ "semver": "^5.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
+ "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz",
+ "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4",
+ "regexpu-core": "^4.7.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-map": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/types": "^7.10.5",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-define-map/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
+ "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+ "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+ "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
+ "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-module-imports/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-regex": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+ "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-wrap-function": "^7.10.4",
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
+ "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-simple-access/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+ "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
+ "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
+ "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz",
+ "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helpers/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
+ "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1",
+ "@babel/plugin-syntax-async-generators": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
+ "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
+ "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
+ "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-json-strings": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
+ "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
+ "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
+ "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz",
+ "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
+ "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz",
+ "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
+ "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
+ "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
+ "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
+ "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
+ "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
+ "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
+ "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
+ "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-define-map": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "globals": "^11.1.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
+ "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
+ "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
+ "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
+ "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
+ "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
+ "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
+ "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
+ "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
+ "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
+ "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
+ "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-simple-access": "^7.12.1",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
+ "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.10.4",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
+ "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
+ "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
+ "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
+ "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
+ "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
+ "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
+ "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
+ "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
+ "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
+ "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz",
+ "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
+ "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz",
+ "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
+ "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
+ "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz",
+ "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.12.1",
+ "@babel/helper-compilation-targets": "^7.12.1",
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-option": "^7.12.1",
+ "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
+ "@babel/plugin-proposal-class-properties": "^7.12.1",
+ "@babel/plugin-proposal-dynamic-import": "^7.12.1",
+ "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
+ "@babel/plugin-proposal-json-strings": "^7.12.1",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
+ "@babel/plugin-proposal-numeric-separator": "^7.12.1",
+ "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.12.1",
+ "@babel/plugin-proposal-private-methods": "^7.12.1",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
+ "@babel/plugin-syntax-async-generators": "^7.8.0",
+ "@babel/plugin-syntax-class-properties": "^7.12.1",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+ "@babel/plugin-syntax-top-level-await": "^7.12.1",
+ "@babel/plugin-transform-arrow-functions": "^7.12.1",
+ "@babel/plugin-transform-async-to-generator": "^7.12.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
+ "@babel/plugin-transform-block-scoping": "^7.12.1",
+ "@babel/plugin-transform-classes": "^7.12.1",
+ "@babel/plugin-transform-computed-properties": "^7.12.1",
+ "@babel/plugin-transform-destructuring": "^7.12.1",
+ "@babel/plugin-transform-dotall-regex": "^7.12.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.12.1",
+ "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
+ "@babel/plugin-transform-for-of": "^7.12.1",
+ "@babel/plugin-transform-function-name": "^7.12.1",
+ "@babel/plugin-transform-literals": "^7.12.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.12.1",
+ "@babel/plugin-transform-modules-amd": "^7.12.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.12.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.12.1",
+ "@babel/plugin-transform-modules-umd": "^7.12.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
+ "@babel/plugin-transform-new-target": "^7.12.1",
+ "@babel/plugin-transform-object-super": "^7.12.1",
+ "@babel/plugin-transform-parameters": "^7.12.1",
+ "@babel/plugin-transform-property-literals": "^7.12.1",
+ "@babel/plugin-transform-regenerator": "^7.12.1",
+ "@babel/plugin-transform-reserved-words": "^7.12.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.1",
+ "@babel/plugin-transform-spread": "^7.12.1",
+ "@babel/plugin-transform-sticky-regex": "^7.12.1",
+ "@babel/plugin-transform-template-literals": "^7.12.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.12.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.12.1",
+ "@babel/plugin-transform-unicode-regex": "^7.12.1",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.12.1",
+ "core-js-compat": "^3.6.2",
+ "semver": "^5.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
+ "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
+ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
+ "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@ffmpeg/core": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.10.0.tgz",
+ "integrity": "sha512-qunWJl5PezpXEm31tb8Qu5z37B5KVA1VYZCpXchMhuAb3X9T7PuE3SlhOwphEoRhzaOa3lpofDfzihAUMFaVPQ==",
+ "dev": true
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz",
+ "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==",
+ "dev": true
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
+ "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz",
+ "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
+ "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+ "dev": true
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true
+ },
+ "node_modules/@types/emscripten": {
+ "version": "1.39.4",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.4.tgz",
+ "integrity": "sha512-k3LLVMFrdNA9UCvMDPWMbFrGPNb+GcPyw29ktJTo1RCN7RmxFG5XzPZcPKRlnLuLT/FRm8wp4ohvDwNY7GlROQ==",
+ "dev": true
+ },
+ "node_modules/@types/eslint": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz",
+ "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+ "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.45",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
+ "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "14.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
+ "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==",
+ "dev": true
+ },
+ "node_modules/@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.0.2.tgz",
+ "integrity": "sha512-FEfLQwmN4pXZSYSrtp+KC84rFanoCIxXFpS2wUvviDCE2fnajwxw2GXzbj83IlH4Dl8Wq8kJjavVwvxv3YJmnw==",
+ "dev": true,
+ "dependencies": {
+ "envinfo": "^7.7.3"
+ },
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.0.1.tgz",
+ "integrity": "sha512-WGMaTMTK6NOe29Hw1WBEok9vGLfKg5C6jWzNOS/6HH1YadR+RL+TRWRcSyc81Dzulljhk/Ree9mrDM4Np9GGOQ==",
+ "dev": true,
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "dev": true,
+ "dependencies": {
+ "es6-promisify": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
+ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.11.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz",
+ "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "5.0.0",
+ "chalk": "2.4.2",
+ "leven": "2.1.0",
+ "mri": "1.1.4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/args/node_modules/camelcase": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/array-back": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
+ "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes/node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat/node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "dev": true
+ },
+ "node_modules/axios": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+ "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 6.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/babel-loader/node_modules/mkdirp": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
+ "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001219",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.723",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/browserslist/node_modules/caniuse-lite": {
+ "version": "1.0.30001228",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
+ "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ }
+ },
+ "node_modules/browserslist/node_modules/colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "node_modules/browserslist/node_modules/electron-to-chromium": {
+ "version": "1.3.738",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.738.tgz",
+ "integrity": "sha512-vCMf4gDOpEylPSLPLSwAEsz+R3ShP02Y3cAKMZvTqule3XcPp7tgc/0ESI7IS6ZeyBlGClE50N53fIOkcIVnpw==",
+ "dev": true
+ },
+ "node_modules/browserslist/node_modules/node-releases": {
+ "version": "1.1.72",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
+ "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+ "dev": true
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+ "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+ "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.0",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
+ "node_modules/command-line-usage": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.0.tgz",
+ "integrity": "sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw==",
+ "dev": true,
+ "dependencies": {
+ "array-back": "^4.0.0",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.0",
+ "typical": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+ "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
+ "dev": true
+ },
+ "node_modules/contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+ "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.8.5",
+ "semver": "7.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz",
+ "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enhanced-resolve/node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "node_modules/enhanced-resolve/node_modules/tapable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz",
+ "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/enquirer/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
+ "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+ "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.0",
+ "is-callable": "^1.1.4",
+ "is-regex": "^1.0.4",
+ "object-inspect": "^1.6.0",
+ "object-keys": "^1.1.1",
+ "string.prototype.trimleft": "^2.1.0",
+ "string.prototype.trimright": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+ "dev": true
+ },
+ "node_modules/es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+ "dev": true,
+ "dependencies": {
+ "es6-promise": "^4.0.3"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz",
+ "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.2.1",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz",
+ "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.9",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "eslint": "^5.16.0 || ^6.8.0",
+ "eslint-plugin-import": "^2.20.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/resolve": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.0.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+ "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flat": "^1.2.3",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.4",
+ "eslint-module-utils": "^2.6.0",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.1",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.17.0",
+ "tsconfig-paths": "^3.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/eslint-plugin-import/node_modules/resolve": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.0.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/execa/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "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.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/extract-zip": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
+ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+ "dev": true,
+ "dependencies": {
+ "concat-stream": "^1.6.2",
+ "debug": "^2.6.9",
+ "mkdirp": "^0.5.4",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ }
+ },
+ "node_modules/extract-zip/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/extract-zip/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-limit": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-cache-dir/node_modules/pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz",
+ "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz",
+ "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+ "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
+ "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
+ "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+ "dev": true
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^4.3.0",
+ "debug": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/https-proxy-agent/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.12.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
+ "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-local/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "node_modules/is-callable": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
+ "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz",
+ "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/topo": "^5.0.0",
+ "@sideway/address": "^4.1.0",
+ "@sideway/formula": "^3.0.0",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "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==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5/node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-json-file/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
+ "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/loader-utils/node_modules/json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/loader-utils/node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/log-symbols/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/log-symbols/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-symbols/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "dependencies": {
+ "p-defer": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mem": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz",
+ "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==",
+ "dev": true,
+ "dependencies": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/mem?sponsor=1"
+ }
+ },
+ "node_modules/mem/node_modules/mimic-fn": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
+ "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz",
+ "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==",
+ "dev": true,
+ "dependencies": {
+ "fs-monkey": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.40.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
+ "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
+ "dev": true,
+ "dependencies": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.4.3",
+ "debug": "4.2.0",
+ "diff": "4.0.2",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.6",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.14.0",
+ "log-symbols": "4.0.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.2",
+ "nanoid": "3.1.12",
+ "serialize-javascript": "5.0.1",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "7.2.0",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.0.2",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
+ },
+ "engines": {
+ "node": ">= 10.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha-headless-chrome": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mocha-headless-chrome/-/mocha-headless-chrome-2.0.3.tgz",
+ "integrity": "sha512-U6aG6hGx6QV9Yi/fFhlW4muET7OdFjNXWv/MMiUHmEymndm7SubTnKgrvioFhpGG9NMK+kynqFVSvnTu7UPMcQ==",
+ "dev": true,
+ "dependencies": {
+ "args": "^5.0.0",
+ "mkdirp": "^0.5.1",
+ "puppeteer": "^1.17.0"
+ },
+ "bin": {
+ "mocha-headless-chrome": "bin/start"
+ },
+ "engines": {
+ "node": ">=6.4.0"
+ }
+ },
+ "node_modules/mocha/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mocha/node_modules/binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/chokidar": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+ "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.1.2"
+ }
+ },
+ "node_modules/mocha/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/mocha/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "deprecated": "\"Please update to latest v2.3 or v2.2\"",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/mocha/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/mocha/node_modules/js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/mocha/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/p-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+ "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/mocha/node_modules/serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/mocha/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mocha/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/mocha/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mocha/node_modules/yargs/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mri": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
+ "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.1.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
+ "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ },
+ "bin": {
+ "npm-run-all": "bin/npm-run-all/index.js",
+ "run-p": "bin/run-p/index.js",
+ "run-s": "bin/run-s/index.js"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-all/node_modules/read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+ "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+ "dev": true
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
+ "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.entries/node_modules/es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries/node_modules/string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values/node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-type/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
+ "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+ "dev": true,
+ "dependencies": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/puppeteer": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz",
+ "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
+ "deprecated": "Version no longer supported. Upgrade to @latest",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "extract-zip": "^1.6.6",
+ "https-proxy-agent": "^2.2.1",
+ "mime": "^2.0.3",
+ "progress": "^2.0.1",
+ "proxy-from-env": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "ws": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.4.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+ "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
+ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+ "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/schema-utils/node_modules/fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ },
+ "node_modules/send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "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.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "node_modules/serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "node_modules/slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string.prototype.padend": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz",
+ "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.4.3",
+ "function-bind": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+ "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend/node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimleft": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+ "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.trimright": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+ "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+ "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "dev": true,
+ "dependencies": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart/node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-ansi/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/table-layout": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
+ "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
+ "dev": true,
+ "dependencies": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/table/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz",
+ "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
+ "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
+ "dev": true,
+ "dependencies": {
+ "jest-worker": "^26.6.1",
+ "p-limit": "^3.0.2",
+ "schema-utils": "^3.0.0",
+ "serialize-javascript": "^5.0.1",
+ "source-map": "^0.6.1",
+ "terser": "^5.3.8"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/p-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+ "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/terser/node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+ "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/tslib": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "node_modules/typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
+ "dev": true
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/wait-on": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
+ "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+ "dev": true,
+ "dependencies": {
+ "axios": "^0.21.1",
+ "joi": "^17.3.0",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.5",
+ "rxjs": "^6.6.3"
+ },
+ "bin": {
+ "wait-on": "bin/wait-on"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz",
+ "integrity": "sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.3.2.tgz",
+ "integrity": "sha512-DXsfHoI6lQAR3KnQh7+FsRfs9fs+TEvzXCA35UbKv4kVuzslg7QCMAcpFRZNDMjdtm9N/PoO54XEzGN9TeacQg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.45",
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^8.0.4",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.3.1",
+ "eslint-scope": "^5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.1.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "pkg-dir": "^4.2.0",
+ "schema-utils": "^3.0.0",
+ "tapable": "^2.0.0",
+ "terser-webpack-plugin": "^5.0.3",
+ "watchpack": "^2.0.0",
+ "webpack-sources": "^2.1.1"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.1.0.tgz",
+ "integrity": "sha512-NdhxXMZmoik62Y05t0h1y65LjBM7BwFPq311ihXuMM3RY6dlc4KkCTyHLzTuBEc+bqq6d3xh+CWmU0xRexNJBA==",
+ "dev": true,
+ "dependencies": {
+ "@webpack-cli/info": "^1.0.2",
+ "@webpack-cli/serve": "^1.0.1",
+ "ansi-escapes": "^4.3.1",
+ "colorette": "^1.2.1",
+ "command-line-usage": "^6.1.0",
+ "commander": "^6.0.0",
+ "enquirer": "^2.3.4",
+ "execa": "^4.0.0",
+ "import-local": "^3.0.2",
+ "interpret": "^2.0.0",
+ "rechoir": "^0.7.0",
+ "v8-compile-cache": "^2.1.0",
+ "webpack-merge": "^4.2.2"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generate-loader": {
+ "optional": true
+ },
+ "@webpack-cli/generate-plugin": {
+ "optional": true
+ },
+ "@webpack-cli/init": {
+ "optional": true
+ },
+ "@webpack-cli/migrate": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
+ "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.0.0.tgz",
+ "integrity": "sha512-n6X6CxYQyYWGBfLzcNYya0oz1N8iTG5atGxrEacrMGc9pPjg3GHyHul6Z+hfs5x5voYtqr7mz1pbK/M4ZeMl1w==",
+ "dev": true,
+ "dependencies": {
+ "mem": "^8.0.0",
+ "memfs": "^3.2.0",
+ "mime-types": "^2.1.27",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.44.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+ "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+ "dev": true,
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-sources/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack/node_modules/acorn": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
+ "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/webpack/node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/webpack/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/webpack/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack/node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "node_modules/webpack/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack/node_modules/mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack/node_modules/mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.44.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/webpack/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/webpack/node_modules/tapable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz",
+ "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "node_modules/word-wrap": {
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wordwrapjs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
+ "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
+ "dev": true,
+ "dependencies": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
+ "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
+ "dependencies": {
+ "mkdirp": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ws": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
+ "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+ "dev": true,
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+ "dev": true
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs-unparser/node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz",
+ "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz",
+ "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helpers": "^7.12.1",
+ "@babel/parser": "^7.12.3",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.1",
+ "json5": "^2.1.2",
+ "lodash": "^4.17.19",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+ "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
+ "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
+ "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+ "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+ "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-explode-assignable-expression": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz",
+ "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.12.1",
+ "@babel/helper-validator-option": "^7.12.1",
+ "browserslist": "^4.12.0",
+ "semver": "^5.5.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/helper-create-class-features-plugin": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
+ "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz",
+ "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4",
+ "regexpu-core": "^4.7.1"
+ }
+ },
+ "@babel/helper-define-map": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/types": "^7.10.5",
+ "lodash": "^4.17.19"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-explode-assignable-expression": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
+ "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+ "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-member-expression-to-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
+ "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
+ "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
+ "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-simple-access": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "lodash": "^4.17.19"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+ "dev": true
+ },
+ "@babel/helper-regex": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+ "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/helper-remap-async-to-generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-wrap-function": "^7.10.4",
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-replace-supers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
+ "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-member-expression-to-functions": "^7.12.1",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
+ "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+ "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
+ "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
+ "dev": true
+ },
+ "@babel/helper-wrap-function": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz",
+ "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz",
+ "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.12.1",
+ "@babel/types": "^7.12.1"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
+ "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.12.1",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
+ "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.12.1",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.12.1",
+ "@babel/types": "^7.12.1",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
+ "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1",
+ "@babel/plugin-syntax-async-generators": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-class-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
+ "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
+ "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
+ "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-json-strings": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
+ "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
+ "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
+ "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-numeric-separator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz",
+ "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+ "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.12.1"
+ }
+ },
+ "@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
+ "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-optional-chaining": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz",
+ "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ }
+ },
+ "@babel/plugin-proposal-private-methods": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
+ "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-class-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
+ "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-class-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
+ "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
+ "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-arrow-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
+ "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-async-to-generator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
+ "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
+ "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-block-scoping": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
+ "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-classes": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
+ "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-define-map": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "globals": "^11.1.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/plugin-transform-computed-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
+ "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-destructuring": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
+ "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-dotall-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
+ "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-duplicate-keys": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
+ "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
+ "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-for-of": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
+ "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-function-name": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
+ "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.12.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
+ "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/plugin-transform-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
+ "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
+ "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
+ "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-commonjs": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
+ "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-simple-access": "^7.12.1",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-systemjs": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
+ "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.10.4",
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "@babel/plugin-transform-modules-umd": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
+ "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
+ "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-new-target": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
+ "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-object-super": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
+ "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-parameters": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
+ "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
+ "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-regenerator": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
+ "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.14.2"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
+ "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-shorthand-properties": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
+ "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-spread": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
+ "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
+ }
+ },
+ "@babel/plugin-transform-sticky-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz",
+ "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-template-literals": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
+ "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-typeof-symbol": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz",
+ "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-unicode-escapes": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
+ "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/plugin-transform-unicode-regex": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
+ "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-create-regexp-features-plugin": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "@babel/preset-env": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz",
+ "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.12.1",
+ "@babel/helper-compilation-targets": "^7.12.1",
+ "@babel/helper-module-imports": "^7.12.1",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-validator-option": "^7.12.1",
+ "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
+ "@babel/plugin-proposal-class-properties": "^7.12.1",
+ "@babel/plugin-proposal-dynamic-import": "^7.12.1",
+ "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
+ "@babel/plugin-proposal-json-strings": "^7.12.1",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
+ "@babel/plugin-proposal-numeric-separator": "^7.12.1",
+ "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
+ "@babel/plugin-proposal-optional-chaining": "^7.12.1",
+ "@babel/plugin-proposal-private-methods": "^7.12.1",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
+ "@babel/plugin-syntax-async-generators": "^7.8.0",
+ "@babel/plugin-syntax-class-properties": "^7.12.1",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+ "@babel/plugin-syntax-top-level-await": "^7.12.1",
+ "@babel/plugin-transform-arrow-functions": "^7.12.1",
+ "@babel/plugin-transform-async-to-generator": "^7.12.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
+ "@babel/plugin-transform-block-scoping": "^7.12.1",
+ "@babel/plugin-transform-classes": "^7.12.1",
+ "@babel/plugin-transform-computed-properties": "^7.12.1",
+ "@babel/plugin-transform-destructuring": "^7.12.1",
+ "@babel/plugin-transform-dotall-regex": "^7.12.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.12.1",
+ "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
+ "@babel/plugin-transform-for-of": "^7.12.1",
+ "@babel/plugin-transform-function-name": "^7.12.1",
+ "@babel/plugin-transform-literals": "^7.12.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.12.1",
+ "@babel/plugin-transform-modules-amd": "^7.12.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.12.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.12.1",
+ "@babel/plugin-transform-modules-umd": "^7.12.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
+ "@babel/plugin-transform-new-target": "^7.12.1",
+ "@babel/plugin-transform-object-super": "^7.12.1",
+ "@babel/plugin-transform-parameters": "^7.12.1",
+ "@babel/plugin-transform-property-literals": "^7.12.1",
+ "@babel/plugin-transform-regenerator": "^7.12.1",
+ "@babel/plugin-transform-reserved-words": "^7.12.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.12.1",
+ "@babel/plugin-transform-spread": "^7.12.1",
+ "@babel/plugin-transform-sticky-regex": "^7.12.1",
+ "@babel/plugin-transform-template-literals": "^7.12.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.12.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.12.1",
+ "@babel/plugin-transform-unicode-regex": "^7.12.1",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.12.1",
+ "core-js-compat": "^3.6.2",
+ "semver": "^5.5.0"
+ },
+ "dependencies": {
+ "@babel/types": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
+ "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz",
+ "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/types": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
+ "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.13",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz",
+ "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ }
+ }
+ },
+ "@ffmpeg/core": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.10.0.tgz",
+ "integrity": "sha512-qunWJl5PezpXEm31tb8Qu5z37B5KVA1VYZCpXchMhuAb3X9T7PuE3SlhOwphEoRhzaOa3lpofDfzihAUMFaVPQ==",
+ "dev": true
+ },
+ "@hapi/hoek": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz",
+ "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==",
+ "dev": true
+ },
+ "@hapi/topo": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
+ "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "@sideway/address": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz",
+ "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "@sideway/formula": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz",
+ "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+ "dev": true
+ },
+ "@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true
+ },
+ "@types/emscripten": {
+ "version": "1.39.4",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.4.tgz",
+ "integrity": "sha512-k3LLVMFrdNA9UCvMDPWMbFrGPNb+GcPyw29ktJTo1RCN7RmxFG5XzPZcPKRlnLuLT/FRm8wp4ohvDwNY7GlROQ==",
+ "dev": true
+ },
+ "@types/eslint": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz",
+ "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/eslint-scope": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+ "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+ "dev": true,
+ "requires": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.45",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
+ "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+ "dev": true
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "14.14.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
+ "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==",
+ "dev": true
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "dev": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "dev": true,
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+ "dev": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webpack-cli/info": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.0.2.tgz",
+ "integrity": "sha512-FEfLQwmN4pXZSYSrtp+KC84rFanoCIxXFpS2wUvviDCE2fnajwxw2GXzbj83IlH4Dl8Wq8kJjavVwvxv3YJmnw==",
+ "dev": true,
+ "requires": {
+ "envinfo": "^7.7.3"
+ }
+ },
+ "@webpack-cli/serve": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.0.1.tgz",
+ "integrity": "sha512-WGMaTMTK6NOe29Hw1WBEok9vGLfKg5C6jWzNOS/6HH1YadR+RL+TRWRcSyc81Dzulljhk/Ree9mrDM4Np9GGOQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true,
+ "requires": {}
+ },
+ "agent-base": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
+ "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
+ "dev": true,
+ "requires": {
+ "es6-promisify": "^5.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
+ "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
+ }
+ }
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "args": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz",
+ "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "5.0.0",
+ "chalk": "2.4.2",
+ "leven": "2.1.0",
+ "mri": "1.1.4"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
+ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
+ "dev": true
+ }
+ }
+ },
+ "array-back": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
+ "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
+ "dev": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "dev": true
+ },
+ "axios": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
+ "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "dev": true,
+ "requires": {
+ "follow-redirects": "^1.10.0"
+ }
+ },
+ "babel-loader": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
+ "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ }
+ }
+ },
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "requires": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "browserslist": {
+ "version": "4.16.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
+ "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001219",
+ "colorette": "^1.2.2",
+ "electron-to-chromium": "^1.3.723",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.71"
+ },
+ "dependencies": {
+ "caniuse-lite": {
+ "version": "1.0.30001228",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
+ "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.738",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.738.tgz",
+ "integrity": "sha512-vCMf4gDOpEylPSLPLSwAEsz+R3ShP02Y3cAKMZvTqule3XcPp7tgc/0ESI7IS6ZeyBlGClE50N53fIOkcIVnpw==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "1.1.72",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
+ "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+ "dev": true
+ }
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true
+ },
+ "call-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz",
+ "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+ "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.0",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ }
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colorette": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
+ "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+ "dev": true
+ },
+ "command-line-usage": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.0.tgz",
+ "integrity": "sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw==",
+ "dev": true,
+ "requires": {
+ "array-back": "^4.0.0",
+ "chalk": "^2.4.2",
+ "table-layout": "^1.0.0",
+ "typical": "^5.2.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "confusing-browser-globals": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
+ "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==",
+ "dev": true
+ },
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "core-js-compat": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+ "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.8.5",
+ "semver": "7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true
+ }
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "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==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enhanced-resolve": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz",
+ "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.0.0"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "tapable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz",
+ "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==",
+ "dev": true
+ }
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ }
+ }
+ },
+ "envinfo": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
+ "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
+ "dev": true
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
+ "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.0",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.0",
+ "is-callable": "^1.1.4",
+ "is-regex": "^1.0.4",
+ "object-inspect": "^1.6.0",
+ "object-keys": "^1.1.1",
+ "string.prototype.trimleft": "^2.1.0",
+ "string.prototype.trimright": "^2.1.0"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
+ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+ "dev": true
+ },
+ "es6-promisify": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
+ "dev": true,
+ "requires": {
+ "es6-promise": "^4.0.3"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.12.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz",
+ "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.2.1",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz",
+ "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==",
+ "dev": true,
+ "requires": {
+ "confusing-browser-globals": "^1.0.9",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.1"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
+ "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.0.0",
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
+ "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.1",
+ "array.prototype.flat": "^1.2.3",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.4",
+ "eslint-module-utils": "^2.6.0",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.1",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.17.0",
+ "tsconfig-paths": "^3.9.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
+ "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.0.0",
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "dependencies": {
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "dev": true
+ },
+ "execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "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.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "extract-zip": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
+ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.6.2",
+ "debug": "^2.6.9",
+ "mkdirp": "^0.5.4",
+ "yauzl": "^2.10.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0"
+ }
+ }
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "dependencies": {
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ }
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
+ "follow-redirects": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz",
+ "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==",
+ "dev": true
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "fs-monkey": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz",
+ "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz",
+ "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "dependencies": {
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ }
+ }
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
+ "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
+ "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
+ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ }
+ }
+ },
+ "https-proxy-agent": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
+ "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
+ "dev": true,
+ "requires": {
+ "agent-base": "^4.3.0",
+ "debug": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz",
+ "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "dependencies": {
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ }
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true
+ },
+ "ipaddr.js": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
+ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz",
+ "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+ "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.1"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
+ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.0"
+ }
+ },
+ "is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "joi": {
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz",
+ "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==",
+ "dev": true,
+ "requires": {
+ "@hapi/hoek": "^9.0.0",
+ "@hapi/topo": "^5.0.0",
+ "@sideway/address": "^4.1.0",
+ "@sideway/formula": "^3.0.0",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "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==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
+ "leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "loader-runner": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
+ "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "mem": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz",
+ "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==",
+ "dev": true,
+ "requires": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^3.1.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
+ "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
+ "dev": true
+ }
+ }
+ },
+ "memfs": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz",
+ "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==",
+ "dev": true,
+ "requires": {
+ "fs-monkey": "1.0.1"
+ }
+ },
+ "memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+ "dev": true
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "mime": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "mocha": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
+ "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.4.3",
+ "debug": "4.2.0",
+ "diff": "4.0.2",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.6",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.14.0",
+ "log-symbols": "4.0.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.2",
+ "nanoid": "3.1.12",
+ "serialize-javascript": "5.0.1",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "7.2.0",
+ "which": "2.0.2",
+ "wide-align": "1.1.3",
+ "workerpool": "6.0.2",
+ "yargs": "13.3.2",
+ "yargs-parser": "13.1.2",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+ "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ }
+ },
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "dev": true,
+ "optional": true
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+ "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^3.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ }
+ }
+ },
+ "mocha-headless-chrome": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/mocha-headless-chrome/-/mocha-headless-chrome-2.0.3.tgz",
+ "integrity": "sha512-U6aG6hGx6QV9Yi/fFhlW4muET7OdFjNXWv/MMiUHmEymndm7SubTnKgrvioFhpGG9NMK+kynqFVSvnTu7UPMcQ==",
+ "dev": true,
+ "requires": {
+ "args": "^5.0.0",
+ "mkdirp": "^0.5.1",
+ "puppeteer": "^1.17.0"
+ }
+ },
+ "mri": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz",
+ "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.12",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
+ "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ },
+ "dependencies": {
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ }
+ }
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ }
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-inspect": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
+ "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
+ "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ }
+ }
+ },
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "pidtree": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz",
+ "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==",
+ "dev": true
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.1.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "proxy-addr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+ "dev": true,
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.0"
+ }
+ },
+ "proxy-from-env": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=",
+ "dev": true
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "puppeteer": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz",
+ "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "extract-zip": "^1.6.6",
+ "https-proxy-agent": "^2.2.1",
+ "mime": "^2.0.3",
+ "progress": "^2.0.1",
+ "proxy-from-env": "^1.0.0",
+ "rimraf": "^2.6.1",
+ "ws": "^6.1.0"
+ }
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "^2.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "^2.0.0",
+ "path-exists": "^3.0.0"
+ }
+ },
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "dev": true,
+ "requires": {
+ "p-try": "^1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "^1.1.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+ "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.9.0"
+ }
+ },
+ "reduce-flatten": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
+ "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
+ "dev": true
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+ },
+ "regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ }
+ },
+ "regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
+ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "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==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ }
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+ "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ }
+ }
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "requires": {
+ "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.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "spdx-correct": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "string.prototype.padend": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz",
+ "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "es-abstract": "^1.4.3",
+ "function-bind": "^1.0.2"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz",
+ "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+ "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+ "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz",
+ "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ }
+ }
+ },
+ "table-layout": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
+ "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
+ "dev": true,
+ "requires": {
+ "array-back": "^4.0.1",
+ "deep-extend": "~0.6.0",
+ "typical": "^5.2.0",
+ "wordwrapjs": "^4.0.0"
+ }
+ },
+ "terser": {
+ "version": "5.3.8",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz",
+ "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
+ "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
+ "dev": true,
+ "requires": {
+ "jest-worker": "^26.6.1",
+ "p-limit": "^3.0.2",
+ "schema-utils": "^3.0.0",
+ "serialize-javascript": "^5.0.1",
+ "source-map": "^0.6.1",
+ "terser": "^5.3.8"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
+ "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true
+ },
+ "tsconfig-paths": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
+ "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+ "dev": true,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
+ "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-detect": {
+ "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==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typical": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
+ "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
+ "dev": true
+ },
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "dev": true
+ },
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ }
+ },
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+ "dev": true
+ },
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
+ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true
+ },
+ "wait-on": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
+ "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+ "dev": true,
+ "requires": {
+ "axios": "^0.21.1",
+ "joi": "^17.3.0",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.5",
+ "rxjs": "^6.6.3"
+ }
+ },
+ "watchpack": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz",
+ "integrity": "sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==",
+ "dev": true,
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "webpack": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.3.2.tgz",
+ "integrity": "sha512-DXsfHoI6lQAR3KnQh7+FsRfs9fs+TEvzXCA35UbKv4kVuzslg7QCMAcpFRZNDMjdtm9N/PoO54XEzGN9TeacQg==",
+ "dev": true,
+ "requires": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.45",
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^8.0.4",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.3.1",
+ "eslint-scope": "^5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.1.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "pkg-dir": "^4.2.0",
+ "schema-utils": "^3.0.0",
+ "tapable": "^2.0.0",
+ "terser-webpack-plugin": "^5.0.3",
+ "watchpack": "^2.0.0",
+ "webpack-sources": "^2.1.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
+ "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "tapable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz",
+ "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-cli": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.1.0.tgz",
+ "integrity": "sha512-NdhxXMZmoik62Y05t0h1y65LjBM7BwFPq311ihXuMM3RY6dlc4KkCTyHLzTuBEc+bqq6d3xh+CWmU0xRexNJBA==",
+ "dev": true,
+ "requires": {
+ "@webpack-cli/info": "^1.0.2",
+ "@webpack-cli/serve": "^1.0.1",
+ "ansi-escapes": "^4.3.1",
+ "colorette": "^1.2.1",
+ "command-line-usage": "^6.1.0",
+ "commander": "^6.0.0",
+ "enquirer": "^2.3.4",
+ "execa": "^4.0.0",
+ "import-local": "^3.0.2",
+ "interpret": "^2.0.0",
+ "rechoir": "^0.7.0",
+ "v8-compile-cache": "^2.1.0",
+ "webpack-merge": "^4.2.2"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
+ "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-dev-middleware": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.0.0.tgz",
+ "integrity": "sha512-n6X6CxYQyYWGBfLzcNYya0oz1N8iTG5atGxrEacrMGc9pPjg3GHyHul6Z+hfs5x5voYtqr7mz1pbK/M4ZeMl1w==",
+ "dev": true,
+ "requires": {
+ "mem": "^8.0.0",
+ "memfs": "^3.2.0",
+ "mime-types": "^2.1.27",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^3.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "webpack-sources": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+ "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "word-wrap": {
+ "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==",
+ "dev": true
+ },
+ "wordwrapjs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
+ "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
+ "dev": true,
+ "requires": {
+ "reduce-flatten": "^2.0.0",
+ "typical": "^5.0.0"
+ }
+ },
+ "workerpool": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
+ "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "ws": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
+ "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ }
+ }
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/package.json b/apps/photos/thirdparty/ffmpeg-wasm/package.json
new file mode 100644
index 000000000..0f3ecaffe
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "@ffmpeg/ffmpeg",
+ "version": "0.10.1",
+ "description": "FFmpeg WebAssembly version",
+ "main": "src/index.js",
+ "types": "src/index.d.ts",
+ "directories": {
+ "example": "examples"
+ },
+ "scripts": {
+ "start": "node scripts/server.js",
+ "build": "rimraf dist && webpack --config scripts/webpack.config.prod.js",
+ "prepublishOnly": "npm run build",
+ "lint": "eslint src",
+ "wait": "rimraf dist && wait-on http://localhost:3000/dist/ffmpeg.dev.js",
+ "test": "npm-run-all -p -r start test:all",
+ "test:all": "npm-run-all wait test:browser:ffmpeg test:node:all",
+ "test:node": "node --experimental-wasm-threads --experimental-wasm-bulk-memory node_modules/.bin/_mocha --exit --bail --require ./scripts/test-helper.js",
+ "test:node:all": "npm run test:node -- ./tests/*.test.js",
+ "test:browser": "mocha-headless-chrome -a allow-file-access-from-files -a incognito -a no-sandbox -a disable-setuid-sandbox -a disable-logging -t 300000",
+ "test:browser:ffmpeg": "npm run test:browser -- -f ./tests/ffmpeg.test.html"
+ },
+ "browser": {
+ "./src/node/index.js": "./src/browser/index.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/ffmpegwasm/ffmpeg.wasm.git"
+ },
+ "keywords": [
+ "ffmpeg",
+ "WebAssembly",
+ "video"
+ ],
+ "author": "Jerome Wu ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/ffmpegwasm/ffmpeg.wasm/issues"
+ },
+ "engines": {
+ "node": ">=12.16.1"
+ },
+ "homepage": "https://github.com/ffmpegwasm/ffmpeg.wasm#readme",
+ "dependencies": {
+ "is-url": "^1.2.4",
+ "node-fetch": "^2.6.1",
+ "regenerator-runtime": "^0.13.7"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/preset-env": "^7.12.1",
+ "@ffmpeg/core": "^0.10.0",
+ "@types/emscripten": "^1.39.4",
+ "babel-loader": "^8.1.0",
+ "chai": "^4.2.0",
+ "cors": "^2.8.5",
+ "eslint": "^7.12.1",
+ "eslint-config-airbnb-base": "^14.1.0",
+ "eslint-plugin-import": "^2.22.1",
+ "express": "^4.17.1",
+ "mocha": "^8.2.1",
+ "mocha-headless-chrome": "^2.0.3",
+ "npm-run-all": "^4.1.5",
+ "wait-on": "^5.3.0",
+ "webpack": "^5.3.2",
+ "webpack-cli": "^4.1.0",
+ "webpack-dev-middleware": "^4.0.0"
+ }
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/.eslintrc b/apps/photos/thirdparty/ffmpeg-wasm/scripts/.eslintrc
new file mode 100644
index 000000000..04cfba7cd
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/.eslintrc
@@ -0,0 +1,5 @@
+{
+ "rules": {
+ "import/no-extraneous-dependencies": 0
+ }
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/server.js b/apps/photos/thirdparty/ffmpeg-wasm/scripts/server.js
new file mode 100644
index 000000000..4ccc4b5d9
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/server.js
@@ -0,0 +1,17 @@
+const webpack = require('webpack');
+const middleware = require('webpack-dev-middleware');
+const express = require('express');
+const path = require('path');
+const cors = require('cors');
+const webpackConfig = require('./webpack.config.dev');
+
+const compiler = webpack(webpackConfig);
+const app = express();
+
+app.use(cors());
+app.use('/', express.static(path.resolve(__dirname, '..')));
+app.use(middleware(compiler, { publicPath: '/dist', writeToDisk: true }));
+
+module.exports = app.listen(3000, () => {
+ console.log('Server is running on port 3000');
+});
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/test-helper.js b/apps/photos/thirdparty/ffmpeg-wasm/scripts/test-helper.js
new file mode 100644
index 000000000..c1d900a4c
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/test-helper.js
@@ -0,0 +1,9 @@
+const chai = require('chai');
+const constants = require('../tests/constants');
+
+global.expect = chai.expect;
+global.FFmpeg = require('../src');
+
+Object.keys(constants).forEach((key) => {
+ global[key] = constants[key];
+});
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.common.js b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.common.js
new file mode 100644
index 000000000..7d9133d23
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.common.js
@@ -0,0 +1,23 @@
+module.exports = {
+ module: {
+ rules: [
+ {
+ test: /\.m?js$/,
+ exclude: /(node_modules|bower_components)/,
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: [
+ [
+ '@babel/preset-env',
+ {
+ targets: 'last 2 versions',
+ },
+ ],
+ ],
+ },
+ },
+ },
+ ],
+ },
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.dev.js b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.dev.js
new file mode 100644
index 000000000..b630863b5
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.dev.js
@@ -0,0 +1,28 @@
+const path = require('path');
+const webpack = require('webpack');
+const common = require('./webpack.config.common');
+
+const genConfig = ({
+ entry, filename, library, libraryTarget,
+}) => ({
+ ...common,
+ mode: 'development',
+ entry,
+ output: {
+ filename,
+ library,
+ libraryTarget,
+ },
+ devServer: {
+ allowedHosts: ['localhost', '.gitpod.io'],
+ },
+});
+
+module.exports = [
+ genConfig({
+ entry: path.resolve(__dirname, '..', 'src', 'index.js'),
+ filename: 'ffmpeg.dev.js',
+ library: 'FFmpeg',
+ libraryTarget: 'umd',
+ }),
+];
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.prod.js b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.prod.js
new file mode 100644
index 000000000..8f1bac3fc
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/scripts/webpack.config.prod.js
@@ -0,0 +1,26 @@
+const path = require('path');
+const common = require('./webpack.config.common');
+
+const genConfig = ({
+ entry, filename, library, libraryTarget,
+}) => ({
+ ...common,
+ mode: 'production',
+ devtool: 'source-map',
+ entry,
+ output: {
+ path: path.resolve(__dirname, '..', 'dist'),
+ filename,
+ library,
+ libraryTarget,
+ },
+});
+
+module.exports = [
+ genConfig({
+ entry: path.resolve(__dirname, '..', 'src', 'index.js'),
+ filename: 'ffmpeg.min.js',
+ library: 'FFmpeg',
+ libraryTarget: 'umd',
+ }),
+];
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/defaultOptions.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/defaultOptions.js
new file mode 100644
index 000000000..1dcdf10f0
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/defaultOptions.js
@@ -0,0 +1,10 @@
+const { devDependencies } = require('../../package.json');
+
+/*
+ * Default options for browser environment
+ */
+module.exports = {
+ corePath: typeof process !== 'undefined' && process.env.NODE_ENV === 'development'
+ ? '/node_modules/@ffmpeg/core/dist/ffmpeg-core.js'
+ : `https://unpkg.com/@ffmpeg/core@${devDependencies['@ffmpeg/core'].substring(1)}/dist/ffmpeg-core.js`,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/fetchFile.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/fetchFile.js
new file mode 100644
index 000000000..e36a84011
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/fetchFile.js
@@ -0,0 +1,37 @@
+const readFromBlobOrFile = (blob) => (
+ new Promise((resolve, reject) => {
+ const fileReader = new FileReader();
+ fileReader.onload = () => {
+ resolve(fileReader.result);
+ };
+ fileReader.onerror = ({ target: { error: { code } } }) => {
+ reject(Error(`File could not be read! Code=${code}`));
+ };
+ fileReader.readAsArrayBuffer(blob);
+ })
+);
+
+module.exports = async (_data) => {
+ let data = _data;
+ if (typeof _data === 'undefined') {
+ return new Uint8Array();
+ }
+
+ if (typeof _data === 'string') {
+ /* From base64 format */
+ if (/data:_data\/([a-zA-Z]*);base64,([^"]*)/.test(_data)) {
+ data = atob(_data.split(',')[1])
+ .split('')
+ .map((c) => c.charCodeAt(0));
+ /* From remote server/URL */
+ } else {
+ const res = await fetch(_data);
+ data = await res.arrayBuffer();
+ }
+ /* From Blob or File */
+ } else if (_data instanceof File || _data instanceof Blob) {
+ data = await readFromBlobOrFile(_data);
+ }
+
+ return new Uint8Array(data);
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/getCreateFFmpegCore.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/getCreateFFmpegCore.js
new file mode 100644
index 000000000..84da842bb
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/getCreateFFmpegCore.js
@@ -0,0 +1,81 @@
+/* eslint-disable no-undef */
+const { log } = require('../utils/log');
+const { CREATE_FFMPEG_CORE_IS_NOT_DEFINED } = require('../utils/errors');
+
+/*
+ * Fetch data from remote URL and convert to blob URL
+ * to avoid CORS issue
+ */
+// const toBlobURL = async (url, mimeType) => {
+// log('info', `fetch ${url}`);
+// const buf = await (await fetch(url)).arrayBuffer();
+// log('info', `${url} file size = ${buf.byteLength} bytes`);
+// const blob = new Blob([buf], { type: mimeType });
+// const blobURL = URL.createObjectURL(blob);
+// log('info', `${url} blob URL = ${blobURL}`);
+// return blobURL;
+// };
+
+module.exports = async ({ corePath: _corePath, mt: _mt, runningInWorker: _runningInWorker }) => {
+ if (typeof _corePath !== 'string') {
+ throw Error('corePath should be a string!');
+ }
+ // const corePath = await toBlobURL(
+ // coreRemotePath,
+ // 'application/javascript',
+ // );
+ // const wasmPath = await toBlobURL(
+ // coreRemotePath.replace('ffmpeg-core.js', 'ffmpeg-core.wasm'),
+ // 'application/wasm',
+ // );
+ // const workerPath = await toBlobURL(
+ // coreRemotePath.replace('ffmpeg-core.js', 'ffmpeg-core.worker.js'),
+ // 'application/javascript',
+ // );
+ const coreRemotePath = _corePath;
+ const corePath = coreRemotePath;
+ const wasmPath = coreRemotePath.replace(
+ 'ffmpeg-core.js',
+ 'ffmpeg-core.wasm',
+ );
+ let workerPath = null;
+ if (_mt) {
+ workerPath = coreRemotePath.replace(
+ 'ffmpeg-core.js',
+ 'ffmpeg-core.worker.js',
+ );
+ }
+ if (typeof createFFmpegCore === 'undefined') {
+ return new Promise((resolve) => {
+ if (_runningInWorker) {
+ importScripts(coreRemotePath);
+ } else {
+ const script = document.createElement('script');
+ const eventHandler = () => {
+ script.removeEventListener('load', eventHandler);
+ if (typeof createFFmpegCore === 'undefined') {
+ throw CREATE_FFMPEG_CORE_IS_NOT_DEFINED(coreRemotePath);
+ }
+ log('info', 'ffmpeg-core.js script loaded');
+ };
+ script.src = corePath;
+ script.type = 'text/javascript';
+ script.addEventListener('load', eventHandler);
+ document.getElementsByTagName('head')[0].appendChild(script);
+ }
+ resolve({
+ createFFmpegCore,
+ corePath,
+ wasmPath,
+ workerPath,
+ });
+ });
+ }
+ log('info', 'ffmpeg-core.js script is loaded already');
+ return Promise.resolve({
+ createFFmpegCore,
+ corePath,
+ wasmPath,
+ workerPath,
+ });
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/index.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/index.js
new file mode 100644
index 000000000..3c05c0217
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/index.js
@@ -0,0 +1,13 @@
+const defaultOptions = require('./defaultOptions');
+const getCreateFFmpegCore = require('./getCreateFFmpegCore');
+const fetchFile = require('./fetchFile');
+const { getCore: getCoreMT, ffmpeg: ffmpegMT } = require('./mt');
+const { getCore: getCoreST, ffmpeg: ffmpegST } = require('./st');
+
+module.exports = {
+ defaultOptions,
+ getCreateFFmpegCore,
+ fetchFile,
+ getCore: (mt) => (mt ? getCoreMT : getCoreST),
+ ffmpeg: (mt) => (mt ? ffmpegMT : ffmpegST)
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/mt/index.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/mt/index.js
new file mode 100644
index 000000000..451e97e0c
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/mt/index.js
@@ -0,0 +1,20 @@
+/* eslint-disable no-undef */
+const parseArgs = require('../../utils/parseArgs');
+
+const getCore = (opts) => (
+ createFFmpegCore(opts)
+);
+
+const ffmpeg = ({ Core, args }) => (
+ Core.ccall(
+ 'emscripten_proxy_main',
+ 'number',
+ ['number', 'number'],
+ parseArgs(Core, args),
+ )
+);
+
+module.exports = {
+ getCore,
+ ffmpeg,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/browser/st/index.js b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/st/index.js
new file mode 100644
index 000000000..038924515
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/browser/st/index.js
@@ -0,0 +1,17 @@
+const parseArgs = require('../../utils/parseArgs');
+
+const getCore = (opts) => (
+ createFFmpegCore(opts)
+);
+const ffmpeg = ({ Core, args }) => (
+ Core.ccall(
+ 'main',
+ 'number',
+ ['number', 'number'],
+ parseArgs(Core, args),
+ )
+);
+
+module.exports = {
+ getCore, ffmpeg,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/config.js b/apps/photos/thirdparty/ffmpeg-wasm/src/config.js
new file mode 100644
index 000000000..138e0978b
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/config.js
@@ -0,0 +1,58 @@
+module.exports = {
+ defaultArgs: [
+ /* args[0] is always the binary path */
+ './ffmpeg',
+ /* Disable interaction mode */
+ '-nostdin',
+ /* Force to override output file */
+ '-y',
+ ],
+ baseOptions: {
+ /* Flag to turn on/off log messages in console */
+ log: false,
+ /*
+ * Custom logger to get ffmpeg.wasm output messages.
+ * a sample logger looks like this:
+ *
+ * ```
+ * logger = ({ type, message }) => {
+ * console.log(type, message);
+ * }
+ * ```
+ *
+ * type can be one of following:
+ *
+ * info: internal workflow debug messages
+ * fferr: ffmpeg native stderr output
+ * ffout: ffmpeg native stdout output
+ */
+ logger: () => {},
+ /*
+ * Progress handler to get current progress of ffmpeg command.
+ * a sample progress handler looks like this:
+ *
+ * ```
+ * progress = ({ ratio }) => {
+ * console.log(ratio);
+ * }
+ * ```
+ *
+ * ratio is a float number between 0 to 1.
+ */
+ progress: () => {},
+ /*
+ * Path to find/download ffmpeg.wasm-core,
+ * this value should be overwriten by `defaultOptions` in
+ * each environment.
+ */
+ corePath: '',
+ /*
+ * Whether to use the multi-thread version of ffmpeg.
+ * Most of the time, the multi-thread version is much faster
+ * than single thread, but it requires SharedArrayBuffer which
+ * is not well supported by most of the browsers.
+ */
+ mt: true,
+ runningInWorker: typeof importScripts === 'function',
+ },
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/createFFmpeg.js b/apps/photos/thirdparty/ffmpeg-wasm/src/createFFmpeg.js
new file mode 100644
index 000000000..a374b7bbb
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/createFFmpeg.js
@@ -0,0 +1,218 @@
+const { defaultArgs, baseOptions } = require('./config');
+const { setLogging, setCustomLogger, log } = require('./utils/log');
+const parseProgress = require('./utils/parseProgress');
+const {
+ defaultOptions,
+ getCreateFFmpegCore,
+ getCore: _getCore,
+ ffmpeg: _ffmpeg,
+} = require('./node');
+const { version } = require('../package.json');
+
+const NO_LOAD = Error('ffmpeg.wasm is not ready, make sure you have completed load().');
+
+module.exports = (_options = {}) => {
+ const {
+ log: logging,
+ logger,
+ progress: optProgress,
+ ...options
+ } = {
+ ...baseOptions,
+ ...defaultOptions,
+ ..._options,
+ };
+ const { mt } = options;
+ const getCore = _getCore(mt);
+ const ffmpeg = _ffmpeg(mt);
+ let Core = null;
+ let runResolve = null;
+ let running = false;
+ let progress = optProgress;
+ const detectCompletion = (message) => {
+ if (message === 'FFMPEG_END' && runResolve !== null) {
+ runResolve();
+ runResolve = null;
+ running = false;
+ }
+ };
+ const parseMessage = (type) => (message) => {
+ log(type, message);
+ parseProgress(message, progress);
+ detectCompletion(message);
+ };
+
+ /*
+ * Load ffmpeg.wasm-core script.
+ * In browser environment, the ffmpeg.wasm-core script is fetch from
+ * CDN and can be assign to a local path by assigning `corePath`.
+ * In node environment, we use dynamic require and the default `corePath`
+ * is `$ffmpeg/core`.
+ *
+ * Typically the load() func might take few seconds to minutes to complete,
+ * better to do it as early as possible.
+ *
+ */
+ const load = async () => {
+ log('info', 'load ffmpeg-core');
+ if (Core === null) {
+ log('info', 'loading ffmpeg-core');
+ /*
+ * In node environment, all paths are undefined as there
+ * is no need to set them.
+ */
+ const {
+ corePath,
+ workerPath,
+ wasmPath,
+ } = await getCreateFFmpegCore(options);
+ Core = await getCore({
+ /*
+ * Assign mainScriptUrlOrBlob fixes chrome extension web worker issue
+ * as there is no document.currentScript in the context of content_scripts
+ */
+ mainScriptUrlOrBlob: corePath,
+ printErr: parseMessage('fferr'),
+ print: parseMessage('ffout'),
+ /*
+ * locateFile overrides paths of files that is loaded by main script (ffmpeg-core.js).
+ * It is critical for browser environment and we override both wasm and worker paths
+ * as we are using blob URL instead of original URL to avoid cross origin issues.
+ */
+ locateFile: (path, prefix) => {
+ if (typeof window !== 'undefined' || typeof importScripts !== 'undefined') {
+ if (typeof wasmPath !== 'undefined'
+ && path.endsWith('ffmpeg-core.wasm')) {
+ return wasmPath;
+ }
+ if (typeof workerPath !== 'undefined'
+ && path.endsWith('ffmpeg-core.worker.js')) {
+ return workerPath;
+ }
+ }
+ return prefix + path;
+ },
+ });
+ log('info', 'ffmpeg-core loaded');
+ } else {
+ throw Error('ffmpeg.wasm was loaded, you should not load it again, use ffmpeg.isLoaded() to check next time.');
+ }
+ };
+
+ /*
+ * Determine whether the Core is loaded.
+ */
+ const isLoaded = () => Core !== null;
+
+ /*
+ * Run ffmpeg command.
+ * This is the major function in ffmpeg.wasm, you can just imagine it
+ * as ffmpeg native cli and what you need to pass is the same.
+ *
+ * For example, you can convert native command below:
+ *
+ * ```
+ * $ ffmpeg -i video.avi -c:v libx264 video.mp4
+ * ```
+ *
+ * To
+ *
+ * ```
+ * await ffmpeg.run('-i', 'video.avi', '-c:v', 'libx264', 'video.mp4');
+ * ```
+ *
+ */
+ const run = (..._args) => {
+ log('info', `run ffmpeg command: ${_args.join(' ')}`);
+ if (Core === null) {
+ throw NO_LOAD;
+ } else if (running) {
+ throw Error('ffmpeg.wasm can only run one command at a time');
+ } else {
+ running = true;
+ return new Promise((resolve) => {
+ const args = [...defaultArgs, ..._args].filter((s) => s.length !== 0);
+ runResolve = resolve;
+ ffmpeg({ Core, args });
+ });
+ }
+ };
+
+ /*
+ * Run FS operations.
+ * For input/output file of ffmpeg.wasm, it is required to save them to MEMFS
+ * first so that ffmpeg.wasm is able to consume them. Here we rely on the FS
+ * methods provided by Emscripten.
+ *
+ * Common methods to use are:
+ * ffmpeg.FS('writeFile', 'video.avi', new Uint8Array(...)): writeFile writes
+ * data to MEMFS. You need to use Uint8Array for binary data.
+ * ffmpeg.FS('readFile', 'video.mp4'): readFile from MEMFS.
+ * ffmpeg.FS('unlink', 'video.map'): delete file from MEMFS.
+ *
+ * For more info, check https://emscripten.org/docs/api_reference/Filesystem-API.html
+ *
+ */
+ const FS = (method, ...args) => {
+ log('info', `run FS.${method} ${args.map((arg) => (typeof arg === 'string' ? arg : `<${arg.length} bytes binary file>`)).join(' ')}`);
+ if (Core === null) {
+ throw NO_LOAD;
+ } else {
+ let ret = null;
+ try {
+ ret = Core.FS[method](...args);
+ } catch (e) {
+ if (method === 'readdir') {
+ throw Error(`ffmpeg.FS('readdir', '${args[0]}') error. Check if the path exists, ex: ffmpeg.FS('readdir', '/')`);
+ } else if (method === 'readFile') {
+ throw Error(`ffmpeg.FS('readFile', '${args[0]}') error. Check if the path exists`);
+ } else {
+ throw Error('Oops, something went wrong in FS operation.');
+ }
+ }
+ return ret;
+ }
+ };
+
+ /**
+ * forcibly terminate the ffmpeg program.
+ */
+ const exit = () => {
+ if (Core === null) {
+ throw NO_LOAD;
+ } else {
+ running = false;
+ try {
+ Core.exit(1);
+ } catch (e) {
+ // console.log('catch core exit error', e);
+ }
+ Core = null;
+ runResolve = null;
+ }
+ };
+
+ const setProgress = (_progress) => {
+ progress = _progress;
+ };
+
+ const setLogger = (_logger) => {
+ setCustomLogger(_logger);
+ };
+
+ setLogging(logging);
+ setCustomLogger(logger);
+
+ log('info', `use ffmpeg.wasm v${version}`);
+
+ return {
+ setProgress,
+ setLogger,
+ setLogging,
+ load,
+ isLoaded,
+ run,
+ exit,
+ FS,
+ };
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/index.d.ts b/apps/photos/thirdparty/ffmpeg-wasm/src/index.d.ts
new file mode 100644
index 000000000..bf41850e0
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/index.d.ts
@@ -0,0 +1,114 @@
+export const FS: {
+ writeFile: (fileName: string, binaryData: Uint8Array) => void,
+ readFile: (fileName: string) => Uint8Array,
+ unlink: (fileName: string) => void,
+};
+
+type FSMethodNames = { [K in keyof typeof FS]: (typeof FS)[K] extends (...args: any[]) => any ? K : never }[keyof typeof FS];
+type FSMethodArgs = { [K in FSMethodNames]: Parameters<(typeof FS)[K]> };
+type FSMethodReturn = { [K in FSMethodNames]: ReturnType<(typeof FS)[K]> };
+
+type LogCallback = (logParams: { type: string; message: string }) => any;
+type ProgressCallback = (progressParams: { ratio: number }) => any;
+
+export interface CreateFFmpegOptions {
+ /** path for ffmpeg-core.js script */
+ corePath?: string;
+ /** a boolean to turn on all logs, default is false */
+ log?: boolean;
+ /** a boolean to specify if the core is single or multi-threaded */
+ mt?:boolean
+ /** a function to get log messages, a quick example is ({ message }) => console.log(message) */
+ logger?: LogCallback;
+ /** a function to trace the progress, a quick example is p => console.log(p) */
+ progress?: ProgressCallback;
+}
+
+export interface FFmpeg {
+ /*
+ * Load ffmpeg.wasm-core script.
+ * In browser environment, the ffmpeg.wasm-core script is fetch from
+ * CDN and can be assign to a local path by assigning `corePath`.
+ * In node environment, we use dynamic require and the default `corePath`
+ * is `$ffmpeg/core`.
+ *
+ * Typically the load() func might take few seconds to minutes to complete,
+ * better to do it as early as possible.
+ *
+ */
+ load(): Promise;
+ /*
+ * Determine whether the Core is loaded.
+ */
+ isLoaded(): boolean;
+ /*
+ * Run ffmpeg command.
+ * This is the major function in ffmpeg.wasm, you can just imagine it
+ * as ffmpeg native cli and what you need to pass is the same.
+ *
+ * For example, you can convert native command below:
+ *
+ * ```
+ * $ ffmpeg -i video.avi -c:v libx264 video.mp4
+ * ```
+ *
+ * To
+ *
+ * ```
+ * await ffmpeg.run('-i', 'video.avi', '-c:v', 'libx264', 'video.mp4');
+ * ```
+ *
+ */
+ run(...args: string[]): Promise;
+ /*
+ * Run FS operations.
+ * For input/output file of ffmpeg.wasm, it is required to save them to MEMFS
+ * first so that ffmpeg.wasm is able to consume them. Here we rely on the FS
+ * methods provided by Emscripten.
+ *
+ * Common methods to use are:
+ * ffmpeg.FS('writeFile', 'video.avi', new Uint8Array(...)): writeFile writes
+ * data to MEMFS. You need to use Uint8Array for binary data.
+ * ffmpeg.FS('readFile', 'video.mp4'): readFile from MEMFS.
+ * ffmpeg.FS('unlink', 'video.map'): delete file from MEMFS.
+ *
+ * For more info, check https://emscripten.org/docs/api_reference/Filesystem-API.html
+ *
+ */
+ FS(method: Method, ...args: FSMethodArgs[Method]): FSMethodReturn[Method];
+ setProgress(progress: ProgressCallback): void;
+ setLogger(log: LogCallback): void;
+ setLogging(logging: boolean): void;
+ exit(): void;
+}
+
+/*
+ * Create ffmpeg instance.
+ * Each ffmpeg instance owns an isolated MEMFS and works
+ * independently.
+ *
+ * For example:
+ *
+ * ```
+ * const ffmpeg = createFFmpeg({
+ * log: true,
+ * logger: () => {},
+ * progress: () => {},
+ * corePath: '',
+ * })
+ * ```
+ *
+ * For the usage of these four arguments, check config.js
+ *
+ */
+export function createFFmpeg(options?: CreateFFmpegOptions): FFmpeg;
+/*
+ * Helper function for fetching files from various resource.
+ * Sometimes the video/audio file you want to process may located
+ * in a remote URL and somewhere in your local file system.
+ *
+ * This helper function helps you to fetch to file and return an
+ * Uint8Array variable for ffmpeg.wasm to consume.
+ *
+ */
+export function fetchFile(data: string | Buffer | Blob | File): Promise;
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/index.js b/apps/photos/thirdparty/ffmpeg-wasm/src/index.js
new file mode 100644
index 000000000..8c69a5b67
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/index.js
@@ -0,0 +1,36 @@
+require('regenerator-runtime/runtime');
+const createFFmpeg = require('./createFFmpeg');
+const { fetchFile } = require('./node');
+
+module.exports = {
+ /*
+ * Create ffmpeg instance.
+ * Each ffmpeg instance owns an isolated MEMFS and works
+ * independently.
+ *
+ * For example:
+ *
+ * ```
+ * const ffmpeg = createFFmpeg({
+ * log: true,
+ * logger: () => {},
+ * progress: () => {},
+ * corePath: '',
+ * })
+ * ```
+ *
+ * For the usage of these four arguments, check config.js
+ *
+ */
+ createFFmpeg,
+ /*
+ * Helper function for fetching files from various resource.
+ * Sometimes the video/audio file you want to process may located
+ * in a remote URL and somewhere in your local file system.
+ *
+ * This helper function helps you to fetch to file and return an
+ * Uint8Array variable for ffmpeg.wasm to consume.
+ *
+ */
+ fetchFile,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/node/defaultOptions.js b/apps/photos/thirdparty/ffmpeg-wasm/src/node/defaultOptions.js
new file mode 100644
index 000000000..5b22e733f
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/node/defaultOptions.js
@@ -0,0 +1,6 @@
+/*
+ * Default options for node environment
+ */
+module.exports = {
+ corePath: '@ffmpeg/core',
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/node/fetchFile.js b/apps/photos/thirdparty/ffmpeg-wasm/src/node/fetchFile.js
new file mode 100644
index 000000000..9c181bfd7
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/node/fetchFile.js
@@ -0,0 +1,33 @@
+const util = require('util');
+const fs = require('fs');
+const fetch = require('node-fetch');
+const isURL = require('is-url');
+
+module.exports = async (_data) => {
+ let data = _data;
+ if (typeof _data === 'undefined') {
+ return new Uint8Array();
+ }
+
+ if (typeof _data === 'string') {
+ /* From remote URL/server */
+ if (isURL(_data)
+ || _data.startsWith('moz-extension://')
+ || _data.startsWith('chrome-extension://')
+ || _data.startsWith('file://')) {
+ const res = await fetch(_data);
+ data = await res.arrayBuffer();
+ /* From base64 format */
+ } else if (/data:_data\/([a-zA-Z]*);base64,([^"]*)/.test(_data)) {
+ data = Buffer.from(_data.split(',')[1], 'base64');
+ /* From local file path */
+ } else {
+ data = await util.promisify(fs.readFile)(_data);
+ }
+ /* From Buffer */
+ } else if (Buffer.isBuffer(_data)) {
+ data = _data;
+ }
+
+ return new Uint8Array(data);
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/node/getCreateFFmpegCore.js b/apps/photos/thirdparty/ffmpeg-wasm/src/node/getCreateFFmpegCore.js
new file mode 100644
index 000000000..29314c931
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/node/getCreateFFmpegCore.js
@@ -0,0 +1,7 @@
+const { log } = require('../utils/log');
+
+module.exports = ({ corePath }) => new Promise((resolve) => {
+ log('info', `fetch ffmpeg.wasm-core script from ${corePath}`);
+ // eslint-disable-next-line import/no-dynamic-require
+ resolve({ createFFmpegCore: require(corePath) });
+});
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/node/index.js b/apps/photos/thirdparty/ffmpeg-wasm/src/node/index.js
new file mode 100644
index 000000000..e73bfaa3d
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/node/index.js
@@ -0,0 +1,9 @@
+const defaultOptions = require('./defaultOptions');
+const getCreateFFmpegCore = require('./getCreateFFmpegCore');
+const fetchFile = require('./fetchFile');
+
+module.exports = {
+ defaultOptions,
+ getCreateFFmpegCore,
+ fetchFile,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/utils/errors.js b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/errors.js
new file mode 100644
index 000000000..e68c59258
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/errors.js
@@ -0,0 +1,13 @@
+const NO_LOAD = Error(''.trim('\n'));
+
+const CREATE_FFMPEG_CORE_IS_NOT_DEFINED = (corePath) => (Error(`
+createFFmpegCore is not defined. ffmpeg.wasm is unable to find createFFmpegCore after loading ffmpeg-core.js from ${corePath}. Use another URL when calling createFFmpeg():
+
+const ffmpeg = createFFmpeg({
+ corePath: 'http://localhost:3000/ffmpeg-core.js',
+});
+`));
+
+module.exports = {
+ CREATE_FFMPEG_CORE_IS_NOT_DEFINED,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/utils/log.js b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/log.js
new file mode 100644
index 000000000..bb2f0fb21
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/log.js
@@ -0,0 +1,24 @@
+let logging = false;
+let customLogger = () => {};
+
+const setLogging = (_logging) => {
+ logging = _logging;
+};
+
+const setCustomLogger = (logger) => {
+ customLogger = logger;
+};
+
+const log = (type, message) => {
+ customLogger({ type, message });
+ if (logging) {
+ console.log(`[${type}] ${message}`);
+ }
+};
+
+module.exports = {
+ logging,
+ setLogging,
+ setCustomLogger,
+ log,
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseArgs.js b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseArgs.js
new file mode 100644
index 000000000..94e7e6a1f
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseArgs.js
@@ -0,0 +1,9 @@
+module.exports = (Core, args) => {
+ const argsPtr = Core._malloc(args.length * Uint32Array.BYTES_PER_ELEMENT);
+ args.forEach((s, idx) => {
+ const buf = Core._malloc(s.length + 1);
+ Core.writeAsciiToMemory(s, buf);
+ Core.setValue(argsPtr + (Uint32Array.BYTES_PER_ELEMENT * idx), buf, 'i32');
+ });
+ return [args.length, argsPtr];
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseProgress.js b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseProgress.js
new file mode 100644
index 000000000..dc1658a9d
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/src/utils/parseProgress.js
@@ -0,0 +1,28 @@
+let duration = 0;
+let ratio = 0;
+
+const ts2sec = (ts) => {
+ const [h, m, s] = ts.split(':');
+ return (parseFloat(h) * 60 * 60) + (parseFloat(m) * 60) + parseFloat(s);
+};
+
+module.exports = (message, progress) => {
+ if (typeof message === 'string') {
+ if (message.startsWith(' Duration')) {
+ const ts = message.split(', ')[0].split(': ')[1];
+ const d = ts2sec(ts);
+ progress({ duration: d, ratio });
+ if (duration === 0 || duration > d) {
+ duration = d;
+ }
+ } else if (message.startsWith('frame') || message.startsWith('size')) {
+ const ts = message.split('time=')[1].split(' ')[0];
+ const t = ts2sec(ts);
+ ratio = t / duration;
+ progress({ ratio, time: t });
+ } else if (message.startsWith('video:')) {
+ progress({ ratio: 1 });
+ duration = 0;
+ }
+ }
+};
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/tests/.eslintrc b/apps/photos/thirdparty/ffmpeg-wasm/tests/.eslintrc
new file mode 100644
index 000000000..e56b93395
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/tests/.eslintrc
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "no-undef": 0,
+ "camelcase": 0
+ }
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/tests/constants.js b/apps/photos/thirdparty/ffmpeg-wasm/tests/constants.js
new file mode 100644
index 000000000..6060ebca7
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/tests/constants.js
@@ -0,0 +1,19 @@
+const TIMEOUT = 60000;
+const IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined';
+const OPTIONS = {
+ corePath: IS_BROWSER ? 'http://localhost:3000/node_modules/@ffmpeg/core/dist/ffmpeg-core.js' : '@ffmpeg/core',
+};
+const FLAME_MP4_LENGTH = 100374;
+const META_FLAME_MP4_LENGTH = 100408;
+const META_FLAME_MP4_LENGTH_NO_SPACE = 100404;
+
+if (typeof module !== 'undefined') {
+ module.exports = {
+ TIMEOUT,
+ IS_BROWSER,
+ OPTIONS,
+ FLAME_MP4_LENGTH,
+ META_FLAME_MP4_LENGTH,
+ META_FLAME_MP4_LENGTH_NO_SPACE,
+ };
+}
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.html b/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.html
new file mode 100644
index 000000000..f173422ef
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.html
@@ -0,0 +1,21 @@
+
+
+
+
+ FFmpeg Unit Test
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.js b/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.js
new file mode 100644
index 000000000..2a434cd3f
--- /dev/null
+++ b/apps/photos/thirdparty/ffmpeg-wasm/tests/ffmpeg.test.js
@@ -0,0 +1,69 @@
+const { createFFmpeg } = FFmpeg;
+
+describe('load()', () => {
+ it('should throw error when corePath is not a string', async () => {
+ const ffmpeg = createFFmpeg({ ...OPTIONS, corePath: null });
+
+ try {
+ await ffmpeg.load();
+ } catch (e) {
+ expect(e).to.be.an('Error');
+ }
+ });
+ it('should throw error when not called before FS() and run()', () => {
+ const ffmpeg = createFFmpeg(OPTIONS);
+ expect(() => ffmpeg.FS('readdir', 'dummy')).to.throw();
+ expect(() => ffmpeg.run('-h')).to.throw();
+ });
+
+ it('should throw error when running load() more than once', async () => {
+ const ffmpeg = createFFmpeg(OPTIONS);
+ await ffmpeg.load();
+ try {
+ await ffmpeg.load();
+ } catch (e) {
+ expect(e).to.be.an('Error');
+ }
+ }).timeout(TIMEOUT);
+});
+
+describe('isLoaded()', () => {
+ it('should return true when loaded', async () => {
+ const ffmpeg = createFFmpeg(OPTIONS);
+ await ffmpeg.load();
+ expect(ffmpeg.isLoaded()).to.equal(true);
+ }).timeout(TIMEOUT);
+});
+
+describe('run()', () => {
+ it('should not allow to run two command at the same time', async () => {
+ const ffmpeg = createFFmpeg(OPTIONS);
+ await ffmpeg.load();
+ ffmpeg.run('-h');
+ setTimeout(() => {
+ try {
+ ffmpeg.run('-h');
+ } catch (e) {
+ expect(e).to.be.an(Error);
+ }
+ }, 500);
+ }).timeout(TIMEOUT);
+});
+
+describe('FS()', () => {
+ const ffmpeg = createFFmpeg(OPTIONS);
+ before(async function cb() {
+ this.timeout(0);
+ await ffmpeg.load();
+ });
+
+ it('should throw error when readdir for invalid path ', () => {
+ expect(() => ffmpeg.FS('readdir', '/invalid')).to.throw(/readdir/);
+ });
+ it('should throw error when readFile for invalid path ', () => {
+ expect(() => ffmpeg.FS('readFile', '/invalid')).to.throw(/readFile/);
+ });
+ it('should throw an default error ', () => {
+ expect(() => ffmpeg.FS('unlink', '/invalid')).to.throw(/Oops/);
+ });
+});
diff --git a/apps/photos/thirdparty/photoswipe/.github/FUNDING.yml b/apps/photos/thirdparty/photoswipe/.github/FUNDING.yml
new file mode 100644
index 000000000..b3e6eaad4
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/.github/FUNDING.yml
@@ -0,0 +1 @@
+open_collective: photoswipe
diff --git a/apps/photos/thirdparty/photoswipe/.gitignore b/apps/photos/thirdparty/photoswipe/.gitignore
new file mode 100644
index 000000000..98e067eb4
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/.gitignore
@@ -0,0 +1,37 @@
+node_modules/
+release/*
+/release
+/node_modules
+Gemfile.lock
+test/dest
+*.gem
+pkg/
+*.swp
+*~
+_site/
+.bundle/
+.DS_Store
+bbin/
+sftp-config*
+_site
+.htaccess
+private-*
+__article/
+_site/*
+node_modules
+_production
+all.min.css
+aws-keys.json
+*.sublime-project
+*.sublime-workspace
+website/dist/
+*.idea
+/.idea
+.node-version
+.sass-cache/
+
+
+
+
+
+
diff --git a/apps/photos/thirdparty/photoswipe/.jshintrc b/apps/photos/thirdparty/photoswipe/.jshintrc
new file mode 100644
index 000000000..353086e17
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/.jshintrc
@@ -0,0 +1,26 @@
+{
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "sub": true,
+ "undef": false,
+ "unused": true,
+ "boss": true,
+ "eqnull": true,
+ "browser": true,
+ "expr": true,
+ "onevar": true,
+ "trailing": true,
+ "undef": true,
+ "unused": true,
+ "maxlen": 140,
+
+ "predef": [
+ "define",
+ "module",
+ "Element"
+ ]
+}
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/.prettierrc.json b/apps/photos/thirdparty/photoswipe/.prettierrc.json
new file mode 100644
index 000000000..81f1f4839
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/.prettierrc.json
@@ -0,0 +1,6 @@
+{
+ "tabWidth": 4,
+ "trailingComma": "es5",
+ "singleQuote": true,
+ "bracketSameLine": true
+}
diff --git a/apps/photos/thirdparty/photoswipe/.travis.yml b/apps/photos/thirdparty/photoswipe/.travis.yml
new file mode 100644
index 000000000..ee45fa37a
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/.travis.yml
@@ -0,0 +1,7 @@
+language: node_js
+
+node_js:
+ - "8"
+
+before_install:
+ - npm install grunt-cli -g
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/Gruntfile.js b/apps/photos/thirdparty/photoswipe/Gruntfile.js
new file mode 100644
index 000000000..ebdfccdde
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/Gruntfile.js
@@ -0,0 +1,262 @@
+/**
+ *
+ * Run 'grunt' to generate JS and CSS in folder 'dist' and site in folder '_site'
+ * *
+ * Run 'grunt watch' to automatically regenerate '_site' when you change files in 'src' or in 'website'
+ *
+ */
+
+module.exports = function(grunt) {
+
+ 'use strict';
+
+ var jekyllConfig = "isLocal : false \r\n"+
+ "permalink: /:title/ \r\n"+
+ "exclude: ['.json', '.rvmrc', '.rbenv-version', 'README.md', 'Rakefile'," +
+ "'changelog.md', 'compiler.jar', 'private', '.htaccess'," +
+ "'photoswipe.sublime-project', 'photoswipe.sublime-workspace'] \r\n"+
+
+ "auto: true \r\n"+
+ "pswpversion: <%= pkg.version %> \r\n"+
+ "siteversion: 1.0.4 \r\n"+
+ "markdown: redcarpet \r\n"+
+ "kramdown: \r\n"+
+ " input: GFM \r\n";
+
+ grunt.initConfig({
+
+ pkg: grunt.file.readJSON('photoswipe.json'),
+
+ banner: '/*! PhotoSwipe - v<%= pkg.version %> - ' +
+ '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
+ '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
+ '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>; */\n',
+
+ defaultUIBanner: '/*! PhotoSwipe Default UI - <%= pkg.version %> - ' +
+ '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
+ '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' +
+ '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>; */\n',
+
+ // Task configuration.
+ clean: {
+ files: ['dist']
+ },
+
+ sass: {
+ dist: {
+ files: {
+ 'dist/photoswipe.css': 'src/css/main.scss',
+ 'dist/default-skin/default-skin.css': 'src/css/default-skin/default-skin.scss'
+ }
+ }
+ },
+
+ // https://github.com/nDmitry/grunt-autoprefixer
+ autoprefixer: {
+ options: {
+ browsers: ['last 3 versions', 'android 3', 'ie 9', 'bb 10']
+ },
+ no_dest: {
+ src: ['dist/photoswipe.css', 'dist/default-skin/default-skin.css']
+ }
+ },
+
+ jshint: {
+ all: [
+ 'Gruntfile.js',
+ 'dist/photoswipe.js',
+ 'dist/photoswipe-ui-default.js'
+ ],
+ options: {
+ jshintrc: '.jshintrc'
+ }
+ },
+
+ pswpbuild: {
+ all: {
+ src: [
+ 'framework-bridge',
+ 'core',
+ 'gestures',
+ 'show-hide-transition',
+ 'items-controller',
+ 'tap',
+ 'desktop-zoom',
+ 'history'
+ ],
+ basePath: 'src/js/',
+ dest: 'dist/photoswipe.js',
+ uidest: 'dist/photoswipe-ui-default.js',
+ banner: '<%= banner %>',
+ defaultUIBanner: '<%= defaultUIBanner %>'
+ }
+ },
+
+ jekyll: {
+ dev: {
+ options: {
+ src: 'website',
+ dest: '_site',
+ url: 'local',
+ raw: jekyllConfig + "url: local"
+ }
+
+ },
+ production: {
+ options: {
+ src: 'website',
+ dest: '_production',
+ url: 'production',
+ raw: jekyllConfig + "url: production"
+ }
+ }
+ },
+
+ copy: {
+ dev: {
+ files: [
+ {src: ['src/css/default-skin/default-skin.svg'], dest: 'dist/default-skin/default-skin.svg'},
+ {src: ['src/css/default-skin/default-skin.png'], dest: 'dist/default-skin/default-skin.png'},
+ {src: ['src/css/default-skin/preloader.gif'], dest: 'dist/default-skin/preloader.gif'},
+ {expand: true, src: ['dist/**'], dest: '_site/'}
+ ]
+ },
+ main: {
+ files: [
+ {expand: true, src: ['dist/**'], dest: 'website/'}
+ ]
+ }
+
+ },
+
+ uglify: {
+ my_target: {
+ files: {
+ 'dist/photoswipe.min.js': ['dist/photoswipe.js'],
+ 'dist/photoswipe-ui-default.min.js': ['dist/photoswipe-ui-default.js']
+ },
+ preserveComments: /^!/i
+ },
+ options: {
+ preserveComments: /^!/i
+ }
+ },
+
+ watch: { // for development run 'grunt watch'
+ jekyll: {
+ files: ['website/**', 'website/documentation/**', '_includes/**'],
+ tasks: ['jekyll:dev', 'copy:dev']
+ },
+ files: ['src/**'],
+ tasks: [ 'sass', 'autoprefixer', 'pswpbuild', 'copy:dev', 'uglify']
+ },
+
+ cssmin: {
+ compress: {
+ files: {
+ "website/site-assets/all.min.css": ["website/site-assets/site.css", "website/dist/photoswipe.css"]
+ }
+ }
+ },
+
+ svgmin: {
+ dist: {
+ files: {
+ 'src/css/default-skin/default-skin.svg': 'src/css/default-skin/default-skin.svg'
+ }
+ }
+ }
+
+
+ });
+
+
+ // grunt pswpbuild --pswp-exclude=ajax,image
+ grunt.task.registerMultiTask('pswpbuild', 'Makes PhotoSwipe core JS file.', function() {
+
+ var files = this.data.src,
+ includes = grunt.option('pswp-exclude'),
+ basePath = this.data.basePath,
+ newContents = this.data.banner;
+
+ newContents += "(function (root, factory) { \n"+
+ "\tif (typeof define === 'function' && define.amd) {\n" +
+ "\t\tdefine(factory);\n" +
+ "\t} else if (typeof exports === 'object') {\n" +
+ "\t\tmodule.exports = factory();\n" +
+ "\t} else {\n" +
+ "\t\troot.PhotoSwipe = factory();\n" +
+ "\t}\n" +
+ "})(this, function () {\n\n" +
+ "\t'use strict';\n"+
+ "\tvar PhotoSwipe = function(template, UiClass, items, options){\n";
+
+
+ if(includes) {
+ includes = includes.split(/[\s,]+/); // 'a,b,c' => ['a','b','c']
+ var removeA = function (arr) {
+ var what, a = arguments, L = a.length, ax;
+ while (L > 1 && arr.length) {
+ what = a[--L];
+ while ((ax= arr.indexOf(what)) !== -1) {
+ arr.splice(ax, 1);
+ }
+ }
+ return arr;
+ };
+
+ includes.forEach(function( name ) {
+ if(name) {
+
+ grunt.log.writeln( 'removed "'+name +'"' );
+ files = removeA(files, name);
+ }
+ });
+ }
+
+ grunt.log.writeln( 'Your build is made of:'+files );
+
+ files.forEach(function( name ) {
+ // Wrap each module with a pience of code to be able to exlude it, stolen for modernizr.com
+ newContents += "\n/*>>"+name+"*/\n";
+ newContents += grunt.file.read( basePath + name + '.js' ) + '\n';
+ newContents += "\n/*>>"+name+"*/\n";
+ });
+
+
+ newContents+= "\tframework.extend(self, publicMethods); };\n";
+ newContents+= "\treturn PhotoSwipe;\n";
+ newContents+= "});";
+
+
+ grunt.file.write( this.data.dest, newContents );
+
+ var uiContents = grunt.file.read( basePath + 'ui/photoswipe-ui-default.js' );
+ uiContents = this.data.defaultUIBanner + uiContents;
+ grunt.file.write( this.data.uidest, uiContents );
+ });
+
+
+
+
+ // These plugins provide necessary tasks.
+ grunt.loadNpmTasks('grunt-contrib-clean');
+ grunt.loadNpmTasks('grunt-contrib-concat');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+ grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-sass');
+ grunt.loadNpmTasks('grunt-autoprefixer');
+ grunt.loadNpmTasks('grunt-contrib-copy');
+ grunt.loadNpmTasks('grunt-jekyll');
+ grunt.loadNpmTasks('grunt-contrib-cssmin');
+ grunt.loadNpmTasks('grunt-svgmin');
+
+ // Default task.
+ grunt.registerTask('default', ['sass', 'autoprefixer', 'pswpbuild','uglify', 'copy', 'jekyll:dev']);
+
+ grunt.registerTask('production', ['sass', 'autoprefixer', 'pswpbuild', 'uglify', 'copy', 'cssmin', 'jekyll:production']);
+ grunt.registerTask('nosite', ['sass', 'autoprefixer', 'pswpbuild', 'uglify']);
+ grunt.registerTask('hint', ['jshint']);
+
+};
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/LICENSE b/apps/photos/thirdparty/photoswipe/LICENSE
new file mode 100644
index 000000000..5f8e6c87f
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014-2019 Dmitry Semenov, http://dimsemenov.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/apps/photos/thirdparty/photoswipe/README.md b/apps/photos/thirdparty/photoswipe/README.md
new file mode 100644
index 000000000..5a0d1a59b
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/README.md
@@ -0,0 +1,74 @@
+
+:exclamation: **Important note** v5 beta is now available for testing, [read announcement here](https://github.com/dimsemenov/PhotoSwipe/issues/1749) and report any issues that you find, code is within `v5-beta` branch.
+
+## PhotoSwipe Repository
+
+[![Build Status](https://travis-ci.org/dimsemenov/PhotoSwipe.svg)](https://travis-ci.org/dimsemenov/PhotoSwipe)
+
+JavaScript image gallery for mobile and desktop.
+
+- [Documentation and getting started guide](http://photoswipe.com/documentation/getting-started.html).
+- [Demo and script home page](http://photoswipe.com).
+- [NPM](https://www.npmjs.com/package/photoswipe) `npm install photoswipe`.
+- Bower `bower install photoswipe`.
+
+## Location of files
+
+- Compiled PhotoSwipe JS and CSS files, SVG and PNG sprites are in the [dist/](https://github.com/dimsemenov/PhotoSwipe/tree/master/dist) folder.
+- Source files (.JS and .SCSS) are in the [src/](https://github.com/dimsemenov/PhotoSwipe/tree/master/src) folder. Note that PhotoSwipe uses Autoprefixer when compiling SASS files.
+- Demo website is in the [website/](https://github.com/dimsemenov/PhotoSwipe/tree/master/website) folder.
+- Documentation markdown files are in [website/documentation/](https://github.com/dimsemenov/PhotoSwipe/tree/master/website/documentation).
+
+## Plugins / extensions / addons
+
+- [Ruby gem](https://rubygems.org/gems/photoswipe-rails).
+- Ember.js addons: [ember-photoswipe](https://github.com/kaermorchen/ember-photoswipe), [ember-cli-photoswipe](https://github.com/poetic/ember-cli-photoswipe).
+- [Eager app](https://eager.io/app/DvuKIoU8iTOt).
+- [Koken CMS plugin](https://github.com/DanielMuller/koken-plugin-photoswipe).
+- [Orchard CMS module](https://gallery.orchardproject.net/List/Modules/Orchard.Module.Cascade.PhotoSwipe).
+- [Yellow CMS plugin](https://github.com/datenstrom/yellow-plugins/tree/master/gallery).
+- [Kirby CMS plugin](https://github.com/SiteMarina/guggenheim).
+- [Drupal CMF module](https://www.drupal.org/project/photoswipe).
+- [ProcessWire CMS module](https://github.com/blynx/MarkupProcesswirePhotoswipe).
+- [SPIP CMS module](https://plugins.spip.net/photoswipe.html).
+- [Fork CMS MediaLibrary widget](https://github.com/forkcms/forkcms).
+
+Coded something useful? Email me and I’ll post a link to it here.
+
+## Build
+
+To compile PhotoSwipe by yourself, make sure that you have [Node.js](http://nodejs.org/), [Grunt.js](https://github.com/cowboy/grunt), [Ruby](http://www.ruby-lang.org/) and [Jekyll](https://github.com/mojombo/jekyll/) installed, then:
+
+1) Clone the repository
+
+ git clone https://github.com/dimsemenov/PhotoSwipe.git
+
+2) Go inside the PhotoSwipe folder that you fetched and install Node dependencies
+
+ cd PhotoSwipe && npm install
+
+3) Run `grunt` to generate the JS and CSS files in the `dist` folder and the site in the `_site/` folder
+
+ grunt
+
+Optionally:
+
+- Run `grunt watch` to automatically rebuild files (JS, CSS, demo website and documentation) when you change files in `src/` or in `website/`.
+- Run `grunt nosite` to build just JS and CSS files (output is folder `dist/`).
+- Run `grunt pswpbuild` to build just JS files. Param `--pswp-exclude` allows to exclude modules, for example `grunt pswpbuild --pswp-exclude=history` will exclude history module.
+
+## Using PhotoSwipe?
+
+If you’ve used PhotoSwipe in some interesting way, or on the site of a popular brand, I’d be very grateful if you shoot me a link to it.
+
+## License
+
+Script is licensed under MIT license with one exception: Do not create a public WordPress plugin based on it, as I will develop it. If you need to use it for a public WordPress plugin right now, please ask me by email first. Thanks!
+
+Attribution is not required, but much appreciated, especially if you’re making a product for developers.
+
+## About
+
+PhotoSwipe 4.0+ is developed by [Dmitry Semenov](http://twitter.com/dimsemenov). But initially script was created in 2011 by [Code Computerlove](http://www.codecomputerlove.com/), a digital agency in Manchester, they [passed](https://twitter.com/PhotoSwipe/status/444134042787930113) on development in March 2014. You can view [source and documentation](https://github.com/dimsemenov/PhotoSwipe/tree/v3.0.3) of old PhotoSwipe (<4.0) in history of this repo.
+
+
diff --git a/apps/photos/thirdparty/photoswipe/bower.json b/apps/photos/thirdparty/photoswipe/bower.json
new file mode 100644
index 000000000..278e91e0f
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/bower.json
@@ -0,0 +1,37 @@
+{
+ "name": "photoswipe",
+ "homepage": "https://photoswipe.com",
+ "authors": [
+ "Dmitry Semenov (http://dimsemenov.com)"
+ ],
+ "description": "Touch-friendly image gallery for mobile and desktop. Without dependencies.",
+ "main": [
+ "dist/photoswipe.js",
+ "dist/photoswipe.css",
+ "dist/photoswipe-ui-default.js",
+ "dist/default-skin/default-skin.css",
+ "dist/default-skin/default-skin.png",
+ "dist/default-skin/default-skin.svg",
+ "dist/default-skin/preloader.gif"
+ ],
+ "keywords": [
+ "image",
+ "gallery",
+ "lightbox",
+ "swipe",
+ "touch"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/dimsemenov/PhotoSwipe.git"
+ },
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests",
+ "website"
+ ]
+}
diff --git a/apps/photos/thirdparty/photoswipe/component.json b/apps/photos/thirdparty/photoswipe/component.json
new file mode 100644
index 000000000..d14cba0bc
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/component.json
@@ -0,0 +1,30 @@
+{
+ "name": "photoswipe",
+ "repository": "dimsemenov/PhotoSwipe",
+ "description": "JavaScript gallery",
+ "main": "dist/photoswipe.js",
+ "version": "4.1.4",
+ "keywords": [
+ "gallery",
+ "lightbox",
+ "photo",
+ "image",
+ "touch",
+ "swipe",
+ "zoom"
+ ],
+ "scripts": [
+ "dist/photoswipe.js",
+ "dist/photoswipe-ui-default.js"
+ ],
+ "styles": [
+ "dist/photoswipe.css",
+ "dist/default-skin/default-skin.css"
+ ],
+ "images": [
+ "dist/default-skin/default-skin.png",
+ "dist/default-skin/default-skin.svg",
+ "dist/default-skin/preloader.gif"
+ ],
+ "license": "MIT"
+}
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin.png b/apps/photos/thirdparty/photoswipe/dist/default-skin.png
new file mode 100644
index 000000000..441c502c9
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/dist/default-skin.png differ
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin.svg b/apps/photos/thirdparty/photoswipe/dist/default-skin.svg
new file mode 100644
index 000000000..9d5f0c6a1
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/default-skin.svg
@@ -0,0 +1 @@
+default-skin 2
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.css b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.css
new file mode 100644
index 000000000..c96163266
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.css
@@ -0,0 +1,482 @@
+/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */
+/*
+
+ Contents:
+
+ 1. Buttons
+ 2. Share modal and links
+ 3. Index indicator ("1 of X" counter)
+ 4. Caption
+ 5. Loading indicator
+ 6. Additional styles (root element, top bar, idle state, hidden state, etc.)
+
+*/
+/*
+
+ 1. Buttons
+
+ */
+/* css reset */
+.pswp__button {
+ width: 44px;
+ height: 44px;
+ position: relative;
+ background: none;
+ cursor: pointer;
+ overflow: visible;
+ -webkit-appearance: none;
+ display: block;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ float: right;
+ opacity: 0.75;
+ -webkit-transition: opacity 0.2s;
+ transition: opacity 0.2s;
+ -webkit-box-shadow: none;
+ box-shadow: none; }
+ .pswp__button:focus, .pswp__button:hover {
+ opacity: 1; }
+ .pswp__button:active {
+ outline: none;
+ opacity: 0.9; }
+ .pswp__button::-moz-focus-inner {
+ padding: 0;
+ border: 0; }
+
+/* pswp__ui--over-close class it added when mouse is over element that should close gallery */
+.pswp__ui--over-close .pswp__button--close {
+ opacity: 1; }
+
+.pswp__button,
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+ background: url(default-skin.png) 0 0 no-repeat;
+ background-size: 264px 88px;
+ width: 44px;
+ height: 44px; }
+
+@media (-webkit-min-device-pixel-ratio: 1.1), (-webkit-min-device-pixel-ratio: 1.09375), (min-resolution: 105dpi), (min-resolution: 1.1dppx) {
+ /* Serve SVG sprite if browser supports SVG and resolution is more than 105dpi */
+ .pswp--svg .pswp__button,
+ .pswp--svg .pswp__button--arrow--left:before,
+ .pswp--svg .pswp__button--arrow--right:before {
+ background-image: url(default-skin.svg); }
+ .pswp--svg .pswp__button--arrow--left,
+ .pswp--svg .pswp__button--arrow--right {
+ background: none; } }
+
+.pswp__button--close {
+ background-position: 0 -44px; }
+
+.pswp__button--share {
+ background-position: -44px -44px; }
+
+.pswp__button--fs {
+ display: none; }
+
+.pswp--supports-fs .pswp__button--fs {
+ display: block; }
+
+.pswp--fs .pswp__button--fs {
+ background-position: -44px 0; }
+
+.pswp__button--zoom {
+ display: none;
+ background-position: -88px 0; }
+
+.pswp--zoom-allowed .pswp__button--zoom {
+ display: block; }
+
+.pswp--zoomed-in .pswp__button--zoom {
+ background-position: -132px 0; }
+
+/* no arrows on touch screens */
+.pswp--touch .pswp__button--arrow--left,
+.pswp--touch .pswp__button--arrow--right {
+ visibility: hidden; }
+
+/*
+ Arrow buttons hit area
+ (icon is added to :before pseudo-element)
+*/
+.pswp__button--arrow--left,
+.pswp__button--arrow--right {
+ background: none;
+ top: 50%;
+ margin-top: -50px;
+ width: 70px;
+ height: 100px;
+ position: absolute; }
+
+.pswp__button--arrow--left {
+ left: 0; }
+
+.pswp__button--arrow--right {
+ right: 0; }
+
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+ content: '';
+ top: 35px;
+ background-color: rgba(0, 0, 0, 0.3);
+ height: 30px;
+ width: 32px;
+ position: absolute; }
+
+.pswp__button--arrow--left:before {
+ left: 6px;
+ background-position: -138px -44px; }
+
+.pswp__button--arrow--right:before {
+ right: 6px;
+ background-position: -94px -44px; }
+
+/*
+
+ 2. Share modal/popup and links
+
+ */
+.pswp__counter,
+.pswp__share-modal {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none; }
+
+.pswp__share-modal {
+ display: block;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ padding: 10px;
+ position: absolute;
+ z-index: 1600;
+ opacity: 0;
+ -webkit-transition: opacity 0.25s ease-out;
+ transition: opacity 0.25s ease-out;
+ -webkit-backface-visibility: hidden;
+ will-change: opacity; }
+
+.pswp__share-modal--hidden {
+ display: none; }
+
+.pswp__share-tooltip {
+ z-index: 1620;
+ position: absolute;
+ background: #FFF;
+ top: 56px;
+ border-radius: 2px;
+ display: block;
+ width: auto;
+ right: 44px;
+ -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+ -webkit-transform: translateY(6px);
+ -ms-transform: translateY(6px);
+ transform: translateY(6px);
+ -webkit-transition: -webkit-transform 0.25s;
+ transition: transform 0.25s;
+ -webkit-backface-visibility: hidden;
+ will-change: transform; }
+ .pswp__share-tooltip a {
+ display: block;
+ padding: 8px 12px;
+ color: #000;
+ text-decoration: none;
+ font-size: 14px;
+ line-height: 18px; }
+ .pswp__share-tooltip a:hover {
+ text-decoration: none;
+ color: #000; }
+ .pswp__share-tooltip a:first-child {
+ /* round corners on the first/last list item */
+ border-radius: 2px 2px 0 0; }
+ .pswp__share-tooltip a:last-child {
+ border-radius: 0 0 2px 2px; }
+
+.pswp__share-modal--fade-in {
+ opacity: 1; }
+ .pswp__share-modal--fade-in .pswp__share-tooltip {
+ -webkit-transform: translateY(0);
+ -ms-transform: translateY(0);
+ transform: translateY(0); }
+
+/* increase size of share links on touch devices */
+.pswp--touch .pswp__share-tooltip a {
+ padding: 16px 12px; }
+
+a.pswp__share--facebook:before {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ position: absolute;
+ top: -12px;
+ right: 15px;
+ border: 6px solid transparent;
+ border-bottom-color: #FFF;
+ -webkit-pointer-events: none;
+ -moz-pointer-events: none;
+ pointer-events: none; }
+
+a.pswp__share--facebook:hover {
+ background: #3E5C9A;
+ color: #FFF; }
+ a.pswp__share--facebook:hover:before {
+ border-bottom-color: #3E5C9A; }
+
+a.pswp__share--twitter:hover {
+ background: #55ACEE;
+ color: #FFF; }
+
+a.pswp__share--pinterest:hover {
+ background: #CCC;
+ color: #CE272D; }
+
+a.pswp__share--download:hover {
+ background: #DDD; }
+
+/*
+
+ 3. Index indicator ("1 of X" counter)
+
+ */
+.pswp__counter {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 44px;
+ font-size: 13px;
+ line-height: 44px;
+ color: #FFF;
+ opacity: 0.75;
+ padding: 0 10px; }
+
+/*
+
+ 4. Caption
+
+ */
+.pswp__caption {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ min-height: 44px; }
+ .pswp__caption small {
+ font-size: 11px;
+ color: #BBB; }
+
+.pswp__caption__center {
+ text-align: left;
+ max-width: 420px;
+ margin: 0 auto;
+ font-size: 13px;
+ padding: 10px;
+ line-height: 20px;
+ color: #CCC; }
+
+.pswp__caption--empty {
+ display: none; }
+
+/* Fake caption element, used to calculate height of next/prev image */
+.pswp__caption--fake {
+ visibility: hidden; }
+
+/*
+
+ 5. Loading indicator (preloader)
+
+ You can play with it here - http://codepen.io/dimsemenov/pen/yyBWoR
+
+ */
+.pswp__preloader {
+ width: 44px;
+ height: 44px;
+ position: absolute;
+ top: 0;
+ left: 50%;
+ margin-left: -22px;
+ opacity: 0;
+ -webkit-transition: opacity 0.25s ease-out;
+ transition: opacity 0.25s ease-out;
+ will-change: opacity;
+ direction: ltr; }
+
+.pswp__preloader__icn {
+ width: 20px;
+ height: 20px;
+ margin: 12px; }
+
+.pswp__preloader--active {
+ opacity: 1; }
+ .pswp__preloader--active .pswp__preloader__icn {
+ /* We use .gif in browsers that don't support CSS animation */
+ background: url(preloader.gif) 0 0 no-repeat; }
+
+.pswp--css_animation .pswp__preloader--active {
+ opacity: 1; }
+ .pswp--css_animation .pswp__preloader--active .pswp__preloader__icn {
+ -webkit-animation: clockwise 500ms linear infinite;
+ animation: clockwise 500ms linear infinite; }
+ .pswp--css_animation .pswp__preloader--active .pswp__preloader__donut {
+ -webkit-animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite;
+ animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1) infinite; }
+
+.pswp--css_animation .pswp__preloader__icn {
+ background: none;
+ opacity: 0.75;
+ width: 14px;
+ height: 14px;
+ position: absolute;
+ left: 15px;
+ top: 15px;
+ margin: 0; }
+
+.pswp--css_animation .pswp__preloader__cut {
+ /*
+ The idea of animating inner circle is based on Polymer ("material") loading indicator
+ by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html
+ */
+ position: relative;
+ width: 7px;
+ height: 14px;
+ overflow: hidden; }
+
+.pswp--css_animation .pswp__preloader__donut {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ border: 2px solid #FFF;
+ border-radius: 50%;
+ border-left-color: transparent;
+ border-bottom-color: transparent;
+ position: absolute;
+ top: 0;
+ left: 0;
+ background: none;
+ margin: 0; }
+
+@media screen and (max-width: 1024px) {
+ .pswp__preloader {
+ position: relative;
+ left: auto;
+ top: auto;
+ margin: 0;
+ float: right; } }
+
+@-webkit-keyframes clockwise {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg); } }
+
+@keyframes clockwise {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg); } }
+
+@-webkit-keyframes donut-rotate {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0); }
+ 50% {
+ -webkit-transform: rotate(-140deg);
+ transform: rotate(-140deg); }
+ 100% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0); } }
+
+@keyframes donut-rotate {
+ 0% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0); }
+ 50% {
+ -webkit-transform: rotate(-140deg);
+ transform: rotate(-140deg); }
+ 100% {
+ -webkit-transform: rotate(0);
+ transform: rotate(0); } }
+
+/*
+
+ 6. Additional styles
+
+ */
+/* root element of UI */
+.pswp__ui {
+ -webkit-font-smoothing: auto;
+ visibility: visible;
+ opacity: 1;
+ z-index: 1550; }
+
+/* top black bar with buttons and "1 of X" indicator */
+.pswp__top-bar {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 44px;
+ width: 100%; }
+
+.pswp__caption,
+.pswp__top-bar,
+.pswp--has_mouse .pswp__button--arrow--left,
+.pswp--has_mouse .pswp__button--arrow--right {
+ -webkit-backface-visibility: hidden;
+ will-change: opacity;
+ -webkit-transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1);
+ transition: opacity 333ms cubic-bezier(0.4, 0, 0.22, 1); }
+
+/* pswp--has_mouse class is added only when two subsequent mousemove events occur */
+.pswp--has_mouse .pswp__button--arrow--left,
+.pswp--has_mouse .pswp__button--arrow--right {
+ visibility: visible; }
+
+.pswp__top-bar,
+.pswp__caption {
+ background-color: rgba(0, 0, 0, 0.5); }
+
+/* pswp__ui--fit class is added when main image "fits" between top bar and bottom bar (caption) */
+.pswp__ui--fit .pswp__top-bar,
+.pswp__ui--fit .pswp__caption {
+ background-color: rgba(0, 0, 0, 0.3); }
+
+/* pswp__ui--idle class is added when mouse isn't moving for several seconds (JS option timeToIdle) */
+.pswp__ui--idle .pswp__top-bar {
+ opacity: 0; }
+
+.pswp__ui--idle .pswp__button--arrow--left,
+.pswp__ui--idle .pswp__button--arrow--right {
+ opacity: 0; }
+
+/*
+ pswp__ui--hidden class is added when controls are hidden
+ e.g. when user taps to toggle visibility of controls
+*/
+.pswp__ui--hidden .pswp__top-bar,
+.pswp__ui--hidden .pswp__caption,
+.pswp__ui--hidden .pswp__button--arrow--left,
+.pswp__ui--hidden .pswp__button--arrow--right {
+ /* Force paint & create composition layer for controls. */
+ opacity: 0.001; }
+
+/* pswp__ui--one-slide class is added when there is just one item in gallery */
+.pswp__ui--one-slide .pswp__button--arrow--left,
+.pswp__ui--one-slide .pswp__button--arrow--right,
+.pswp__ui--one-slide .pswp__counter {
+ display: none; }
+
+.pswp__element--disabled {
+ display: none !important; }
+
+.pswp--minimal--dark .pswp__top-bar {
+ background: none; }
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.png b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.png
new file mode 100644
index 000000000..441c502c9
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.png differ
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.svg b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.svg
new file mode 100644
index 000000000..9d5f0c6a1
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/default-skin/default-skin.svg
@@ -0,0 +1 @@
+default-skin 2
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/default-skin/preloader.gif b/apps/photos/thirdparty/photoswipe/dist/default-skin/preloader.gif
new file mode 100644
index 000000000..b8faa697c
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/dist/default-skin/preloader.gif differ
diff --git a/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.js b/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.js
new file mode 100644
index 000000000..88b80d5f2
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.js
@@ -0,0 +1,952 @@
+/*! PhotoSwipe Default UI - 4.1.4 - 2022-05-22
+* http://photoswipe.com
+* Copyright (c) 2022 Dmitry Semenov; */
+/**
+ *
+ * UI on top of main sliding area (caption, arrows, close button, etc.).
+ * Built just using public methods/properties of PhotoSwipe.
+ *
+ */
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.PhotoSwipeUI_Default = factory();
+ }
+})(this, function () {
+ 'use strict';
+
+ var PhotoSwipeUI_Default = function (pswp, framework) {
+ var ui = this;
+ var _overlayUIUpdated = false,
+ _controlsVisible = true,
+ _fullscrenAPI,
+ _controls,
+ _captionContainer,
+ _fakeCaptionContainer,
+ _indexIndicator,
+ _shareButton,
+ _shareModal,
+ _shareModalHidden = true,
+ _initalCloseOnScrollValue,
+ _isIdle,
+ _listen,
+ _loadingIndicator,
+ _loadingIndicatorHidden,
+ _loadingIndicatorTimeout,
+ _galleryHasOneSlide,
+ _options,
+ _defaultUIOptions = {
+ barsSize: { top: 44, bottom: 'auto' },
+ closeElClasses: [
+ 'item',
+ 'caption',
+ 'zoom-wrap',
+ 'ui',
+ 'top-bar',
+ ],
+ timeToIdle: 4000,
+ timeToIdleOutside: 1000,
+ loadingIndicatorDelay: 1000, // 2s
+
+ addCaptionHTMLFn: function (item, captionEl /*, isFake */) {
+ if (!item.title) {
+ captionEl.children[0].innerHTML = '';
+ return false;
+ }
+ captionEl.children[0].innerHTML = item.title;
+ return true;
+ },
+
+ closeEl: true,
+ captionEl: true,
+ fullscreenEl: true,
+ zoomEl: true,
+ shareEl: true,
+ counterEl: true,
+ arrowEl: true,
+ preloaderEl: true,
+
+ tapToClose: false,
+ tapToToggleControls: true,
+
+ clickToCloseNonZoomable: true,
+
+ shareButtons: [
+ {
+ id: 'facebook',
+ label: 'Share on Facebook',
+ url: 'https://www.facebook.com/sharer/sharer.php?u={{url}}',
+ },
+ {
+ id: 'twitter',
+ label: 'Tweet',
+ url: 'https://twitter.com/intent/tweet?text={{text}}&url={{url}}',
+ },
+ {
+ id: 'pinterest',
+ label: 'Pin it',
+ url:
+ 'http://www.pinterest.com/pin/create/button/' +
+ '?url={{url}}&media={{image_url}}&description={{text}}',
+ },
+ {
+ id: 'download',
+ label: 'Download image',
+ url: '{{raw_image_url}}',
+ download: true,
+ },
+ ],
+ getImageURLForShare: function (/* shareButtonData */) {
+ return pswp.currItem.src || '';
+ },
+ getPageURLForShare: function (/* shareButtonData */) {
+ return window.location.href;
+ },
+ getTextForShare: function (/* shareButtonData */) {
+ return pswp.currItem.title || '';
+ },
+
+ indexIndicatorSep: ' / ',
+ fitControlsWidth: 1200,
+ },
+ _blockControlsTap,
+ _blockControlsTapTimeout;
+
+ var _onControlsTap = function (e) {
+ if (_blockControlsTap) {
+ return true;
+ }
+
+ e = e || window.event;
+
+ if (_options.timeToIdle && _options.mouseUsed && !_isIdle) {
+ // reset idle timer
+ _onIdleMouseMove();
+ }
+
+ var target = e.target || e.srcElement,
+ uiElement,
+ clickedClass = target.getAttribute('class') || '',
+ found;
+
+ for (var i = 0; i < _uiElements.length; i++) {
+ uiElement = _uiElements[i];
+ if (
+ uiElement.onTap &&
+ clickedClass.indexOf('pswp__' + uiElement.name) > -1
+ ) {
+ uiElement.onTap();
+ found = true;
+ }
+ }
+
+ if (found) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+ _blockControlsTap = true;
+
+ // Some versions of Android don't prevent ghost click event
+ // when preventDefault() was called on touchstart and/or touchend.
+ //
+ // This happens on v4.3, 4.2, 4.1,
+ // older versions strangely work correctly,
+ // but just in case we add delay on all of them)
+ var tapDelay = framework.features.isOldAndroid ? 600 : 30;
+ _blockControlsTapTimeout = setTimeout(function () {
+ _blockControlsTap = false;
+ }, tapDelay);
+ }
+ },
+ _fitControlsInViewport = function () {
+ return (
+ !pswp.likelyTouchDevice ||
+ _options.mouseUsed ||
+ screen.width > _options.fitControlsWidth
+ );
+ },
+ _togglePswpClass = function (el, cName, add) {
+ framework[(add ? 'add' : 'remove') + 'Class'](
+ el,
+ 'pswp__' + cName
+ );
+ },
+ // add class when there is just one item in the gallery
+ // (by default it hides left/right arrows and 1ofX counter)
+ _countNumItems = function () {
+ var hasOneSlide = _options.getNumItemsFn() === 1;
+
+ if (hasOneSlide !== _galleryHasOneSlide) {
+ _togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
+ _galleryHasOneSlide = hasOneSlide;
+ }
+ },
+ _toggleShareModalClass = function () {
+ _togglePswpClass(
+ _shareModal,
+ 'share-modal--hidden',
+ _shareModalHidden
+ );
+ },
+ _toggleShareModal = function () {
+ _shareModalHidden = !_shareModalHidden;
+
+ if (!_shareModalHidden) {
+ _toggleShareModalClass();
+ setTimeout(function () {
+ if (!_shareModalHidden) {
+ framework.addClass(
+ _shareModal,
+ 'pswp__share-modal--fade-in'
+ );
+ }
+ }, 30);
+ } else {
+ framework.removeClass(
+ _shareModal,
+ 'pswp__share-modal--fade-in'
+ );
+ setTimeout(function () {
+ if (_shareModalHidden) {
+ _toggleShareModalClass();
+ }
+ }, 300);
+ }
+
+ if (!_shareModalHidden) {
+ _updateShareURLs();
+ }
+ return false;
+ },
+ _openWindowPopup = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ pswp.shout('shareLinkClick', e, target);
+
+ if (!target.href) {
+ return false;
+ }
+
+ if (target.hasAttribute('download')) {
+ return true;
+ }
+
+ window.open(
+ target.href,
+ 'pswp_share',
+ 'scrollbars=yes,resizable=yes,toolbar=no,' +
+ 'location=yes,width=550,height=420,top=100,left=' +
+ (window.screen
+ ? Math.round(screen.width / 2 - 275)
+ : 100)
+ );
+
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ return false;
+ },
+ _updateShareURLs = function () {
+ var shareButtonOut = '',
+ shareButtonData,
+ shareURL,
+ image_url,
+ page_url,
+ share_text;
+
+ for (var i = 0; i < _options.shareButtons.length; i++) {
+ shareButtonData = _options.shareButtons[i];
+
+ image_url = _options.getImageURLForShare(shareButtonData);
+ page_url = _options.getPageURLForShare(shareButtonData);
+ share_text = _options.getTextForShare(shareButtonData);
+
+ shareURL = shareButtonData.url
+ .replace('{{url}}', encodeURIComponent(page_url))
+ .replace('{{image_url}}', encodeURIComponent(image_url))
+ .replace('{{raw_image_url}}', image_url)
+ .replace('{{text}}', encodeURIComponent(share_text));
+
+ shareButtonOut +=
+ '' +
+ shareButtonData.label +
+ ' ';
+
+ if (_options.parseShareButtonOut) {
+ shareButtonOut = _options.parseShareButtonOut(
+ shareButtonData,
+ shareButtonOut
+ );
+ }
+ }
+ _shareModal.children[0].innerHTML = shareButtonOut;
+ _shareModal.children[0].onclick = _openWindowPopup;
+ },
+ _hasCloseClass = function (target) {
+ for (var i = 0; i < _options.closeElClasses.length; i++) {
+ if (
+ framework.hasClass(
+ target,
+ 'pswp__' + _options.closeElClasses[i]
+ )
+ ) {
+ return true;
+ }
+ }
+ },
+ _idleInterval,
+ _idleTimer,
+ _idleIncrement = 0,
+ _onIdleMouseMove = function () {
+ clearTimeout(_idleTimer);
+ _idleIncrement = 0;
+ if (_isIdle) {
+ ui.setIdle(false);
+ }
+ },
+ _onMouseLeaveWindow = function (e) {
+ e = e ? e : window.event;
+ var from = e.relatedTarget || e.toElement;
+ if (!from || from.nodeName === 'HTML') {
+ clearTimeout(_idleTimer);
+ _idleTimer = setTimeout(function () {
+ ui.setIdle(true);
+ }, _options.timeToIdleOutside);
+ }
+ },
+ _setupFullscreenAPI = function () {
+ if (_options.fullscreenEl && !framework.features.isOldAndroid) {
+ if (!_fullscrenAPI) {
+ _fullscrenAPI = ui.getFullscreenAPI();
+ }
+ if (_fullscrenAPI) {
+ framework.bind(
+ document,
+ _fullscrenAPI.eventK,
+ ui.updateFullscreen
+ );
+ ui.updateFullscreen();
+ framework.addClass(pswp.template, 'pswp--supports-fs');
+ } else {
+ framework.removeClass(
+ pswp.template,
+ 'pswp--supports-fs'
+ );
+ }
+ }
+ },
+ _setupLoadingIndicator = function () {
+ // Setup loading indicator
+ if (_options.preloaderEl) {
+ _toggleLoadingIndicator(true);
+
+ _listen('beforeChange', function () {
+ clearTimeout(_loadingIndicatorTimeout);
+
+ // display loading indicator with delay
+ _loadingIndicatorTimeout = setTimeout(function () {
+ if (pswp.currItem && pswp.currItem.loading) {
+ if (
+ !pswp.allowProgressiveImg() ||
+ (pswp.currItem.img &&
+ !pswp.currItem.img.naturalWidth)
+ ) {
+ // show preloader if progressive loading is not enabled,
+ // or image width is not defined yet (because of slow connection)
+ _toggleLoadingIndicator(false);
+ // items-controller.js function allowProgressiveImg
+ }
+ } else {
+ _toggleLoadingIndicator(true); // hide preloader
+ }
+ }, _options.loadingIndicatorDelay);
+ });
+ _listen('imageLoadComplete', function (index, item) {
+ if (pswp.currItem === item) {
+ _toggleLoadingIndicator(true);
+ }
+ });
+ }
+ },
+ _toggleLoadingIndicator = function (hide) {
+ if (_loadingIndicatorHidden !== hide) {
+ _togglePswpClass(
+ _loadingIndicator,
+ 'preloader--active',
+ !hide
+ );
+ _loadingIndicatorHidden = hide;
+ }
+ },
+ _applyNavBarGaps = function (item) {
+ var gap = item.vGap;
+
+ if (_fitControlsInViewport()) {
+ var bars = _options.barsSize;
+ if (_options.captionEl && bars.bottom === 'auto') {
+ if (!_fakeCaptionContainer) {
+ _fakeCaptionContainer = framework.createEl(
+ 'pswp__caption pswp__caption--fake'
+ );
+ _fakeCaptionContainer.appendChild(
+ framework.createEl('pswp__caption__center')
+ );
+ _controls.insertBefore(
+ _fakeCaptionContainer,
+ _captionContainer
+ );
+ framework.addClass(_controls, 'pswp__ui--fit');
+ }
+ if (
+ _options.addCaptionHTMLFn(
+ item,
+ _fakeCaptionContainer,
+ true
+ )
+ ) {
+ var captionSize =
+ _fakeCaptionContainer.clientHeight;
+ gap.bottom = parseInt(captionSize, 10) || 44;
+ } else {
+ gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top
+ }
+ } else {
+ gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;
+ }
+
+ // height of top bar is static, no need to calculate it
+ gap.top = bars.top;
+ } else {
+ gap.top = gap.bottom = 0;
+ }
+ },
+ _setupIdle = function () {
+ // Hide controls when mouse is used
+ if (_options.timeToIdle) {
+ _listen('mouseUsed', function () {
+ framework.bind(document, 'mousemove', _onIdleMouseMove);
+ framework.bind(
+ document,
+ 'mouseout',
+ _onMouseLeaveWindow
+ );
+
+ _idleInterval = setInterval(function () {
+ _idleIncrement++;
+ if (_idleIncrement === 2) {
+ ui.setIdle(true);
+ }
+ }, _options.timeToIdle / 2);
+ });
+ }
+ },
+ _setupHidingControlsDuringGestures = function () {
+ // Hide controls on vertical drag
+ _listen('onVerticalDrag', function (now) {
+ if (_controlsVisible && now < 0.95) {
+ ui.hideControls();
+ } else if (!_controlsVisible && now >= 0.95) {
+ ui.showControls();
+ }
+ });
+
+ // Hide controls when pinching to close
+ var pinchControlsHidden;
+ _listen('onPinchClose', function (now) {
+ if (_controlsVisible && now < 0.9) {
+ ui.hideControls();
+ pinchControlsHidden = true;
+ } else if (
+ pinchControlsHidden &&
+ !_controlsVisible &&
+ now > 0.9
+ ) {
+ ui.showControls();
+ }
+ });
+
+ _listen('zoomGestureEnded', function () {
+ pinchControlsHidden = false;
+ if (pinchControlsHidden && !_controlsVisible) {
+ ui.showControls();
+ }
+ });
+ };
+
+ var _uiElements = [
+ {
+ name: 'caption',
+ option: 'captionEl',
+ onInit: function (el) {
+ _captionContainer = el;
+ },
+ },
+ {
+ name: 'share-modal',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareModal = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ },
+ },
+ {
+ name: 'button--share',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareButton = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ },
+ },
+ {
+ name: 'button--zoom',
+ option: 'zoomEl',
+ onTap: pswp.toggleDesktopZoom,
+ },
+ {
+ name: 'counter',
+ option: 'counterEl',
+ onInit: function (el) {
+ _indexIndicator = el;
+ },
+ },
+ {
+ name: 'button--close',
+ option: 'closeEl',
+ onTap: pswp.close,
+ },
+ {
+ name: 'button--arrow--left',
+ option: 'arrowEl',
+ onTap: pswp.prev,
+ },
+ {
+ name: 'button--arrow--right',
+ option: 'arrowEl',
+ onTap: pswp.next,
+ },
+ {
+ name: 'button--fs',
+ option: 'fullscreenEl',
+ onTap: function () {
+ if (_fullscrenAPI.isFullscreen()) {
+ _fullscrenAPI.exit();
+ } else {
+ _fullscrenAPI.enter();
+ }
+ },
+ },
+ {
+ name: 'preloader',
+ option: 'preloaderEl',
+ onInit: function (el) {
+ _loadingIndicator = el;
+ },
+ },
+ ];
+
+ var _setupUIElements = function () {
+ var item, classAttr, uiElement;
+
+ var loopThroughChildElements = function (sChildren) {
+ if (!sChildren) {
+ return;
+ }
+
+ var l = sChildren.length;
+ for (var i = 0; i < l; i++) {
+ item = sChildren[i];
+ classAttr = item.className;
+
+ for (var a = 0; a < _uiElements.length; a++) {
+ uiElement = _uiElements[a];
+
+ if (classAttr.indexOf('pswp__' + uiElement.name) > -1) {
+ if (_options[uiElement.option]) {
+ // if element is not disabled from options
+
+ framework.removeClass(
+ item,
+ 'pswp__element--disabled'
+ );
+ if (uiElement.onInit) {
+ uiElement.onInit(item);
+ }
+
+ //item.style.display = 'block';
+ } else {
+ framework.addClass(
+ item,
+ 'pswp__element--disabled'
+ );
+ //item.style.display = 'none';
+ }
+ }
+ }
+ }
+ };
+ loopThroughChildElements(_controls.children);
+
+ var topBar = framework.getChildByClass(_controls, 'pswp__top-bar');
+ if (topBar) {
+ loopThroughChildElements(topBar.children);
+ }
+ };
+
+ ui.init = function () {
+ // extend options
+ framework.extend(pswp.options, _defaultUIOptions, true);
+
+ // create local link for fast access
+ _options = pswp.options;
+
+ // find pswp__ui element
+ _controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
+
+ // create local link
+ _listen = pswp.listen;
+
+ _setupHidingControlsDuringGestures();
+
+ // update controls when slides change
+ _listen('beforeChange', ui.update);
+
+ // toggle zoom on double-tap
+ _listen('doubleTap', function (point) {
+ var initialZoomLevel = pswp.currItem.initialZoomLevel;
+ if (pswp.getZoomLevel() !== initialZoomLevel) {
+ pswp.zoomTo(initialZoomLevel, point, 333);
+ } else {
+ pswp.zoomTo(
+ _options.getDoubleTapZoom(false, pswp.currItem),
+ point,
+ 333
+ );
+ }
+ });
+
+ // Allow text selection in caption
+ _listen('preventDragEvent', function (e, isDown, preventObj) {
+ var t = e.target || e.srcElement;
+ if (
+ t &&
+ t.getAttribute('class') &&
+ e.type.indexOf('mouse') > -1 &&
+ (t.getAttribute('class').indexOf('__caption') > 0 ||
+ /(SMALL|STRONG|EM)/i.test(t.tagName))
+ ) {
+ preventObj.prevent = false;
+ }
+ });
+
+ // bind events for UI
+ _listen('bindEvents', function () {
+ framework.bind(_controls, 'pswpTap click', _onControlsTap);
+ framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+
+ if (!pswp.likelyTouchDevice) {
+ framework.bind(
+ pswp.scrollWrap,
+ 'mouseover',
+ ui.onMouseOver
+ );
+ }
+ });
+
+ // unbind events for UI
+ _listen('unbindEvents', function () {
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ if (_idleInterval) {
+ clearInterval(_idleInterval);
+ }
+ framework.unbind(document, 'mouseout', _onMouseLeaveWindow);
+ framework.unbind(document, 'mousemove', _onIdleMouseMove);
+ framework.unbind(_controls, 'pswpTap click', _onControlsTap);
+ framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+ framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
+
+ if (_fullscrenAPI) {
+ framework.unbind(
+ document,
+ _fullscrenAPI.eventK,
+ ui.updateFullscreen
+ );
+ if (_fullscrenAPI.isFullscreen()) {
+ _options.hideAnimationDuration = 0;
+ _fullscrenAPI.exit();
+ }
+ _fullscrenAPI = null;
+ }
+ });
+
+ // clean up things when gallery is destroyed
+ _listen('destroy', function () {
+ if (_options.captionEl) {
+ if (_fakeCaptionContainer) {
+ _controls.removeChild(_fakeCaptionContainer);
+ }
+ framework.removeClass(
+ _captionContainer,
+ 'pswp__caption--empty'
+ );
+ }
+
+ if (_shareModal) {
+ _shareModal.children[0].onclick = null;
+ }
+ framework.removeClass(_controls, 'pswp__ui--over-close');
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ ui.setIdle(false);
+ });
+
+ if (!_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ _listen('initialZoomIn', function () {
+ if (_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ });
+ _listen('initialZoomOut', function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ });
+
+ _listen('parseVerticalMargin', _applyNavBarGaps);
+
+ _setupUIElements();
+
+ if (_options.shareEl && _shareButton && _shareModal) {
+ _shareModalHidden = true;
+ }
+
+ _countNumItems();
+
+ _setupIdle();
+
+ _setupFullscreenAPI();
+
+ _setupLoadingIndicator();
+ };
+
+ ui.setIdle = function (isIdle) {
+ _isIdle = isIdle;
+ _togglePswpClass(_controls, 'ui--idle', isIdle);
+ };
+
+ ui.update = function () {
+ // Don't update UI if it's hidden
+ if (_controlsVisible && pswp.currItem) {
+ ui.updateIndexIndicator();
+
+ if (_options.captionEl) {
+ _options.addCaptionHTMLFn(pswp.currItem, _captionContainer);
+
+ _togglePswpClass(
+ _captionContainer,
+ 'caption--empty',
+ !pswp.currItem.title
+ );
+ }
+
+ _overlayUIUpdated = true;
+ } else {
+ _overlayUIUpdated = false;
+ }
+
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ _countNumItems();
+ };
+
+ ui.updateFullscreen = function (e) {
+ if (e) {
+ // some browsers change window scroll position during the fullscreen
+ // so PhotoSwipe updates it just in case
+ setTimeout(function () {
+ pswp.setScrollOffset(0, framework.getScrollY());
+ }, 50);
+ }
+
+ // toogle pswp--fs class on root element
+ framework[
+ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class'
+ ](pswp.template, 'pswp--fs');
+ };
+
+ ui.updateIndexIndicator = function () {
+ if (_options.counterEl) {
+ _indexIndicator.innerHTML =
+ pswp.getCurrentIndex() +
+ 1 +
+ _options.indexIndicatorSep +
+ _options.getNumItemsFn();
+ }
+ };
+
+ ui.onGlobalTap = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ if (_blockControlsTap) {
+ return;
+ }
+
+ if (e.detail && e.detail.pointerType === 'mouse') {
+ // close gallery if clicked outside of the image
+ if (_hasCloseClass(target)) {
+ pswp.close();
+ return;
+ }
+
+ if (framework.hasClass(target, 'pswp__img')) {
+ if (
+ pswp.getZoomLevel() === 1 &&
+ pswp.getZoomLevel() <= pswp.currItem.fitRatio
+ ) {
+ if (_options.clickToCloseNonZoomable) {
+ pswp.close();
+ }
+ } else {
+ pswp.toggleDesktopZoom(e.detail.releasePoint);
+ }
+ }
+ } else {
+ // tap anywhere (except buttons) to toggle visibility of controls
+ if (_options.tapToToggleControls) {
+ if (_controlsVisible) {
+ ui.hideControls();
+ } else {
+ ui.showControls();
+ }
+ }
+
+ // tap to close gallery
+ if (
+ _options.tapToClose &&
+ (framework.hasClass(target, 'pswp__img') ||
+ _hasCloseClass(target))
+ ) {
+ pswp.close();
+ return;
+ }
+ }
+ };
+ ui.onMouseOver = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ // add class when mouse is over an element that should close the gallery
+ _togglePswpClass(
+ _controls,
+ 'ui--over-close',
+ _hasCloseClass(target)
+ );
+ };
+
+ ui.hideControls = function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ _controlsVisible = false;
+ };
+
+ ui.showControls = function () {
+ _controlsVisible = true;
+ if (!_overlayUIUpdated) {
+ ui.update();
+ }
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ };
+
+ ui.supportsFullscreen = function () {
+ var d = document;
+ return !!(
+ d.exitFullscreen ||
+ d.mozCancelFullScreen ||
+ d.webkitExitFullscreen ||
+ d.msExitFullscreen
+ );
+ };
+
+ ui.getFullscreenAPI = function () {
+ var dE = document.documentElement,
+ api,
+ tF = 'fullscreenchange';
+
+ if (dE.requestFullscreen) {
+ api = {
+ enterK: 'requestFullscreen',
+ exitK: 'exitFullscreen',
+ elementK: 'fullscreenElement',
+ eventK: tF,
+ };
+ } else if (dE.mozRequestFullScreen) {
+ api = {
+ enterK: 'mozRequestFullScreen',
+ exitK: 'mozCancelFullScreen',
+ elementK: 'mozFullScreenElement',
+ eventK: 'moz' + tF,
+ };
+ } else if (dE.webkitRequestFullscreen) {
+ api = {
+ enterK: 'webkitRequestFullscreen',
+ exitK: 'webkitExitFullscreen',
+ elementK: 'webkitFullscreenElement',
+ eventK: 'webkit' + tF,
+ };
+ } else if (dE.msRequestFullscreen) {
+ api = {
+ enterK: 'msRequestFullscreen',
+ exitK: 'msExitFullscreen',
+ elementK: 'msFullscreenElement',
+ eventK: 'MSFullscreenChange',
+ };
+ }
+
+ if (api) {
+ api.enter = function () {
+ // disable close-on-scroll in fullscreen
+ _initalCloseOnScrollValue = _options.closeOnScroll;
+ _options.closeOnScroll = false;
+
+ if (this.enterK === 'webkitRequestFullscreen') {
+ pswp.template[this.enterK](
+ Element.ALLOW_KEYBOARD_INPUT
+ );
+ } else {
+ return pswp.template[this.enterK]();
+ }
+ };
+ api.exit = function () {
+ _options.closeOnScroll = _initalCloseOnScrollValue;
+
+ return document[this.exitK]();
+ };
+ api.isFullscreen = function () {
+ return document[this.elementK];
+ };
+ }
+
+ return api;
+ };
+ };
+ return PhotoSwipeUI_Default;
+});
diff --git a/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.min.js b/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.min.js
new file mode 100644
index 000000000..ab7bedc76
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/photoswipe-ui-default.min.js
@@ -0,0 +1,4 @@
+/*! PhotoSwipe Default UI - 4.1.3 - 2019-01-08
+* http://photoswipe.com
+* Copyright (c) 2019 Dmitry Semenov; */
+!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipeUI_Default=b()}(this,function(){"use strict";var a=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v=this,w=!1,x=!0,y=!0,z={barsSize:{top:44,bottom:"auto"},closeElClasses:["item","caption","zoom-wrap","ui","top-bar"],timeToIdle:4e3,timeToIdleOutside:1e3,loadingIndicatorDelay:1e3,addCaptionHTMLFn:function(a,b){return a.title?(b.children[0].innerHTML=a.title,!0):(b.children[0].innerHTML="",!1)},closeEl:!0,captionEl:!0,fullscreenEl:!0,zoomEl:!0,shareEl:!0,counterEl:!0,arrowEl:!0,preloaderEl:!0,tapToClose:!1,tapToToggleControls:!0,clickToCloseNonZoomable:!0,shareButtons:[{id:"facebook",label:"Share on Facebook",url:"https://www.facebook.com/sharer/sharer.php?u={{url}}"},{id:"twitter",label:"Tweet",url:"https://twitter.com/intent/tweet?text={{text}}&url={{url}}"},{id:"pinterest",label:"Pin it",url:"http://www.pinterest.com/pin/create/button/?url={{url}}&media={{image_url}}&description={{text}}"},{id:"download",label:"Download image",url:"{{raw_image_url}}",download:!0}],getImageURLForShare:function(){return a.currItem.src||""},getPageURLForShare:function(){return window.location.href},getTextForShare:function(){return a.currItem.title||""},indexIndicatorSep:" / ",fitControlsWidth:1200},A=function(a){if(r)return!0;a=a||window.event,q.timeToIdle&&q.mouseUsed&&!k&&K();for(var c,d,e=a.target||a.srcElement,f=e.getAttribute("class")||"",g=0;g-1&&(c.onTap(),d=!0);if(d){a.stopPropagation&&a.stopPropagation(),r=!0;var h=b.features.isOldAndroid?600:30;s=setTimeout(function(){r=!1},h)}},B=function(){return!a.likelyTouchDevice||q.mouseUsed||screen.width>q.fitControlsWidth},C=function(a,c,d){b[(d?"add":"remove")+"Class"](a,"pswp__"+c)},D=function(){var a=1===q.getNumItemsFn();a!==p&&(C(d,"ui--one-slide",a),p=a)},E=function(){C(i,"share-modal--hidden",y)},F=function(){return y=!y,y?(b.removeClass(i,"pswp__share-modal--fade-in"),setTimeout(function(){y&&E()},300)):(E(),setTimeout(function(){y||b.addClass(i,"pswp__share-modal--fade-in")},30)),y||H(),!1},G=function(b){b=b||window.event;var c=b.target||b.srcElement;return a.shout("shareLinkClick",b,c),!!c.href&&(!!c.hasAttribute("download")||(window.open(c.href,"pswp_share","scrollbars=yes,resizable=yes,toolbar=no,location=yes,width=550,height=420,top=100,left="+(window.screen?Math.round(screen.width/2-275):100)),y||F(),!1))},H=function(){for(var a,b,c,d,e,f="",g=0;g"+a.label+"",q.parseShareButtonOut&&(f=q.parseShareButtonOut(a,f));i.children[0].innerHTML=f,i.children[0].onclick=G},I=function(a){for(var c=0;c=.95&&v.showControls()});var a;l("onPinchClose",function(b){x&&b<.9?(v.hideControls(),a=!0):a&&!x&&b>.9&&v.showControls()}),l("zoomGestureEnded",function(){a=!1,a&&!x&&v.showControls()})},S=[{name:"caption",option:"captionEl",onInit:function(a){e=a}},{name:"share-modal",option:"shareEl",onInit:function(a){i=a},onTap:function(){F()}},{name:"button--share",option:"shareEl",onInit:function(a){h=a},onTap:function(){F()}},{name:"button--zoom",option:"zoomEl",onTap:a.toggleDesktopZoom},{name:"counter",option:"counterEl",onInit:function(a){g=a}},{name:"button--close",option:"closeEl",onTap:a.close},{name:"button--arrow--left",option:"arrowEl",onTap:a.prev},{name:"button--arrow--right",option:"arrowEl",onTap:a.next},{name:"button--fs",option:"fullscreenEl",onTap:function(){c.isFullscreen()?c.exit():c.enter()}},{name:"preloader",option:"preloaderEl",onInit:function(a){m=a}}],T=function(){var a,c,e,f=function(d){if(d)for(var f=d.length,g=0;g-1&&(q[e.option]?(b.removeClass(a,"pswp__element--disabled"),e.onInit&&e.onInit(a)):b.addClass(a,"pswp__element--disabled"))}};f(d.children);var g=b.getChildByClass(d,"pswp__top-bar");g&&f(g.children)};v.init=function(){b.extend(a.options,z,!0),q=a.options,d=b.getChildByClass(a.scrollWrap,"pswp__ui"),l=a.listen,R(),l("beforeChange",v.update),l("doubleTap",function(b){var c=a.currItem.initialZoomLevel;a.getZoomLevel()!==c?a.zoomTo(c,b,333):a.zoomTo(q.getDoubleTapZoom(!1,a.currItem),b,333)}),l("preventDragEvent",function(a,b,c){var d=a.target||a.srcElement;d&&d.getAttribute("class")&&a.type.indexOf("mouse")>-1&&(d.getAttribute("class").indexOf("__caption")>0||/(SMALL|STRONG|EM)/i.test(d.tagName))&&(c.prevent=!1)}),l("bindEvents",function(){b.bind(d,"pswpTap click",A),b.bind(a.scrollWrap,"pswpTap",v.onGlobalTap),a.likelyTouchDevice||b.bind(a.scrollWrap,"mouseover",v.onMouseOver)}),l("unbindEvents",function(){y||F(),t&&clearInterval(t),b.unbind(document,"mouseout",L),b.unbind(document,"mousemove",K),b.unbind(d,"pswpTap click",A),b.unbind(a.scrollWrap,"pswpTap",v.onGlobalTap),b.unbind(a.scrollWrap,"mouseover",v.onMouseOver),c&&(b.unbind(document,c.eventK,v.updateFullscreen),c.isFullscreen()&&(q.hideAnimationDuration=0,c.exit()),c=null)}),l("destroy",function(){q.captionEl&&(f&&d.removeChild(f),b.removeClass(e,"pswp__caption--empty")),i&&(i.children[0].onclick=null),b.removeClass(d,"pswp__ui--over-close"),b.addClass(d,"pswp__ui--hidden"),v.setIdle(!1)}),q.showAnimationDuration||b.removeClass(d,"pswp__ui--hidden"),l("initialZoomIn",function(){q.showAnimationDuration&&b.removeClass(d,"pswp__ui--hidden")}),l("initialZoomOut",function(){b.addClass(d,"pswp__ui--hidden")}),l("parseVerticalMargin",P),T(),q.shareEl&&h&&i&&(y=!0),D(),Q(),M(),N()},v.setIdle=function(a){k=a,C(d,"ui--idle",a)},v.update=function(){x&&a.currItem?(v.updateIndexIndicator(),q.captionEl&&(q.addCaptionHTMLFn(a.currItem,e),C(e,"caption--empty",!a.currItem.title)),w=!0):w=!1,y||F(),D()},v.updateFullscreen=function(d){d&&setTimeout(function(){a.setScrollOffset(0,b.getScrollY())},50),b[(c.isFullscreen()?"add":"remove")+"Class"](a.template,"pswp--fs")},v.updateIndexIndicator=function(){q.counterEl&&(g.innerHTML=a.getCurrentIndex()+1+q.indexIndicatorSep+q.getNumItemsFn())},v.onGlobalTap=function(c){c=c||window.event;var d=c.target||c.srcElement;if(!r)if(c.detail&&"mouse"===c.detail.pointerType){if(I(d))return void a.close();b.hasClass(d,"pswp__img")&&(1===a.getZoomLevel()&&a.getZoomLevel()<=a.currItem.fitRatio?q.clickToCloseNonZoomable&&a.close():a.toggleDesktopZoom(c.detail.releasePoint))}else if(q.tapToToggleControls&&(x?v.hideControls():v.showControls()),q.tapToClose&&(b.hasClass(d,"pswp__img")||I(d)))return void a.close()},v.onMouseOver=function(a){a=a||window.event;var b=a.target||a.srcElement;C(d,"ui--over-close",I(b))},v.hideControls=function(){b.addClass(d,"pswp__ui--hidden"),x=!1},v.showControls=function(){x=!0,w||v.update(),b.removeClass(d,"pswp__ui--hidden")},v.supportsFullscreen=function(){var a=document;return!!(a.exitFullscreen||a.mozCancelFullScreen||a.webkitExitFullscreen||a.msExitFullscreen)},v.getFullscreenAPI=function(){var b,c=document.documentElement,d="fullscreenchange";return c.requestFullscreen?b={enterK:"requestFullscreen",exitK:"exitFullscreen",elementK:"fullscreenElement",eventK:d}:c.mozRequestFullScreen?b={enterK:"mozRequestFullScreen",exitK:"mozCancelFullScreen",elementK:"mozFullScreenElement",eventK:"moz"+d}:c.webkitRequestFullscreen?b={enterK:"webkitRequestFullscreen",exitK:"webkitExitFullscreen",elementK:"webkitFullscreenElement",eventK:"webkit"+d}:c.msRequestFullscreen&&(b={enterK:"msRequestFullscreen",exitK:"msExitFullscreen",elementK:"msFullscreenElement",eventK:"MSFullscreenChange"}),b&&(b.enter=function(){return j=q.closeOnScroll,q.closeOnScroll=!1,"webkitRequestFullscreen"!==this.enterK?a.template[this.enterK]():void a.template[this.enterK](Element.ALLOW_KEYBOARD_INPUT)},b.exit=function(){return q.closeOnScroll=j,document[this.exitK]()},b.isFullscreen=function(){return document[this.elementK]}),b}};return a});
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/photoswipe.css b/apps/photos/thirdparty/photoswipe/dist/photoswipe.css
new file mode 100644
index 000000000..e8efa40ec
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/photoswipe.css
@@ -0,0 +1 @@
+.pswp{display:none;position:absolute;width:100%;height:100%;left:0;top:0;overflow:hidden;-ms-touch-action:none;touch-action:none;z-index:1500;-webkit-text-size-adjust:100%;-webkit-backface-visibility:hidden;outline:none}.pswp *{-webkit-box-sizing:border-box;box-sizing:border-box}.pswp img{max-width:none}.pswp--animate_opacity{opacity:.001;will-change:opacity;-webkit-transition:opacity 333ms cubic-bezier(.4,0,.22,1);transition:opacity 333ms cubic-bezier(.4,0,.22,1)}.pswp--open{display:block}.pswp--zoom-allowed .pswp__img{cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.pswp--zoomed-in .pswp__img{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.pswp--dragging .pswp__img{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.pswp__bg{background:#000;opacity:0;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden}.pswp__bg,.pswp__scroll-wrap{position:absolute;left:0;top:0;width:100%;height:100%}.pswp__scroll-wrap{overflow:hidden}.pswp__container,.pswp__zoom-wrap{-ms-touch-action:none;touch-action:none;position:absolute;left:0;right:0;top:0;bottom:0}.pswp__container,.pswp__img{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.pswp__zoom-wrap{position:absolute;width:100%;-webkit-transform-origin:left top;transform-origin:left top;-webkit-transition:-webkit-transform 333ms cubic-bezier(.4,0,.22,1);transition:-webkit-transform 333ms cubic-bezier(.4,0,.22,1);transition:transform 333ms cubic-bezier(.4,0,.22,1);transition:transform 333ms cubic-bezier(.4,0,.22,1),-webkit-transform 333ms cubic-bezier(.4,0,.22,1)}.pswp__bg{will-change:opacity;-webkit-transition:opacity 333ms cubic-bezier(.4,0,.22,1);transition:opacity 333ms cubic-bezier(.4,0,.22,1)}.pswp--animated-in .pswp__bg,.pswp--animated-in .pswp__zoom-wrap{-webkit-transition:none;transition:none}.pswp__container,.pswp__zoom-wrap{-webkit-backface-visibility:hidden}.pswp__item{right:0;bottom:0;overflow:hidden}.pswp__img,.pswp__item{position:absolute;left:0;top:0}.pswp__img{width:auto;height:auto}.pswp__img--placeholder{-webkit-backface-visibility:hidden}.pswp__img--placeholder--blank{background:#222}.pswp--ie .pswp__img{width:100%!important;height:auto!important;left:0;top:0}.pswp__error-msg{position:absolute;left:0;top:50%;width:100%;text-align:center;font-size:14px;line-height:16px;margin-top:-8px;color:#ccc}.pswp__error-msg a{color:#ccc;text-decoration:underline}.pswp__button{width:44px;height:44px;position:relative;background:none;cursor:pointer;overflow:visible;-webkit-appearance:none;display:block;border:0;padding:0;margin:0;float:right;opacity:.75;-webkit-transition:opacity .2s;transition:opacity .2s;-webkit-box-shadow:none;box-shadow:none}.pswp__button:focus,.pswp__button:hover{opacity:1}.pswp__button:active{outline:none;opacity:.9}.pswp__button::-moz-focus-inner{padding:0;border:0}.pswp__ui--over-close .pswp__button--close{opacity:1}.pswp__button,.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{background:url(default-skin.png) 0 0 no-repeat;background-size:264px 88px;width:44px;height:44px}@media (-webkit-min-device-pixel-ratio:1.1),(-webkit-min-device-pixel-ratio:1.09375),(min-resolution:1.1dppx),(min-resolution:105dpi){.pswp--svg .pswp__button,.pswp--svg .pswp__button--arrow--left:before,.pswp--svg .pswp__button--arrow--right:before{background-image:url(default-skin.svg)}.pswp--svg .pswp__button--arrow--left,.pswp--svg .pswp__button--arrow--right{background:none}}.pswp__button--close{background-position:0 -44px}.pswp__button--share{background-position:-44px -44px}.pswp__button--fs{display:none}.pswp--supports-fs .pswp__button--fs{display:block}.pswp--fs .pswp__button--fs{background-position:-44px 0}.pswp__button--zoom{display:none;background-position:-88px 0}.pswp--zoom-allowed .pswp__button--zoom{display:block}.pswp--zoomed-in .pswp__button--zoom{background-position:-132px 0}.pswp--touch .pswp__button--arrow--left,.pswp--touch .pswp__button--arrow--right{visibility:hidden}.pswp__button--arrow--left,.pswp__button--arrow--right{background:none;top:50%;margin-top:-50px;width:70px;height:100px;position:absolute}.pswp__button--arrow--left{left:0}.pswp__button--arrow--right{right:0}.pswp__button--arrow--left:before,.pswp__button--arrow--right:before{content:"";top:35px;background-color:rgba(0,0,0,.3);height:30px;width:32px;position:absolute}.pswp__button--arrow--left:before{left:6px;background-position:-138px -44px}.pswp__button--arrow--right:before{right:6px;background-position:-94px -44px}.pswp__counter,.pswp__share-modal{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pswp__share-modal{display:block;background:rgba(0,0,0,.5);width:100%;height:100%;top:0;left:0;padding:10px;position:absolute;z-index:1600;opacity:0;-webkit-transition:opacity .25s ease-out;transition:opacity .25s ease-out;-webkit-backface-visibility:hidden;will-change:opacity}.pswp__share-modal--hidden{display:none}.pswp__share-tooltip{z-index:1620;position:absolute;background:#fff;top:56px;border-radius:2px;display:block;width:auto;right:44px;-webkit-box-shadow:0 2px 5px rgba(0,0,0,.25);box-shadow:0 2px 5px rgba(0,0,0,.25);-webkit-transform:translateY(6px);transform:translateY(6px);-webkit-transition:-webkit-transform .25s;transition:-webkit-transform .25s;transition:transform .25s;transition:transform .25s,-webkit-transform .25s;-webkit-backface-visibility:hidden;will-change:transform}.pswp__share-tooltip a{display:block;padding:8px 12px;font-size:14px;line-height:18px}.pswp__share-tooltip a,.pswp__share-tooltip a:hover{color:#000;text-decoration:none}.pswp__share-tooltip a:first-child{border-radius:2px 2px 0 0}.pswp__share-tooltip a:last-child{border-radius:0 0 2px 2px}.pswp__share-modal--fade-in{opacity:1}.pswp__share-modal--fade-in .pswp__share-tooltip{-webkit-transform:translateY(0);transform:translateY(0)}.pswp--touch .pswp__share-tooltip a{padding:16px 12px}a.pswp__share--facebook:before{content:"";display:block;width:0;height:0;position:absolute;top:-12px;right:15px;border:6px solid transparent;border-bottom-color:#fff;-webkit-pointer-events:none;-moz-pointer-events:none;pointer-events:none}a.pswp__share--facebook:hover{background:#3e5c9a;color:#fff}a.pswp__share--facebook:hover:before{border-bottom-color:#3e5c9a}a.pswp__share--twitter:hover{background:#55acee;color:#fff}a.pswp__share--pinterest:hover{background:#ccc;color:#ce272d}a.pswp__share--download:hover{background:#ddd}.pswp__counter{position:absolute;left:0;top:0;height:44px;font-size:13px;line-height:44px;color:#fff;opacity:.75;padding:0 10px}.pswp__caption{position:absolute;left:0;bottom:0;width:100%;min-height:44px}.pswp__caption small{font-size:11px;color:#bbb}.pswp__caption__center{text-align:left;max-width:420px;margin:0 auto;font-size:13px;padding:10px;line-height:20px;color:#ccc}.pswp__caption--empty{display:none}.pswp__caption--fake{visibility:hidden}.pswp__preloader{width:44px;height:44px;position:absolute;top:0;left:50%;margin-left:-22px;opacity:0;-webkit-transition:opacity .25s ease-out;transition:opacity .25s ease-out;will-change:opacity;direction:ltr}.pswp__preloader__icn{width:20px;height:20px;margin:12px}.pswp__preloader--active{opacity:1}.pswp__preloader--active .pswp__preloader__icn{background:url(preloader.gif) 0 0 no-repeat}.pswp--css_animation .pswp__preloader--active{opacity:1}.pswp--css_animation .pswp__preloader--active .pswp__preloader__icn{-webkit-animation:clockwise .5s linear infinite;animation:clockwise .5s linear infinite}.pswp--css_animation .pswp__preloader--active .pswp__preloader__donut{-webkit-animation:donut-rotate 1s cubic-bezier(.4,0,.22,1) infinite;animation:donut-rotate 1s cubic-bezier(.4,0,.22,1) infinite}.pswp--css_animation .pswp__preloader__icn{background:none;opacity:.75;width:14px;height:14px;position:absolute;left:15px;top:15px;margin:0}.pswp--css_animation .pswp__preloader__cut{position:relative;width:7px;height:14px;overflow:hidden}.pswp--css_animation .pswp__preloader__donut{-webkit-box-sizing:border-box;box-sizing:border-box;width:14px;height:14px;border:2px solid #fff;border-radius:50%;border-left-color:transparent;border-bottom-color:transparent;position:absolute;top:0;left:0;background:none;margin:0}@media screen and (max-width:1024px){.pswp__preloader{position:relative;left:auto;top:auto;margin:0;float:right}}@-webkit-keyframes clockwise{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes clockwise{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes donut-rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(-140deg);transform:rotate(-140deg)}to{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes donut-rotate{0%{-webkit-transform:rotate(0);transform:rotate(0)}50%{-webkit-transform:rotate(-140deg);transform:rotate(-140deg)}to{-webkit-transform:rotate(0);transform:rotate(0)}}.pswp__ui{-webkit-font-smoothing:auto;visibility:visible;opacity:1;z-index:1550}.pswp__top-bar{position:absolute;left:0;top:0;height:44px;width:100%}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right,.pswp__caption,.pswp__top-bar{-webkit-backface-visibility:hidden;will-change:opacity;-webkit-transition:opacity 333ms cubic-bezier(.4,0,.22,1);transition:opacity 333ms cubic-bezier(.4,0,.22,1)}.pswp--has_mouse .pswp__button--arrow--left,.pswp--has_mouse .pswp__button--arrow--right{visibility:visible}.pswp__caption,.pswp__top-bar{background-color:rgba(0,0,0,.5)}.pswp__ui--fit .pswp__caption,.pswp__ui--fit .pswp__top-bar{background-color:rgba(0,0,0,.3)}.pswp__ui--idle .pswp__button--arrow--left,.pswp__ui--idle .pswp__button--arrow--right,.pswp__ui--idle .pswp__top-bar{opacity:0}.pswp__ui--hidden .pswp__button--arrow--left,.pswp__ui--hidden .pswp__button--arrow--right,.pswp__ui--hidden .pswp__caption,.pswp__ui--hidden .pswp__top-bar{opacity:.001}.pswp__ui--one-slide .pswp__button--arrow--left,.pswp__ui--one-slide .pswp__button--arrow--right,.pswp__ui--one-slide .pswp__counter{display:none}.pswp__element--disabled{display:none!important}.pswp--minimal--dark .pswp__top-bar{background:none}
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/photoswipe.js b/apps/photos/thirdparty/photoswipe/dist/photoswipe.js
new file mode 100644
index 000000000..0d6fde1de
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/photoswipe.js
@@ -0,0 +1,3919 @@
+/*! PhotoSwipe - v4.1.4 - 2022-05-22
+* http://photoswipe.com
+* Copyright (c) 2022 Dmitry Semenov; */
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.PhotoSwipe = factory();
+ }
+})(this, function () {
+
+ 'use strict';
+ var PhotoSwipe = function(template, UiClass, items, options){
+
+/*>>framework-bridge*/
+/**
+ *
+ * Set of generic functions used by gallery.
+ *
+ * You're free to modify anything here as long as functionality is kept.
+ *
+ */
+var framework = {
+ features: null,
+ bind: function (target, type, listener, unbind) {
+ var methodName = (unbind ? 'remove' : 'add') + 'EventListener';
+ type = type.split(' ');
+ for (var i = 0; i < type.length; i++) {
+ if (type[i]) {
+ target[methodName](type[i], listener, false);
+ }
+ }
+ },
+ isArray: function (obj) {
+ return obj instanceof Array;
+ },
+ createEl: function (classes, tag) {
+ var el = document.createElement(tag || 'div');
+ if (classes) {
+ el.className = classes;
+ }
+ return el;
+ },
+ getScrollY: function () {
+ var yOffset = window.pageYOffset;
+ return yOffset !== undefined
+ ? yOffset
+ : document.documentElement.scrollTop;
+ },
+ unbind: function (target, type, listener) {
+ framework.bind(target, type, listener, true);
+ },
+ removeClass: function (el, className) {
+ var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
+ el.className = el.className
+ .replace(reg, ' ')
+ .replace(/^\s\s*/, '')
+ .replace(/\s\s*$/, '');
+ },
+ addClass: function (el, className) {
+ if (!framework.hasClass(el, className)) {
+ el.className += (el.className ? ' ' : '') + className;
+ }
+ },
+ hasClass: function (el, className) {
+ return (
+ el.className &&
+ new RegExp('(^|\\s)' + className + '(\\s|$)').test(el.className)
+ );
+ },
+ getChildByClass: function (parentEl, childClassName) {
+ var node = parentEl.firstChild;
+ while (node) {
+ if (framework.hasClass(node, childClassName)) {
+ return node;
+ }
+ node = node.nextSibling;
+ }
+ },
+ arraySearch: function (array, value, key) {
+ var i = array.length;
+ while (i--) {
+ if (array[i][key] === value) {
+ return i;
+ }
+ }
+ return -1;
+ },
+ extend: function (o1, o2, preventOverwrite) {
+ for (var prop in o2) {
+ if (o2.hasOwnProperty(prop)) {
+ if (preventOverwrite && o1.hasOwnProperty(prop)) {
+ continue;
+ }
+ o1[prop] = o2[prop];
+ }
+ }
+ },
+ easing: {
+ sine: {
+ out: function (k) {
+ return Math.sin(k * (Math.PI / 2));
+ },
+ inOut: function (k) {
+ return -(Math.cos(Math.PI * k) - 1) / 2;
+ },
+ },
+ cubic: {
+ out: function (k) {
+ return --k * k * k + 1;
+ },
+ },
+ /*
+ elastic: {
+ out: function ( k ) {
+
+ var s, a = 0.1, p = 0.4;
+ if ( k === 0 ) return 0;
+ if ( k === 1 ) return 1;
+ if ( !a || a < 1 ) { a = 1; s = p / 4; }
+ else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+ return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
+
+ },
+ },
+ back: {
+ out: function ( k ) {
+ var s = 1.70158;
+ return --k * k * ( ( s + 1 ) * k + s ) + 1;
+ }
+ }
+ */
+ },
+
+ /**
+ *
+ * @return {object}
+ *
+ * {
+ * raf : request animation frame function
+ * caf : cancel animation frame function
+ * transfrom : transform property key (with vendor), or null if not supported
+ * oldIE : IE8 or below
+ * }
+ *
+ */
+ detectFeatures: function () {
+ if (framework.features) {
+ return framework.features;
+ }
+ var helperEl = framework.createEl(),
+ helperStyle = helperEl.style,
+ vendor = '',
+ features = {};
+
+ // IE8 and below
+ features.oldIE = document.all && !document.addEventListener;
+
+ features.touch = 'ontouchstart' in window;
+
+ if (window.requestAnimationFrame) {
+ features.raf = window.requestAnimationFrame;
+ features.caf = window.cancelAnimationFrame;
+ }
+
+ features.pointerEvent =
+ !!window.PointerEvent || navigator.msPointerEnabled;
+
+ // fix false-positive detection of old Android in new IE
+ // (IE11 ua string contains "Android 4.0")
+
+ if (!features.pointerEvent) {
+ var ua = navigator.userAgent;
+
+ // Detect if device is iPhone or iPod and if it's older than iOS 8
+ // http://stackoverflow.com/a/14223920
+ //
+ // This detection is made because of buggy top/bottom toolbars
+ // that don't trigger window.resize event.
+ // For more info refer to _isFixedPosition variable in core.js
+
+ if (/iP(hone|od)/.test(navigator.platform)) {
+ var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);
+ if (v && v.length > 0) {
+ v = parseInt(v[1], 10);
+ if (v >= 1 && v < 8) {
+ features.isOldIOSPhone = true;
+ }
+ }
+ }
+
+ // Detect old Android (before KitKat)
+ // due to bugs related to position:fixed
+ // http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript
+
+ var match = ua.match(/Android\s([0-9\.]*)/);
+ var androidversion = match ? match[1] : 0;
+ androidversion = parseFloat(androidversion);
+ if (androidversion >= 1) {
+ if (androidversion < 4.4) {
+ features.isOldAndroid = true; // for fixed position bug & performance
+ }
+ features.androidVersion = androidversion; // for touchend bug
+ }
+ features.isMobileOpera = /opera mini|opera mobi/i.test(ua);
+
+ // p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.
+ }
+
+ var styleChecks = ['transform', 'perspective', 'animationName'],
+ vendors = ['', 'webkit', 'Moz', 'ms', 'O'],
+ styleCheckItem,
+ styleName;
+
+ for (var i = 0; i < 4; i++) {
+ vendor = vendors[i];
+
+ for (var a = 0; a < 3; a++) {
+ styleCheckItem = styleChecks[a];
+
+ // uppercase first letter of property name, if vendor is present
+ styleName =
+ vendor +
+ (vendor
+ ? styleCheckItem.charAt(0).toUpperCase() +
+ styleCheckItem.slice(1)
+ : styleCheckItem);
+
+ if (!features[styleCheckItem] && styleName in helperStyle) {
+ features[styleCheckItem] = styleName;
+ }
+ }
+
+ if (vendor && !features.raf) {
+ vendor = vendor.toLowerCase();
+ features.raf = window[vendor + 'RequestAnimationFrame'];
+ if (features.raf) {
+ features.caf =
+ window[vendor + 'CancelAnimationFrame'] ||
+ window[vendor + 'CancelRequestAnimationFrame'];
+ }
+ }
+ }
+
+ if (!features.raf) {
+ var lastTime = 0;
+ features.raf = function (fn) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function () {
+ fn(currTime + timeToCall);
+ }, timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ features.caf = function (id) {
+ clearTimeout(id);
+ };
+ }
+
+ // Detect SVG support
+ features.svg =
+ !!document.createElementNS &&
+ !!document.createElementNS('http://www.w3.org/2000/svg', 'svg')
+ .createSVGRect;
+
+ framework.features = features;
+
+ return features;
+ },
+};
+
+framework.detectFeatures();
+
+// Override addEventListener for old versions of IE
+if (framework.features.oldIE) {
+ framework.bind = function (target, type, listener, unbind) {
+ type = type.split(' ');
+
+ var methodName = (unbind ? 'detach' : 'attach') + 'Event',
+ evName,
+ _handleEv = function () {
+ listener.handleEvent.call(listener);
+ };
+
+ for (var i = 0; i < type.length; i++) {
+ evName = type[i];
+ if (evName) {
+ if (typeof listener === 'object' && listener.handleEvent) {
+ if (!unbind) {
+ listener['oldIE' + evName] = _handleEv;
+ } else {
+ if (!listener['oldIE' + evName]) {
+ return false;
+ }
+ }
+
+ target[methodName](
+ 'on' + evName,
+ listener['oldIE' + evName]
+ );
+ } else {
+ target[methodName]('on' + evName, listener);
+ }
+ }
+ }
+ };
+}
+
+
+/*>>framework-bridge*/
+
+/*>>core*/
+//function(template, UiClass, items, options)
+
+var self = this;
+
+/**
+ * Static vars, don't change unless you know what you're doing.
+ */
+var DOUBLE_TAP_RADIUS = 25,
+ NUM_HOLDERS = 3;
+
+/**
+ * Options
+ */
+var _options = {
+ allowPanToNext: true,
+ spacing: 0.12,
+ bgOpacity: 1,
+ mouseUsed: false,
+ loop: true,
+ pinchToClose: true,
+ closeOnScroll: true,
+ closeOnVerticalDrag: true,
+ verticalDragRange: 0.75,
+ hideAnimationDuration: 333,
+ showAnimationDuration: 333,
+ showHideOpacity: false,
+ focus: true,
+ escKey: true,
+ arrowKeys: true,
+ mainScrollEndFriction: 0.35,
+ panEndFriction: 0.35,
+ isClickableElement: function (el) {
+ return el.tagName === 'A';
+ },
+ getDoubleTapZoom: function (isMouseClick, item) {
+ if (isMouseClick) {
+ return 1;
+ } else {
+ return item.initialZoomLevel < 0.7 ? 1 : 1.33;
+ }
+ },
+ maxSpreadZoom: 1.33,
+ modal: true,
+
+ // not fully implemented yet
+ scaleMode: 'fit', // TODO
+};
+framework.extend(_options, options);
+
+/**
+ * Private helper variables & functions
+ */
+
+var _getEmptyPoint = function () {
+ return { x: 0, y: 0 };
+};
+
+var _isOpen,
+ _isDestroying,
+ _closedByScroll,
+ _currentItemIndex,
+ _containerStyle,
+ _containerShiftIndex,
+ _currPanDist = _getEmptyPoint(),
+ _startPanOffset = _getEmptyPoint(),
+ _panOffset = _getEmptyPoint(),
+ _upMoveEvents, // drag move, drag end & drag cancel events array
+ _downEvents, // drag start events array
+ _globalEventHandlers,
+ _viewportSize = {},
+ _currZoomLevel,
+ _startZoomLevel,
+ _translatePrefix,
+ _translateSufix,
+ _updateSizeInterval,
+ _itemsNeedUpdate,
+ _currPositionIndex = 0,
+ _offset = {},
+ _slideSize = _getEmptyPoint(), // size of slide area, including spacing
+ _itemHolders,
+ _prevItemIndex,
+ _indexDiff = 0, // difference of indexes since last content update
+ _dragStartEvent,
+ _dragMoveEvent,
+ _dragEndEvent,
+ _dragCancelEvent,
+ _transformKey,
+ _pointerEventEnabled,
+ _isFixedPosition = true,
+ _likelyTouchDevice,
+ _modules = [],
+ _requestAF,
+ _cancelAF,
+ _initalClassName,
+ _initalWindowScrollY,
+ _oldIE,
+ _currentWindowScrollY,
+ _features,
+ _windowVisibleSize = {},
+ _renderMaxResolution = false,
+ _orientationChangeTimeout,
+ // Registers PhotoSWipe module (History, Controller ...)
+ _registerModule = function (name, module) {
+ framework.extend(self, module.publicMethods);
+ _modules.push(name);
+ },
+ _getLoopedId = function (index) {
+ var numSlides = _getNumItems();
+ if (index > numSlides - 1) {
+ return index - numSlides;
+ } else if (index < 0) {
+ return numSlides + index;
+ }
+ return index;
+ },
+ // Micro bind/trigger
+ _listeners = {},
+ _listen = function (name, fn) {
+ if (!_listeners[name]) {
+ _listeners[name] = [];
+ }
+ return _listeners[name].push(fn);
+ },
+ _shout = function (name) {
+ var listeners = _listeners[name];
+
+ if (listeners) {
+ var args = Array.prototype.slice.call(arguments);
+ args.shift();
+
+ for (var i = 0; i < listeners.length; i++) {
+ listeners[i].apply(self, args);
+ }
+ }
+ },
+ _getCurrentTime = function () {
+ return new Date().getTime();
+ },
+ _applyBgOpacity = function (opacity) {
+ _bgOpacity = opacity;
+ self.bg.style.opacity = opacity * _options.bgOpacity;
+ },
+ _applyZoomTransform = function (styleObj, x, y, zoom, item) {
+ if (!_renderMaxResolution || (item && item !== self.currItem)) {
+ zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);
+ }
+
+ styleObj[_transformKey] =
+ _translatePrefix +
+ x +
+ 'px, ' +
+ y +
+ 'px' +
+ _translateSufix +
+ ' scale(' +
+ zoom +
+ ')';
+ },
+ _applyCurrentZoomPan = function (allowRenderResolution) {
+ if (_currZoomElementStyle) {
+ if (allowRenderResolution) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
+ if (!_renderMaxResolution) {
+ _setImageSize(self.currItem, false, true);
+ _renderMaxResolution = true;
+ }
+ } else {
+ if (_renderMaxResolution) {
+ _setImageSize(self.currItem);
+ _renderMaxResolution = false;
+ }
+ }
+ }
+
+ _applyZoomTransform(
+ _currZoomElementStyle,
+ _panOffset.x,
+ _panOffset.y,
+ _currZoomLevel
+ );
+ }
+ },
+ _applyZoomPanToItem = function (item) {
+ if (item.container) {
+ if (!item.initialPosition) {
+ item.initialPosition = { x: 0, y: 0 };
+ }
+ _applyZoomTransform(
+ item.container.style,
+ item.initialPosition.x,
+ item.initialPosition.y,
+ item.initialZoomLevel,
+ item
+ );
+ }
+ },
+ _setTranslateX = function (x, elStyle) {
+ elStyle[_transformKey] =
+ _translatePrefix + x + 'px, 0px' + _translateSufix;
+ },
+ _moveMainScroll = function (x, dragging) {
+ if (!_options.loop && dragging) {
+ var newSlideIndexOffset =
+ _currentItemIndex +
+ (_slideSize.x * _currPositionIndex - x) / _slideSize.x,
+ delta = Math.round(x - _mainScrollPos.x);
+
+ if (
+ (newSlideIndexOffset < 0 && delta > 0) ||
+ (newSlideIndexOffset >= _getNumItems() - 1 && delta < 0)
+ ) {
+ x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;
+ }
+ }
+
+ _mainScrollPos.x = x;
+ _setTranslateX(x, _containerStyle);
+ },
+ _calculatePanOffset = function (axis, zoomLevel) {
+ var m = _midZoomPoint[axis] - _offset[axis];
+ return (
+ _startPanOffset[axis] +
+ _currPanDist[axis] +
+ m -
+ m * (zoomLevel / _startZoomLevel)
+ );
+ },
+ _equalizePoints = function (p1, p2) {
+ p1.x = p2.x;
+ p1.y = p2.y;
+ if (p2.id) {
+ p1.id = p2.id;
+ }
+ },
+ _roundPoint = function (p) {
+ p.x = Math.round(p.x);
+ p.y = Math.round(p.y);
+ },
+ _mouseMoveTimeout = null,
+ _onFirstMouseMove = function () {
+ // Wait until mouse move event is fired at least twice during 100ms
+ // We do this, because some mobile browsers trigger it on touchstart
+ if (_mouseMoveTimeout) {
+ framework.unbind(document, 'mousemove', _onFirstMouseMove);
+ framework.addClass(template, 'pswp--has_mouse');
+ _options.mouseUsed = true;
+ _shout('mouseUsed');
+ }
+ _mouseMoveTimeout = setTimeout(function () {
+ _mouseMoveTimeout = null;
+ }, 100);
+ },
+ _bindEvents = function () {
+ framework.bind(document, 'keydown', self);
+
+ if (_features.transform) {
+ // don't bind click event in browsers that don't support transform (mostly IE8)
+ framework.bind(self.scrollWrap, 'click', self);
+ }
+
+ if (!_options.mouseUsed) {
+ framework.bind(document, 'mousemove', _onFirstMouseMove);
+ }
+
+ framework.bind(window, 'resize scroll orientationchange', self);
+
+ _shout('bindEvents');
+ },
+ _unbindEvents = function () {
+ framework.unbind(window, 'resize scroll orientationchange', self);
+ framework.unbind(window, 'scroll', _globalEventHandlers.scroll);
+ framework.unbind(document, 'keydown', self);
+ framework.unbind(document, 'mousemove', _onFirstMouseMove);
+
+ if (_features.transform) {
+ framework.unbind(self.scrollWrap, 'click', self);
+ }
+
+ if (_isDragging) {
+ framework.unbind(window, _upMoveEvents, self);
+ }
+
+ clearTimeout(_orientationChangeTimeout);
+
+ _shout('unbindEvents');
+ },
+ _calculatePanBounds = function (zoomLevel, update) {
+ var bounds = _calculateItemSize(
+ self.currItem,
+ _viewportSize,
+ zoomLevel
+ );
+ if (update) {
+ _currPanBounds = bounds;
+ }
+ return bounds;
+ },
+ _getMinZoomLevel = function (item) {
+ if (!item) {
+ item = self.currItem;
+ }
+ return item.initialZoomLevel;
+ },
+ _getMaxZoomLevel = function (item) {
+ if (!item) {
+ item = self.currItem;
+ }
+ return item.w > 0 ? _options.maxSpreadZoom : 1;
+ },
+ // Return true if offset is out of the bounds
+ _modifyDestPanOffset = function (
+ axis,
+ destPanBounds,
+ destPanOffset,
+ destZoomLevel
+ ) {
+ if (destZoomLevel === self.currItem.initialZoomLevel) {
+ destPanOffset[axis] = self.currItem.initialPosition[axis];
+ return true;
+ } else {
+ destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);
+
+ if (destPanOffset[axis] > destPanBounds.min[axis]) {
+ destPanOffset[axis] = destPanBounds.min[axis];
+ return true;
+ } else if (destPanOffset[axis] < destPanBounds.max[axis]) {
+ destPanOffset[axis] = destPanBounds.max[axis];
+ return true;
+ }
+ }
+ return false;
+ },
+ _setupTransforms = function () {
+ if (_transformKey) {
+ // setup 3d transforms
+ var allow3dTransform = _features.perspective && !_likelyTouchDevice;
+ _translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');
+ _translateSufix = _features.perspective ? ', 0px)' : ')';
+ return;
+ }
+
+ // Override zoom/pan/move functions in case old browser is used (most likely IE)
+ // (so they use left/top/width/height, instead of CSS transform)
+
+ _transformKey = 'left';
+ framework.addClass(template, 'pswp--ie');
+
+ _setTranslateX = function (x, elStyle) {
+ elStyle.left = x + 'px';
+ };
+ _applyZoomPanToItem = function (item) {
+ var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
+ s = item.container.style,
+ w = zoomRatio * item.w,
+ h = zoomRatio * item.h;
+
+ s.width = w + 'px';
+ s.height = h + 'px';
+ s.left = item.initialPosition.x + 'px';
+ s.top = item.initialPosition.y + 'px';
+ };
+ _applyCurrentZoomPan = function () {
+ if (_currZoomElementStyle) {
+ var s = _currZoomElementStyle,
+ item = self.currItem,
+ zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
+ w = zoomRatio * item.w,
+ h = zoomRatio * item.h;
+
+ s.width = w + 'px';
+ s.height = h + 'px';
+
+ s.left = _panOffset.x + 'px';
+ s.top = _panOffset.y + 'px';
+ }
+ };
+ },
+ _onKeyDown = function (e) {
+ var keydownAction = '';
+ if (_options.escKey && e.keyCode === 27) {
+ keydownAction = 'close';
+ } else if (_options.arrowKeys) {
+ if (e.keyCode === 37) {
+ keydownAction = 'prev';
+ } else if (e.keyCode === 39) {
+ keydownAction = 'next';
+ }
+ }
+
+ if (keydownAction) {
+ // don't do anything if special key pressed to prevent from overriding default browser actions
+ // e.g. in Chrome on Mac cmd+arrow-left returns to previous page
+ if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
+ if (e.preventDefault) {
+ e.preventDefault();
+ } else {
+ e.returnValue = false;
+ }
+ self[keydownAction]();
+ }
+ }
+ },
+ _onGlobalClick = function (e) {
+ if (!e) {
+ return;
+ }
+
+ // don't allow click event to pass through when triggering after drag or some other gesture
+ if (
+ _moved ||
+ _zoomStarted ||
+ _mainScrollAnimating ||
+ _verticalDragInitiated
+ ) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ },
+ _updatePageScrollOffset = function () {
+ self.setScrollOffset(0, framework.getScrollY());
+ };
+
+// Micro animation engine
+var _animations = {},
+ _numAnimations = 0,
+ _stopAnimation = function (name) {
+ if (_animations[name]) {
+ if (_animations[name].raf) {
+ _cancelAF(_animations[name].raf);
+ }
+ _numAnimations--;
+ delete _animations[name];
+ }
+ },
+ _registerStartAnimation = function (name) {
+ if (_animations[name]) {
+ _stopAnimation(name);
+ }
+ if (!_animations[name]) {
+ _numAnimations++;
+ _animations[name] = {};
+ }
+ },
+ _stopAllAnimations = function () {
+ for (var prop in _animations) {
+ if (_animations.hasOwnProperty(prop)) {
+ _stopAnimation(prop);
+ }
+ }
+ },
+ _animateProp = function (
+ name,
+ b,
+ endProp,
+ d,
+ easingFn,
+ onUpdate,
+ onComplete
+ ) {
+ var startAnimTime = _getCurrentTime(),
+ t;
+ _registerStartAnimation(name);
+
+ var animloop = function () {
+ if (_animations[name]) {
+ t = _getCurrentTime() - startAnimTime; // time diff
+ //b - beginning (start prop)
+ //d - anim duration
+
+ if (t >= d) {
+ _stopAnimation(name);
+ onUpdate(endProp);
+ if (onComplete) {
+ onComplete();
+ }
+ return;
+ }
+ onUpdate((endProp - b) * easingFn(t / d) + b);
+
+ _animations[name].raf = _requestAF(animloop);
+ }
+ };
+ animloop();
+ };
+
+var publicMethods = {
+ // make a few local variables and functions public
+ shout: _shout,
+ listen: _listen,
+ viewportSize: _viewportSize,
+ options: _options,
+
+ isMainScrollAnimating: function () {
+ return _mainScrollAnimating;
+ },
+ getZoomLevel: function () {
+ return _currZoomLevel;
+ },
+ getCurrentIndex: function () {
+ return _currentItemIndex;
+ },
+ isDragging: function () {
+ return _isDragging;
+ },
+ isZooming: function () {
+ return _isZooming;
+ },
+ setScrollOffset: function (x, y) {
+ _offset.x = x;
+ _currentWindowScrollY = _offset.y = y;
+ _shout('updateScrollOffset', _offset);
+ },
+ applyZoomPan: function (zoomLevel, panX, panY, allowRenderResolution) {
+ _panOffset.x = panX;
+ _panOffset.y = panY;
+ _currZoomLevel = zoomLevel;
+ _applyCurrentZoomPan(allowRenderResolution);
+ },
+
+ init: function () {
+ if (_isOpen || _isDestroying) {
+ return;
+ }
+
+ var i;
+
+ self.framework = framework; // basic functionality
+ self.template = template; // root DOM element of PhotoSwipe
+ self.bg = framework.getChildByClass(template, 'pswp__bg');
+
+ _initalClassName = template.className;
+ _isOpen = true;
+
+ _features = framework.detectFeatures();
+ _requestAF = _features.raf;
+ _cancelAF = _features.caf;
+ _transformKey = _features.transform;
+ _oldIE = _features.oldIE;
+
+ self.scrollWrap = framework.getChildByClass(
+ template,
+ 'pswp__scroll-wrap'
+ );
+ self.container = framework.getChildByClass(
+ self.scrollWrap,
+ 'pswp__container'
+ );
+
+ _containerStyle = self.container.style; // for fast access
+
+ // Objects that hold slides (there are only 3 in DOM)
+ self.itemHolders = _itemHolders = [
+ { el: self.container.children[0], wrap: 0, index: -1 },
+ { el: self.container.children[1], wrap: 0, index: -1 },
+ { el: self.container.children[2], wrap: 0, index: -1 },
+ ];
+
+ // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)
+ _itemHolders[0].el.style.display = _itemHolders[2].el.style.display =
+ 'none';
+
+ _setupTransforms();
+
+ // Setup global events
+ _globalEventHandlers = {
+ resize: self.updateSize,
+
+ // Fixes: iOS 10.3 resize event
+ // does not update scrollWrap.clientWidth instantly after resize
+ // https://github.com/dimsemenov/PhotoSwipe/issues/1315
+ orientationchange: function () {
+ clearTimeout(_orientationChangeTimeout);
+ _orientationChangeTimeout = setTimeout(function () {
+ if (_viewportSize.x !== self.scrollWrap.clientWidth) {
+ self.updateSize();
+ }
+ }, 500);
+ },
+ scroll: _updatePageScrollOffset,
+ keydown: _onKeyDown,
+ click: _onGlobalClick,
+ };
+
+ // disable show/hide effects on old browsers that don't support CSS animations or transforms,
+ // old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.
+ var oldPhone =
+ _features.isOldIOSPhone ||
+ _features.isOldAndroid ||
+ _features.isMobileOpera;
+ if (!_features.animationName || !_features.transform || oldPhone) {
+ _options.showAnimationDuration = _options.hideAnimationDuration = 0;
+ }
+
+ // init modules
+ for (i = 0; i < _modules.length; i++) {
+ self['init' + _modules[i]]();
+ }
+
+ // init
+ if (UiClass) {
+ var ui = (self.ui = new UiClass(self, framework));
+ ui.init();
+ }
+
+ _shout('firstUpdate');
+ _currentItemIndex = _currentItemIndex || _options.index || 0;
+ // validate index
+ if (
+ isNaN(_currentItemIndex) ||
+ _currentItemIndex < 0 ||
+ _currentItemIndex >= _getNumItems()
+ ) {
+ _currentItemIndex = 0;
+ }
+ self.currItem = _getItemAt(_currentItemIndex);
+
+ if (_features.isOldIOSPhone || _features.isOldAndroid) {
+ _isFixedPosition = false;
+ }
+
+ template.setAttribute('aria-hidden', 'false');
+ if (_options.modal) {
+ if (!_isFixedPosition) {
+ template.style.position = 'absolute';
+ template.style.top = framework.getScrollY() + 'px';
+ } else {
+ template.style.position = 'fixed';
+ }
+ }
+
+ if (_currentWindowScrollY === undefined) {
+ _shout('initialLayout');
+ _currentWindowScrollY = _initalWindowScrollY =
+ framework.getScrollY();
+ }
+
+ // add classes to root element of PhotoSwipe
+ var rootClasses = 'pswp--open ';
+ if (_options.mainClass) {
+ rootClasses += _options.mainClass + ' ';
+ }
+ if (_options.showHideOpacity) {
+ rootClasses += 'pswp--animate_opacity ';
+ }
+ rootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';
+ rootClasses += _features.animationName ? ' pswp--css_animation' : '';
+ rootClasses += _features.svg ? ' pswp--svg' : '';
+ framework.addClass(template, rootClasses);
+
+ self.updateSize();
+
+ // initial update
+ _containerShiftIndex = -1;
+ _indexDiff = null;
+ for (i = 0; i < NUM_HOLDERS; i++) {
+ _setTranslateX(
+ (i + _containerShiftIndex) * _slideSize.x,
+ _itemHolders[i].el.style
+ );
+ }
+
+ if (!_oldIE) {
+ framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE
+ }
+
+ _listen('initialZoomInEnd', function () {
+ self.setContent(_itemHolders[0], _currentItemIndex - 1);
+ self.setContent(_itemHolders[2], _currentItemIndex + 1);
+
+ _itemHolders[0].el.style.display =
+ _itemHolders[2].el.style.display = 'block';
+
+ if (_options.focus) {
+ // focus causes layout,
+ // which causes lag during the animation,
+ // that's why we delay it untill the initial zoom transition ends
+ template.focus();
+ }
+
+ _bindEvents();
+ });
+
+ // set content for center slide (first time)
+ self.setContent(_itemHolders[1], _currentItemIndex);
+
+ self.updateCurrItem();
+
+ _shout('afterInit');
+
+ if (!_isFixedPosition) {
+ // On all versions of iOS lower than 8.0, we check size of viewport every second.
+ //
+ // This is done to detect when Safari top & bottom bars appear,
+ // as this action doesn't trigger any events (like resize).
+ //
+ // On iOS8 they fixed this.
+ //
+ // 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.
+
+ _updateSizeInterval = setInterval(function () {
+ if (
+ !_numAnimations &&
+ !_isDragging &&
+ !_isZooming &&
+ _currZoomLevel === self.currItem.initialZoomLevel
+ ) {
+ self.updateSize();
+ }
+ }, 1000);
+ }
+
+ framework.addClass(template, 'pswp--visible');
+ },
+
+ isOpen: function () {
+ return _isOpen;
+ },
+
+ // Close the gallery, then destroy it
+ close: function () {
+ if (!_isOpen) {
+ return;
+ }
+
+ _isOpen = false;
+ _isDestroying = true;
+ _shout('close');
+ _unbindEvents();
+
+ _showOrHide(self.currItem, null, true, self.destroy);
+ },
+
+ // destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)
+ destroy: function () {
+ _shout('destroy');
+
+ if (_showOrHideTimeout) {
+ clearTimeout(_showOrHideTimeout);
+ }
+
+ template.setAttribute('aria-hidden', 'true');
+ template.className = _initalClassName;
+
+ if (_updateSizeInterval) {
+ clearInterval(_updateSizeInterval);
+ }
+
+ framework.unbind(self.scrollWrap, _downEvents, self);
+
+ // we unbind scroll event at the end, as closing animation may depend on it
+ framework.unbind(window, 'scroll', self);
+
+ _stopDragUpdateLoop();
+
+ _stopAllAnimations();
+
+ _listeners = null;
+ },
+
+ /**
+ * Pan image to position
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Boolean} force Will ignore bounds if set to true.
+ */
+ panTo: function (x, y, force) {
+ if (!force && _currPanBounds) {
+ if (x > _currPanBounds.min.x) {
+ x = _currPanBounds.min.x;
+ } else if (x < _currPanBounds.max.x) {
+ x = _currPanBounds.max.x;
+ }
+
+ if (y > _currPanBounds.min.y) {
+ y = _currPanBounds.min.y;
+ } else if (y < _currPanBounds.max.y) {
+ y = _currPanBounds.max.y;
+ }
+ }
+
+ _panOffset.x = x;
+ _panOffset.y = y;
+ _applyCurrentZoomPan();
+ },
+
+ handleEvent: function (e) {
+ e = e || window.event;
+ if (_globalEventHandlers[e.type]) {
+ _globalEventHandlers[e.type](e);
+ }
+ },
+
+ goTo: function (index) {
+ index = _getLoopedId(index);
+
+ var diff = index - _currentItemIndex;
+ _indexDiff = diff;
+
+ _currentItemIndex = index;
+ self.currItem = _getItemAt(_currentItemIndex);
+ _currPositionIndex -= diff;
+
+ _moveMainScroll(_slideSize.x * _currPositionIndex);
+
+ _stopAllAnimations();
+ _mainScrollAnimating = false;
+
+ self.updateCurrItem();
+ },
+ next: function () {
+ self.goTo(_currentItemIndex + 1);
+ },
+ prev: function () {
+ self.goTo(_currentItemIndex - 1);
+ },
+
+ // update current zoom/pan objects
+ updateCurrZoomItem: function (emulateSetContent) {
+ if (emulateSetContent) {
+ _shout('beforeChange', 0);
+ }
+
+ // itemHolder[1] is middle (current) item
+ if (_itemHolders[1].el.children.length) {
+ var zoomElement = _itemHolders[1].el.children[0];
+ if (framework.hasClass(zoomElement, 'pswp__zoom-wrap')) {
+ _currZoomElementStyle = zoomElement.style;
+ } else {
+ _currZoomElementStyle = null;
+ }
+ } else {
+ _currZoomElementStyle = null;
+ }
+
+ _currPanBounds = self.currItem.bounds;
+ _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
+ if (_currPanBounds) {
+ _panOffset.x = _currPanBounds.center.x;
+ _panOffset.y = _currPanBounds.center.y;
+ }
+ if (emulateSetContent) {
+ _shout('afterChange');
+ }
+ },
+
+ invalidateCurrItems: function () {
+ _itemsNeedUpdate = true;
+ for (var i = 0; i < NUM_HOLDERS; i++) {
+ if (_itemHolders[i].item) {
+ _itemHolders[i].item.needsUpdate = true;
+ }
+ }
+ },
+
+ updateCurrItem: function (beforeAnimation) {
+ if (_indexDiff === 0) {
+ return;
+ }
+
+ var diffAbs = Math.abs(_indexDiff),
+ tempHolder;
+
+ if (beforeAnimation && diffAbs < 2) {
+ return;
+ }
+
+ self.currItem = _getItemAt(_currentItemIndex);
+ _renderMaxResolution = false;
+
+ _shout('beforeChange', _indexDiff);
+
+ if (diffAbs >= NUM_HOLDERS) {
+ _containerShiftIndex +=
+ _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);
+ diffAbs = NUM_HOLDERS;
+ }
+ for (var i = 0; i < diffAbs; i++) {
+ if (_indexDiff > 0) {
+ tempHolder = _itemHolders.shift();
+ _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last
+
+ _containerShiftIndex++;
+ _setTranslateX(
+ (_containerShiftIndex + 2) * _slideSize.x,
+ tempHolder.el.style
+ );
+ self.setContent(
+ tempHolder,
+ _currentItemIndex - diffAbs + i + 1 + 1
+ );
+ } else {
+ tempHolder = _itemHolders.pop();
+ _itemHolders.unshift(tempHolder); // move last to first
+
+ _containerShiftIndex--;
+ _setTranslateX(
+ _containerShiftIndex * _slideSize.x,
+ tempHolder.el.style
+ );
+ self.setContent(
+ tempHolder,
+ _currentItemIndex + diffAbs - i - 1 - 1
+ );
+ }
+ }
+
+ // reset zoom/pan on previous item
+ if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {
+ var prevItem = _getItemAt(_prevItemIndex);
+ if (prevItem.initialZoomLevel !== _currZoomLevel) {
+ _calculateItemSize(prevItem, _viewportSize);
+ _setImageSize(prevItem);
+ _applyZoomPanToItem(prevItem);
+ }
+ }
+
+ // reset diff after update
+ _indexDiff = 0;
+
+ self.updateCurrZoomItem();
+
+ _prevItemIndex = _currentItemIndex;
+
+ _shout('afterChange');
+ },
+
+ updateSize: function (force) {
+ if (!_isFixedPosition && _options.modal) {
+ var windowScrollY = framework.getScrollY();
+ if (_currentWindowScrollY !== windowScrollY) {
+ template.style.top = windowScrollY + 'px';
+ _currentWindowScrollY = windowScrollY;
+ }
+ if (
+ !force &&
+ _windowVisibleSize.x === window.innerWidth &&
+ _windowVisibleSize.y === window.innerHeight
+ ) {
+ return;
+ }
+ _windowVisibleSize.x = window.innerWidth;
+ _windowVisibleSize.y = window.innerHeight;
+
+ //template.style.width = _windowVisibleSize.x + 'px';
+ template.style.height = _windowVisibleSize.y + 'px';
+ }
+
+ _viewportSize.x = self.scrollWrap.clientWidth;
+ _viewportSize.y = self.scrollWrap.clientHeight;
+
+ _updatePageScrollOffset();
+
+ _slideSize.x =
+ _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);
+ _slideSize.y = _viewportSize.y;
+
+ _moveMainScroll(_slideSize.x * _currPositionIndex);
+
+ _shout('beforeResize'); // even may be used for example to switch image sources
+
+ // don't re-calculate size on inital size update
+ if (_containerShiftIndex !== undefined) {
+ var holder, item, hIndex;
+
+ for (var i = 0; i < NUM_HOLDERS; i++) {
+ holder = _itemHolders[i];
+ _setTranslateX(
+ (i + _containerShiftIndex) * _slideSize.x,
+ holder.el.style
+ );
+
+ hIndex = _currentItemIndex + i - 1;
+
+ if (_options.loop && _getNumItems() > 2) {
+ hIndex = _getLoopedId(hIndex);
+ }
+
+ // update zoom level on items and refresh source (if needsUpdate)
+ item = _getItemAt(hIndex);
+
+ // re-render gallery item if `needsUpdate`,
+ // or doesn't have `bounds` (entirely new slide object)
+ if (
+ item &&
+ (_itemsNeedUpdate || item.needsUpdate || !item.bounds)
+ ) {
+ self.cleanSlide(item);
+
+ self.setContent(holder, hIndex);
+
+ // if "center" slide
+ if (i === 1) {
+ self.currItem = item;
+ self.updateCurrZoomItem(true);
+ }
+
+ item.needsUpdate = false;
+ } else if (holder.index === -1 && hIndex >= 0) {
+ // add content first time
+ self.setContent(holder, hIndex);
+ }
+ if (item && item.container) {
+ _calculateItemSize(item, _viewportSize);
+ _setImageSize(item);
+ _applyZoomPanToItem(item);
+ }
+ }
+ _itemsNeedUpdate = false;
+ }
+
+ _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
+ _currPanBounds = self.currItem.bounds;
+
+ if (_currPanBounds) {
+ _panOffset.x = _currPanBounds.center.x;
+ _panOffset.y = _currPanBounds.center.y;
+ _applyCurrentZoomPan(true);
+ }
+
+ _shout('resize');
+ },
+
+ // Zoom current item to
+ zoomTo: function (destZoomLevel, centerPoint, speed, easingFn, updateFn) {
+ /*
+ if(destZoomLevel === 'fit') {
+ destZoomLevel = self.currItem.fitRatio;
+ } else if(destZoomLevel === 'fill') {
+ destZoomLevel = self.currItem.fillRatio;
+ }
+ */
+
+ if (centerPoint && _panOffset) {
+ _startZoomLevel = _currZoomLevel;
+ _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;
+ _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;
+ _equalizePoints(_startPanOffset, _panOffset);
+ }
+
+ var destPanBounds = _calculatePanBounds(destZoomLevel, false),
+ destPanOffset = {};
+
+ _modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);
+ _modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);
+
+ var initialZoomLevel = _currZoomLevel;
+ var initialPanOffset = {
+ x: _panOffset.x,
+ y: _panOffset.y,
+ };
+
+ _roundPoint(destPanOffset);
+
+ var onUpdate = function (now) {
+ if (now === 1) {
+ _currZoomLevel = destZoomLevel;
+ _panOffset.x = destPanOffset.x;
+ _panOffset.y = destPanOffset.y;
+ } else {
+ _currZoomLevel =
+ (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;
+ _panOffset.x =
+ (destPanOffset.x - initialPanOffset.x) * now +
+ initialPanOffset.x;
+ _panOffset.y =
+ (destPanOffset.y - initialPanOffset.y) * now +
+ initialPanOffset.y;
+ }
+
+ if (updateFn) {
+ updateFn(now);
+ }
+
+ _applyCurrentZoomPan(now === 1);
+ };
+
+ if (speed) {
+ _animateProp(
+ 'customZoomTo',
+ 0,
+ 1,
+ speed,
+ easingFn || framework.easing.sine.inOut,
+ onUpdate
+ );
+ } else {
+ onUpdate(1);
+ }
+ },
+};
+
+
+/*>>core*/
+
+/*>>gestures*/
+/**
+ * Mouse/touch/pointer event handlers.
+ *
+ * separated from @core.js for readability
+ */
+
+var MIN_SWIPE_DISTANCE = 30,
+ DIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe
+
+var _gestureStartTime,
+ _gestureCheckSpeedTime,
+ // pool of objects that are used during dragging of zooming
+ p = {}, // first point
+ p2 = {}, // second point (for zoom gesture)
+ delta = {},
+ _currPoint = {},
+ _startPoint = {},
+ _currPointers = [],
+ _startMainScrollPos = {},
+ _releaseAnimData,
+ _posPoints = [], // array of points during dragging, used to determine type of gesture
+ _tempPoint = {},
+ _isZoomingIn,
+ _verticalDragInitiated,
+ _oldAndroidTouchEndTimeout,
+ _currZoomedItemIndex = 0,
+ _centerPoint = _getEmptyPoint(),
+ _lastReleaseTime = 0,
+ _isDragging, // at least one pointer is down
+ _isMultitouch, // at least two _pointers are down
+ _zoomStarted, // zoom level changed during zoom gesture
+ _moved,
+ _dragAnimFrame,
+ _mainScrollShifted,
+ _currentPoints, // array of current touch points
+ _isZooming,
+ _currPointsDistance,
+ _startPointsDistance,
+ _currPanBounds,
+ _mainScrollPos = _getEmptyPoint(),
+ _currZoomElementStyle,
+ _mainScrollAnimating, // true, if animation after swipe gesture is running
+ _midZoomPoint = _getEmptyPoint(),
+ _currCenterPoint = _getEmptyPoint(),
+ _direction,
+ _isFirstMove,
+ _opacityChanged,
+ _bgOpacity,
+ _wasOverInitialZoom,
+ _isEqualPoints = function (p1, p2) {
+ return p1.x === p2.x && p1.y === p2.y;
+ },
+ _isNearbyPoints = function (touch0, touch1) {
+ return (
+ Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS &&
+ Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS
+ );
+ },
+ _calculatePointsDistance = function (p1, p2) {
+ _tempPoint.x = Math.abs(p1.x - p2.x);
+ _tempPoint.y = Math.abs(p1.y - p2.y);
+ return Math.sqrt(
+ _tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y
+ );
+ },
+ _stopDragUpdateLoop = function () {
+ if (_dragAnimFrame) {
+ _cancelAF(_dragAnimFrame);
+ _dragAnimFrame = null;
+ }
+ },
+ _dragUpdateLoop = function () {
+ if (_isDragging) {
+ _dragAnimFrame = _requestAF(_dragUpdateLoop);
+ _renderMovement();
+ }
+ },
+ _canPan = function () {
+ return !(
+ _options.scaleMode === 'fit' &&
+ _currZoomLevel === self.currItem.initialZoomLevel
+ );
+ },
+ // find the closest parent DOM element
+ _closestElement = function (el, fn) {
+ if (!el || el === document) {
+ return false;
+ }
+
+ // don't search elements above pswp__scroll-wrap
+ if (
+ el.getAttribute('class') &&
+ el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1
+ ) {
+ return false;
+ }
+
+ if (fn(el)) {
+ return el;
+ }
+
+ return _closestElement(el.parentNode, fn);
+ },
+ _preventObj = {},
+ _preventDefaultEventBehaviour = function (e, isDown) {
+ _preventObj.prevent = !_closestElement(
+ e.target,
+ _options.isClickableElement
+ );
+
+ _shout('preventDragEvent', e, isDown, _preventObj);
+ return _preventObj.prevent;
+ },
+ _convertTouchToPoint = function (touch, p) {
+ p.x = touch.pageX;
+ p.y = touch.pageY;
+ p.id = touch.identifier;
+ return p;
+ },
+ _findCenterOfPoints = function (p1, p2, pCenter) {
+ pCenter.x = (p1.x + p2.x) * 0.5;
+ pCenter.y = (p1.y + p2.y) * 0.5;
+ },
+ _pushPosPoint = function (time, x, y) {
+ if (time - _gestureCheckSpeedTime > 50) {
+ var o = _posPoints.length > 2 ? _posPoints.shift() : {};
+ o.x = x;
+ o.y = y;
+ _posPoints.push(o);
+ _gestureCheckSpeedTime = time;
+ }
+ },
+ _calculateVerticalDragOpacityRatio = function () {
+ var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position
+ return 1 - Math.abs(yOffset / (_viewportSize.y / 2));
+ },
+ // points pool, reused during touch events
+ _ePoint1 = {},
+ _ePoint2 = {},
+ _tempPointsArr = [],
+ _tempCounter,
+ _getTouchPoints = function (e) {
+ // clean up previous points, without recreating array
+ while (_tempPointsArr.length > 0) {
+ _tempPointsArr.pop();
+ }
+
+ if (!_pointerEventEnabled) {
+ if (e.type.indexOf('touch') > -1) {
+ if (e.touches && e.touches.length > 0) {
+ _tempPointsArr[0] = _convertTouchToPoint(
+ e.touches[0],
+ _ePoint1
+ );
+ if (e.touches.length > 1) {
+ _tempPointsArr[1] = _convertTouchToPoint(
+ e.touches[1],
+ _ePoint2
+ );
+ }
+ }
+ } else {
+ _ePoint1.x = e.pageX;
+ _ePoint1.y = e.pageY;
+ _ePoint1.id = '';
+ _tempPointsArr[0] = _ePoint1; //_ePoint1;
+ }
+ } else {
+ _tempCounter = 0;
+ // we can use forEach, as pointer events are supported only in modern browsers
+ _currPointers.forEach(function (p) {
+ if (_tempCounter === 0) {
+ _tempPointsArr[0] = p;
+ } else if (_tempCounter === 1) {
+ _tempPointsArr[1] = p;
+ }
+ _tempCounter++;
+ });
+ }
+ return _tempPointsArr;
+ },
+ _panOrMoveMainScroll = function (axis, delta) {
+ var panFriction,
+ overDiff = 0,
+ newOffset = _panOffset[axis] + delta[axis],
+ startOverDiff,
+ dir = delta[axis] > 0,
+ newMainScrollPosition = _mainScrollPos.x + delta.x,
+ mainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,
+ newPanPos,
+ newMainScrollPos;
+
+ // calculate fdistance over the bounds and friction
+ if (
+ newOffset > _currPanBounds.min[axis] ||
+ newOffset < _currPanBounds.max[axis]
+ ) {
+ panFriction = _options.panEndFriction;
+ // Linear increasing of friction, so at 1/4 of viewport it's at max value.
+ // Looks not as nice as was expected. Left for history.
+ // panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );
+ } else {
+ panFriction = 1;
+ }
+
+ newOffset = _panOffset[axis] + delta[axis] * panFriction;
+
+ // move main scroll or start panning
+ if (
+ _options.allowPanToNext ||
+ _currZoomLevel === self.currItem.initialZoomLevel
+ ) {
+ if (!_currZoomElementStyle) {
+ newMainScrollPos = newMainScrollPosition;
+ } else if (_direction === 'h' && axis === 'x' && !_zoomStarted) {
+ if (dir) {
+ if (newOffset > _currPanBounds.min[axis]) {
+ panFriction = _options.panEndFriction;
+ overDiff = _currPanBounds.min[axis] - newOffset;
+ startOverDiff =
+ _currPanBounds.min[axis] - _startPanOffset[axis];
+ }
+
+ // drag right
+ if (
+ (startOverDiff <= 0 || mainScrollDiff < 0) &&
+ _getNumItems() > 1
+ ) {
+ newMainScrollPos = newMainScrollPosition;
+ if (
+ mainScrollDiff < 0 &&
+ newMainScrollPosition > _startMainScrollPos.x
+ ) {
+ newMainScrollPos = _startMainScrollPos.x;
+ }
+ } else {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ newPanPos = newOffset;
+ }
+ }
+ } else {
+ if (newOffset < _currPanBounds.max[axis]) {
+ panFriction = _options.panEndFriction;
+ overDiff = newOffset - _currPanBounds.max[axis];
+ startOverDiff =
+ _startPanOffset[axis] - _currPanBounds.max[axis];
+ }
+
+ if (
+ (startOverDiff <= 0 || mainScrollDiff > 0) &&
+ _getNumItems() > 1
+ ) {
+ newMainScrollPos = newMainScrollPosition;
+
+ if (
+ mainScrollDiff > 0 &&
+ newMainScrollPosition < _startMainScrollPos.x
+ ) {
+ newMainScrollPos = _startMainScrollPos.x;
+ }
+ } else {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ newPanPos = newOffset;
+ }
+ }
+ }
+
+ //
+ }
+
+ if (axis === 'x') {
+ if (newMainScrollPos !== undefined) {
+ _moveMainScroll(newMainScrollPos, true);
+ if (newMainScrollPos === _startMainScrollPos.x) {
+ _mainScrollShifted = false;
+ } else {
+ _mainScrollShifted = true;
+ }
+ }
+
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ if (newPanPos !== undefined) {
+ _panOffset.x = newPanPos;
+ } else if (!_mainScrollShifted) {
+ _panOffset.x += delta.x * panFriction;
+ }
+ }
+
+ return newMainScrollPos !== undefined;
+ }
+ }
+
+ if (!_mainScrollAnimating) {
+ if (!_mainScrollShifted) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
+ _panOffset[axis] += delta[axis] * panFriction;
+ }
+ }
+ }
+ },
+ // Pointerdown/touchstart/mousedown handler
+ _onDragStart = function (e) {
+ // Allow dragging only via left mouse button.
+ // As this handler is not added in IE8 - we ignore e.which
+ //
+ // http://www.quirksmode.org/js/events_properties.html
+ // https://developer.mozilla.org/en-US/docs/Web/API/event.button
+ if (e.type === 'mousedown' && e.button > 0) {
+ return;
+ }
+
+ if (_initialZoomRunning) {
+ e.preventDefault();
+ return;
+ }
+
+ if (_oldAndroidTouchEndTimeout && e.type === 'mousedown') {
+ return;
+ }
+
+ if (_preventDefaultEventBehaviour(e, true)) {
+ e.preventDefault();
+ }
+
+ _shout('pointerDown');
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+ if (pointerIndex < 0) {
+ pointerIndex = _currPointers.length;
+ }
+ _currPointers[pointerIndex] = {
+ x: e.pageX,
+ y: e.pageY,
+ id: e.pointerId,
+ };
+ }
+
+ var startPointsList = _getTouchPoints(e),
+ numPoints = startPointsList.length;
+
+ _currentPoints = null;
+
+ _stopAllAnimations();
+
+ // init drag
+ if (!_isDragging || numPoints === 1) {
+ _isDragging = _isFirstMove = true;
+ framework.bind(window, _upMoveEvents, self);
+
+ _isZoomingIn =
+ _wasOverInitialZoom =
+ _opacityChanged =
+ _verticalDragInitiated =
+ _mainScrollShifted =
+ _moved =
+ _isMultitouch =
+ _zoomStarted =
+ false;
+
+ _direction = null;
+
+ _shout('firstTouchStart', startPointsList);
+
+ _equalizePoints(_startPanOffset, _panOffset);
+
+ _currPanDist.x = _currPanDist.y = 0;
+ _equalizePoints(_currPoint, startPointsList[0]);
+ _equalizePoints(_startPoint, _currPoint);
+
+ //_equalizePoints(_startMainScrollPos, _mainScrollPos);
+ _startMainScrollPos.x = _slideSize.x * _currPositionIndex;
+
+ _posPoints = [
+ {
+ x: _currPoint.x,
+ y: _currPoint.y,
+ },
+ ];
+
+ _gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();
+
+ //_mainScrollAnimationEnd(true);
+ _calculatePanBounds(_currZoomLevel, true);
+
+ // Start rendering
+ _stopDragUpdateLoop();
+ _dragUpdateLoop();
+ }
+
+ // init zoom
+ if (
+ !_isZooming &&
+ numPoints > 1 &&
+ !_mainScrollAnimating &&
+ !_mainScrollShifted
+ ) {
+ _startZoomLevel = _currZoomLevel;
+ _zoomStarted = false; // true if zoom changed at least once
+
+ _isZooming = _isMultitouch = true;
+ _currPanDist.y = _currPanDist.x = 0;
+
+ _equalizePoints(_startPanOffset, _panOffset);
+
+ _equalizePoints(p, startPointsList[0]);
+ _equalizePoints(p2, startPointsList[1]);
+
+ _findCenterOfPoints(p, p2, _currCenterPoint);
+
+ _midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;
+ _midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;
+ _currPointsDistance = _startPointsDistance =
+ _calculatePointsDistance(p, p2);
+ }
+ },
+ // Pointermove/touchmove/mousemove handler
+ _onDragMove = function (e) {
+ e.preventDefault();
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+ if (pointerIndex > -1) {
+ var p = _currPointers[pointerIndex];
+ p.x = e.pageX;
+ p.y = e.pageY;
+ }
+ }
+
+ if (_isDragging) {
+ var touchesList = _getTouchPoints(e);
+ if (!_direction && !_moved && !_isZooming) {
+ if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {
+ // if main scroll position is shifted – direction is always horizontal
+ _direction = 'h';
+ } else {
+ var diff =
+ Math.abs(touchesList[0].x - _currPoint.x) -
+ Math.abs(touchesList[0].y - _currPoint.y);
+ // check the direction of movement
+ if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {
+ _direction = diff > 0 ? 'h' : 'v';
+ _currentPoints = touchesList;
+ }
+ }
+ } else {
+ _currentPoints = touchesList;
+ }
+ }
+ },
+ //
+ _renderMovement = function () {
+ if (!_currentPoints) {
+ return;
+ }
+
+ var numPoints = _currentPoints.length;
+
+ if (numPoints === 0) {
+ return;
+ }
+
+ _equalizePoints(p, _currentPoints[0]);
+
+ delta.x = p.x - _currPoint.x;
+ delta.y = p.y - _currPoint.y;
+
+ if (_isZooming && numPoints > 1) {
+ // Handle behaviour for more than 1 point
+
+ _currPoint.x = p.x;
+ _currPoint.y = p.y;
+
+ // check if one of two points changed
+ if (!delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2)) {
+ return;
+ }
+
+ _equalizePoints(p2, _currentPoints[1]);
+
+ if (!_zoomStarted) {
+ _zoomStarted = true;
+ _shout('zoomGestureStarted');
+ }
+
+ // Distance between two points
+ var pointsDistance = _calculatePointsDistance(p, p2);
+
+ var zoomLevel = _calculateZoomLevel(pointsDistance);
+
+ // slightly over the of initial zoom level
+ if (
+ zoomLevel >
+ self.currItem.initialZoomLevel +
+ self.currItem.initialZoomLevel / 15
+ ) {
+ _wasOverInitialZoom = true;
+ }
+
+ // Apply the friction if zoom level is out of the bounds
+ var zoomFriction = 1,
+ minZoomLevel = _getMinZoomLevel(),
+ maxZoomLevel = _getMaxZoomLevel();
+
+ if (zoomLevel < minZoomLevel) {
+ if (
+ _options.pinchToClose &&
+ !_wasOverInitialZoom &&
+ _startZoomLevel <= self.currItem.initialZoomLevel
+ ) {
+ // fade out background if zooming out
+ var minusDiff = minZoomLevel - zoomLevel;
+ var percent = 1 - minusDiff / (minZoomLevel / 1.2);
+
+ _applyBgOpacity(percent);
+ _shout('onPinchClose', percent);
+ _opacityChanged = true;
+ } else {
+ zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;
+ if (zoomFriction > 1) {
+ zoomFriction = 1;
+ }
+ zoomLevel =
+ minZoomLevel - zoomFriction * (minZoomLevel / 3);
+ }
+ } else if (zoomLevel > maxZoomLevel) {
+ // 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5
+ zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);
+ if (zoomFriction > 1) {
+ zoomFriction = 1;
+ }
+ zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;
+ }
+
+ if (zoomFriction < 0) {
+ zoomFriction = 0;
+ }
+
+ // distance between touch points after friction is applied
+ _currPointsDistance = pointsDistance;
+
+ // _centerPoint - The point in the middle of two pointers
+ _findCenterOfPoints(p, p2, _centerPoint);
+
+ // paning with two pointers pressed
+ _currPanDist.x += _centerPoint.x - _currCenterPoint.x;
+ _currPanDist.y += _centerPoint.y - _currCenterPoint.y;
+ _equalizePoints(_currCenterPoint, _centerPoint);
+
+ _panOffset.x = _calculatePanOffset('x', zoomLevel);
+ _panOffset.y = _calculatePanOffset('y', zoomLevel);
+
+ _isZoomingIn = zoomLevel > _currZoomLevel;
+ _currZoomLevel = zoomLevel;
+ _applyCurrentZoomPan();
+ } else {
+ // handle behaviour for one point (dragging or panning)
+
+ if (!_direction) {
+ return;
+ }
+
+ if (_isFirstMove) {
+ _isFirstMove = false;
+
+ // subtract drag distance that was used during the detection direction
+
+ if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {
+ delta.x -= _currentPoints[0].x - _startPoint.x;
+ }
+
+ if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {
+ delta.y -= _currentPoints[0].y - _startPoint.y;
+ }
+ }
+
+ _currPoint.x = p.x;
+ _currPoint.y = p.y;
+
+ // do nothing if pointers position hasn't changed
+ if (delta.x === 0 && delta.y === 0) {
+ return;
+ }
+
+ if (_direction === 'v' && _options.closeOnVerticalDrag) {
+ if (!_canPan()) {
+ _currPanDist.y += delta.y;
+ _panOffset.y += delta.y;
+
+ var opacityRatio = _calculateVerticalDragOpacityRatio();
+
+ _verticalDragInitiated = true;
+ _shout('onVerticalDrag', opacityRatio);
+
+ _applyBgOpacity(opacityRatio);
+ _applyCurrentZoomPan();
+ return;
+ }
+ }
+
+ _pushPosPoint(_getCurrentTime(), p.x, p.y);
+
+ _moved = true;
+ _currPanBounds = self.currItem.bounds;
+
+ var mainScrollChanged = _panOrMoveMainScroll('x', delta);
+ if (!mainScrollChanged) {
+ _panOrMoveMainScroll('y', delta);
+
+ _roundPoint(_panOffset);
+ _applyCurrentZoomPan();
+ }
+ }
+ },
+ // Pointerup/pointercancel/touchend/touchcancel/mouseup event handler
+ _onDragRelease = function (e) {
+ if (_features.isOldAndroid) {
+ if (_oldAndroidTouchEndTimeout && e.type === 'mouseup') {
+ return;
+ }
+
+ // on Android (v4.1, 4.2, 4.3 & possibly older)
+ // ghost mousedown/up event isn't preventable via e.preventDefault,
+ // which causes fake mousedown event
+ // so we block mousedown/up for 600ms
+ if (e.type.indexOf('touch') > -1) {
+ clearTimeout(_oldAndroidTouchEndTimeout);
+ _oldAndroidTouchEndTimeout = setTimeout(function () {
+ _oldAndroidTouchEndTimeout = 0;
+ }, 600);
+ }
+ }
+
+ _shout('pointerUp');
+
+ if (_preventDefaultEventBehaviour(e, false)) {
+ e.preventDefault();
+ }
+
+ var releasePoint;
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+
+ if (pointerIndex > -1) {
+ releasePoint = _currPointers.splice(pointerIndex, 1)[0];
+
+ if (navigator.msPointerEnabled) {
+ var MSPOINTER_TYPES = {
+ 4: 'mouse', // event.MSPOINTER_TYPE_MOUSE
+ 2: 'touch', // event.MSPOINTER_TYPE_TOUCH
+ 3: 'pen', // event.MSPOINTER_TYPE_PEN
+ };
+ releasePoint.type = MSPOINTER_TYPES[e.pointerType];
+
+ if (!releasePoint.type) {
+ releasePoint.type = e.pointerType || 'mouse';
+ }
+ } else {
+ releasePoint.type = e.pointerType || 'mouse';
+ }
+ }
+ }
+
+ var touchList = _getTouchPoints(e),
+ gestureType,
+ numPoints = touchList.length;
+
+ if (e.type === 'mouseup') {
+ numPoints = 0;
+ }
+
+ // Do nothing if there were 3 touch points or more
+ if (numPoints === 2) {
+ _currentPoints = null;
+ return true;
+ }
+
+ // if second pointer released
+ if (numPoints === 1) {
+ _equalizePoints(_startPoint, touchList[0]);
+ }
+
+ // pointer hasn't moved, send "tap release" point
+ if (numPoints === 0 && !_direction && !_mainScrollAnimating) {
+ if (!releasePoint) {
+ if (e.type === 'mouseup') {
+ releasePoint = { x: e.pageX, y: e.pageY, type: 'mouse' };
+ } else if (e.changedTouches && e.changedTouches[0]) {
+ releasePoint = {
+ x: e.changedTouches[0].pageX,
+ y: e.changedTouches[0].pageY,
+ type: 'touch',
+ };
+ }
+ }
+
+ _shout('touchRelease', e, releasePoint);
+ }
+
+ // Difference in time between releasing of two last touch points (zoom gesture)
+ var releaseTimeDiff = -1;
+
+ // Gesture completed, no pointers left
+ if (numPoints === 0) {
+ _isDragging = false;
+ framework.unbind(window, _upMoveEvents, self);
+
+ _stopDragUpdateLoop();
+
+ if (_isZooming) {
+ // Two points released at the same time
+ releaseTimeDiff = 0;
+ } else if (_lastReleaseTime !== -1) {
+ releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;
+ }
+ }
+ _lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;
+
+ if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {
+ gestureType = 'zoom';
+ } else {
+ gestureType = 'swipe';
+ }
+
+ if (_isZooming && numPoints < 2) {
+ _isZooming = false;
+
+ // Only second point released
+ if (numPoints === 1) {
+ gestureType = 'zoomPointerUp';
+ }
+ _shout('zoomGestureEnded');
+ }
+
+ _currentPoints = null;
+ if (
+ !_moved &&
+ !_zoomStarted &&
+ !_mainScrollAnimating &&
+ !_verticalDragInitiated
+ ) {
+ // nothing to animate
+ return;
+ }
+
+ _stopAllAnimations();
+
+ if (!_releaseAnimData) {
+ _releaseAnimData = _initDragReleaseAnimationData();
+ }
+
+ _releaseAnimData.calculateSwipeSpeed('x');
+
+ if (_verticalDragInitiated) {
+ var opacityRatio = _calculateVerticalDragOpacityRatio();
+
+ if (opacityRatio < _options.verticalDragRange) {
+ self.close();
+ } else {
+ var initalPanY = _panOffset.y,
+ initialBgOpacity = _bgOpacity;
+
+ _animateProp(
+ 'verticalDrag',
+ 0,
+ 1,
+ 300,
+ framework.easing.cubic.out,
+ function (now) {
+ _panOffset.y =
+ (self.currItem.initialPosition.y - initalPanY) *
+ now +
+ initalPanY;
+
+ _applyBgOpacity(
+ (1 - initialBgOpacity) * now + initialBgOpacity
+ );
+ _applyCurrentZoomPan();
+ }
+ );
+
+ _shout('onVerticalDrag', 1);
+ }
+
+ return;
+ }
+
+ // main scroll
+ if ((_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {
+ var itemChanged = _finishSwipeMainScrollGesture(
+ gestureType,
+ _releaseAnimData
+ );
+ if (itemChanged) {
+ return;
+ }
+ gestureType = 'zoomPointerUp';
+ }
+
+ // prevent zoom/pan animation when main scroll animation runs
+ if (_mainScrollAnimating) {
+ return;
+ }
+
+ // Complete simple zoom gesture (reset zoom level if it's out of the bounds)
+ if (gestureType !== 'swipe') {
+ _completeZoomGesture();
+ return;
+ }
+
+ // Complete pan gesture if main scroll is not shifted, and it's possible to pan current image
+ if (!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {
+ _completePanGesture(_releaseAnimData);
+ }
+ },
+ // Returns object with data about gesture
+ // It's created only once and then reused
+ _initDragReleaseAnimationData = function () {
+ // temp local vars
+ var lastFlickDuration, tempReleasePos;
+
+ // s = this
+ var s = {
+ lastFlickOffset: {},
+ lastFlickDist: {},
+ lastFlickSpeed: {},
+ slowDownRatio: {},
+ slowDownRatioReverse: {},
+ speedDecelerationRatio: {},
+ speedDecelerationRatioAbs: {},
+ distanceOffset: {},
+ backAnimDestination: {},
+ backAnimStarted: {},
+ calculateSwipeSpeed: function (axis) {
+ if (_posPoints.length > 1) {
+ lastFlickDuration =
+ _getCurrentTime() - _gestureCheckSpeedTime + 50;
+ tempReleasePos = _posPoints[_posPoints.length - 2][axis];
+ } else {
+ lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration
+ tempReleasePos = _startPoint[axis];
+ }
+ s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;
+ s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);
+ if (s.lastFlickDist[axis] > 20) {
+ s.lastFlickSpeed[axis] =
+ s.lastFlickOffset[axis] / lastFlickDuration;
+ } else {
+ s.lastFlickSpeed[axis] = 0;
+ }
+ if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {
+ s.lastFlickSpeed[axis] = 0;
+ }
+
+ s.slowDownRatio[axis] = 0.95;
+ s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];
+ s.speedDecelerationRatio[axis] = 1;
+ },
+
+ calculateOverBoundsAnimOffset: function (axis, speed) {
+ if (!s.backAnimStarted[axis]) {
+ if (_panOffset[axis] > _currPanBounds.min[axis]) {
+ s.backAnimDestination[axis] = _currPanBounds.min[axis];
+ } else if (_panOffset[axis] < _currPanBounds.max[axis]) {
+ s.backAnimDestination[axis] = _currPanBounds.max[axis];
+ }
+
+ if (s.backAnimDestination[axis] !== undefined) {
+ s.slowDownRatio[axis] = 0.7;
+ s.slowDownRatioReverse[axis] =
+ 1 - s.slowDownRatio[axis];
+ if (s.speedDecelerationRatioAbs[axis] < 0.05) {
+ s.lastFlickSpeed[axis] = 0;
+ s.backAnimStarted[axis] = true;
+
+ _animateProp(
+ 'bounceZoomPan' + axis,
+ _panOffset[axis],
+ s.backAnimDestination[axis],
+ speed || 300,
+ framework.easing.sine.out,
+ function (pos) {
+ _panOffset[axis] = pos;
+ _applyCurrentZoomPan();
+ }
+ );
+ }
+ }
+ }
+ },
+
+ // Reduces the speed by slowDownRatio (per 10ms)
+ calculateAnimOffset: function (axis) {
+ if (!s.backAnimStarted[axis]) {
+ s.speedDecelerationRatio[axis] =
+ s.speedDecelerationRatio[axis] *
+ (s.slowDownRatio[axis] +
+ s.slowDownRatioReverse[axis] -
+ (s.slowDownRatioReverse[axis] * s.timeDiff) / 10);
+
+ s.speedDecelerationRatioAbs[axis] = Math.abs(
+ s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]
+ );
+ s.distanceOffset[axis] =
+ s.lastFlickSpeed[axis] *
+ s.speedDecelerationRatio[axis] *
+ s.timeDiff;
+ _panOffset[axis] += s.distanceOffset[axis];
+ }
+ },
+
+ panAnimLoop: function () {
+ if (_animations.zoomPan) {
+ _animations.zoomPan.raf = _requestAF(s.panAnimLoop);
+
+ s.now = _getCurrentTime();
+ s.timeDiff = s.now - s.lastNow;
+ s.lastNow = s.now;
+
+ s.calculateAnimOffset('x');
+ s.calculateAnimOffset('y');
+
+ _applyCurrentZoomPan();
+
+ s.calculateOverBoundsAnimOffset('x');
+ s.calculateOverBoundsAnimOffset('y');
+
+ if (
+ s.speedDecelerationRatioAbs.x < 0.05 &&
+ s.speedDecelerationRatioAbs.y < 0.05
+ ) {
+ // round pan position
+ _panOffset.x = Math.round(_panOffset.x);
+ _panOffset.y = Math.round(_panOffset.y);
+ _applyCurrentZoomPan();
+
+ _stopAnimation('zoomPan');
+ return;
+ }
+ }
+ },
+ };
+ return s;
+ },
+ _completePanGesture = function (animData) {
+ // calculate swipe speed for Y axis (paanning)
+ animData.calculateSwipeSpeed('y');
+
+ _currPanBounds = self.currItem.bounds;
+
+ animData.backAnimDestination = {};
+ animData.backAnimStarted = {};
+
+ // Avoid acceleration animation if speed is too low
+ if (
+ Math.abs(animData.lastFlickSpeed.x) <= 0.05 &&
+ Math.abs(animData.lastFlickSpeed.y) <= 0.05
+ ) {
+ animData.speedDecelerationRatioAbs.x =
+ animData.speedDecelerationRatioAbs.y = 0;
+
+ // Run pan drag release animation. E.g. if you drag image and release finger without momentum.
+ animData.calculateOverBoundsAnimOffset('x');
+ animData.calculateOverBoundsAnimOffset('y');
+ return true;
+ }
+
+ // Animation loop that controls the acceleration after pan gesture ends
+ _registerStartAnimation('zoomPan');
+ animData.lastNow = _getCurrentTime();
+ animData.panAnimLoop();
+ },
+ _finishSwipeMainScrollGesture = function (gestureType, _releaseAnimData) {
+ var itemChanged;
+ if (!_mainScrollAnimating) {
+ _currZoomedItemIndex = _currentItemIndex;
+ }
+
+ var itemsDiff;
+
+ if (gestureType === 'swipe') {
+ var totalShiftDist = _currPoint.x - _startPoint.x,
+ isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;
+
+ // if container is shifted for more than MIN_SWIPE_DISTANCE,
+ // and last flick gesture was in right direction
+ if (
+ totalShiftDist > MIN_SWIPE_DISTANCE &&
+ (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)
+ ) {
+ // go to prev item
+ itemsDiff = -1;
+ } else if (
+ totalShiftDist < -MIN_SWIPE_DISTANCE &&
+ (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)
+ ) {
+ // go to next item
+ itemsDiff = 1;
+ }
+ }
+
+ var nextCircle;
+
+ if (itemsDiff) {
+ _currentItemIndex += itemsDiff;
+
+ if (_currentItemIndex < 0) {
+ _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;
+ nextCircle = true;
+ } else if (_currentItemIndex >= _getNumItems()) {
+ _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;
+ nextCircle = true;
+ }
+
+ if (!nextCircle || _options.loop) {
+ _indexDiff += itemsDiff;
+ _currPositionIndex -= itemsDiff;
+ itemChanged = true;
+ }
+ }
+
+ var animateToX = _slideSize.x * _currPositionIndex;
+ var animateToDist = Math.abs(animateToX - _mainScrollPos.x);
+ var finishAnimDuration;
+
+ if (
+ !itemChanged &&
+ animateToX > _mainScrollPos.x !==
+ _releaseAnimData.lastFlickSpeed.x > 0
+ ) {
+ // "return to current" duration, e.g. when dragging from slide 0 to -1
+ finishAnimDuration = 333;
+ } else {
+ finishAnimDuration =
+ Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0
+ ? animateToDist /
+ Math.abs(_releaseAnimData.lastFlickSpeed.x)
+ : 333;
+
+ finishAnimDuration = Math.min(finishAnimDuration, 400);
+ finishAnimDuration = Math.max(finishAnimDuration, 250);
+ }
+
+ if (_currZoomedItemIndex === _currentItemIndex) {
+ itemChanged = false;
+ }
+
+ _mainScrollAnimating = true;
+
+ _shout('mainScrollAnimStart');
+
+ _animateProp(
+ 'mainScroll',
+ _mainScrollPos.x,
+ animateToX,
+ finishAnimDuration,
+ framework.easing.cubic.out,
+ _moveMainScroll,
+ function () {
+ _stopAllAnimations();
+ _mainScrollAnimating = false;
+ _currZoomedItemIndex = -1;
+
+ if (itemChanged || _currZoomedItemIndex !== _currentItemIndex) {
+ self.updateCurrItem();
+ }
+
+ _shout('mainScrollAnimComplete');
+ }
+ );
+
+ if (itemChanged) {
+ self.updateCurrItem(true);
+ }
+
+ return itemChanged;
+ },
+ _calculateZoomLevel = function (touchesDistance) {
+ return (1 / _startPointsDistance) * touchesDistance * _startZoomLevel;
+ },
+ // Resets zoom if it's out of bounds
+ _completeZoomGesture = function () {
+ var destZoomLevel = _currZoomLevel,
+ minZoomLevel = _getMinZoomLevel(),
+ maxZoomLevel = _getMaxZoomLevel();
+
+ if (_currZoomLevel < minZoomLevel) {
+ destZoomLevel = minZoomLevel;
+ } else if (_currZoomLevel > maxZoomLevel) {
+ destZoomLevel = maxZoomLevel;
+ }
+
+ var destOpacity = 1,
+ onUpdate,
+ initialOpacity = _bgOpacity;
+
+ if (
+ _opacityChanged &&
+ !_isZoomingIn &&
+ !_wasOverInitialZoom &&
+ _currZoomLevel < minZoomLevel
+ ) {
+ //_closedByScroll = true;
+ self.close();
+ return true;
+ }
+
+ if (_opacityChanged) {
+ onUpdate = function (now) {
+ _applyBgOpacity(
+ (destOpacity - initialOpacity) * now + initialOpacity
+ );
+ };
+ }
+
+ self.zoomTo(
+ destZoomLevel,
+ 0,
+ 200,
+ framework.easing.cubic.out,
+ onUpdate
+ );
+ return true;
+ };
+
+_registerModule('Gestures', {
+ publicMethods: {
+ initGestures: function () {
+ // helper function that builds touch/pointer/mouse events
+ var addEventNames = function (pref, down, move, up, cancel) {
+ _dragStartEvent = pref + down;
+ _dragMoveEvent = pref + move;
+ _dragEndEvent = pref + up;
+ if (cancel) {
+ _dragCancelEvent = pref + cancel;
+ } else {
+ _dragCancelEvent = '';
+ }
+ };
+
+ _pointerEventEnabled = _features.pointerEvent;
+ if (_pointerEventEnabled && _features.touch) {
+ // we don't need touch events, if browser supports pointer events
+ _features.touch = false;
+ }
+
+ if (_pointerEventEnabled) {
+ if (navigator.msPointerEnabled) {
+ // IE10 pointer events are case-sensitive
+ addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
+ } else {
+ addEventNames('pointer', 'down', 'move', 'up', 'cancel');
+ }
+ } else if (_features.touch) {
+ addEventNames('touch', 'start', 'move', 'end', 'cancel');
+ _likelyTouchDevice = true;
+ } else {
+ addEventNames('mouse', 'down', 'move', 'up');
+ }
+
+ _upMoveEvents =
+ _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;
+ _downEvents = _dragStartEvent;
+
+ if (_pointerEventEnabled && !_likelyTouchDevice) {
+ _likelyTouchDevice =
+ navigator.maxTouchPoints > 1 ||
+ navigator.msMaxTouchPoints > 1;
+ }
+ // make variable public
+ self.likelyTouchDevice = _likelyTouchDevice;
+
+ _globalEventHandlers[_dragStartEvent] = _onDragStart;
+ _globalEventHandlers[_dragMoveEvent] = _onDragMove;
+ _globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken
+
+ if (_dragCancelEvent) {
+ _globalEventHandlers[_dragCancelEvent] =
+ _globalEventHandlers[_dragEndEvent];
+ }
+
+ // Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.
+ if (_features.touch) {
+ _downEvents += ' mousedown';
+ _upMoveEvents += ' mousemove mouseup';
+ _globalEventHandlers.mousedown =
+ _globalEventHandlers[_dragStartEvent];
+ _globalEventHandlers.mousemove =
+ _globalEventHandlers[_dragMoveEvent];
+ _globalEventHandlers.mouseup =
+ _globalEventHandlers[_dragEndEvent];
+ }
+
+ if (!_likelyTouchDevice) {
+ // don't allow pan to next slide from zoomed state on Desktop
+ _options.allowPanToNext = false;
+ }
+ },
+ },
+});
+
+
+/*>>gestures*/
+
+/*>>show-hide-transition*/
+/**
+ * show-hide-transition.js:
+ *
+ * Manages initial opening or closing transition.
+ *
+ * If you're not planning to use transition for gallery at all,
+ * you may set options hideAnimationDuration and showAnimationDuration to 0,
+ * and just delete startAnimation function.
+ *
+ */
+
+var _showOrHideTimeout,
+ _showOrHide = function (item, img, out, completeFn) {
+ if (_showOrHideTimeout) {
+ clearTimeout(_showOrHideTimeout);
+ }
+
+ _initialZoomRunning = true;
+ _initialContentSet = true;
+
+ // dimensions of small thumbnail {x:,y:,w:}.
+ // Height is optional, as calculated based on large image.
+ var thumbBounds;
+ if (item.initialLayout) {
+ thumbBounds = item.initialLayout;
+ item.initialLayout = null;
+ } else {
+ thumbBounds =
+ _options.getThumbBoundsFn &&
+ _options.getThumbBoundsFn(_currentItemIndex);
+ }
+
+ var duration = out
+ ? _options.hideAnimationDuration
+ : _options.showAnimationDuration;
+
+ var onComplete = function () {
+ _stopAnimation('initialZoom');
+ if (!out) {
+ _applyBgOpacity(1);
+ if (img) {
+ img.style.display = 'block';
+ }
+ framework.addClass(template, 'pswp--animated-in');
+ _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));
+ } else {
+ self.template.removeAttribute('style');
+ self.bg.removeAttribute('style');
+ }
+
+ if (completeFn) {
+ completeFn();
+ }
+ _initialZoomRunning = false;
+ };
+
+ // if bounds aren't provided, just open gallery without animation
+ if (!duration || !thumbBounds || thumbBounds.x === undefined) {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
+
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
+
+ template.style.opacity = out ? 0 : 1;
+ _applyBgOpacity(1);
+
+ if (duration) {
+ setTimeout(function () {
+ onComplete();
+ }, duration);
+ } else {
+ onComplete();
+ }
+
+ return;
+ }
+
+ var startAnimation = function () {
+ var closeWithRaf = _closedByScroll,
+ fadeEverything =
+ !self.currItem.src ||
+ self.currItem.loadError ||
+ _options.showHideOpacity;
+
+ // apply hw-acceleration to image
+ if (item.miniImg) {
+ item.miniImg.style.webkitBackfaceVisibility = 'hidden';
+ }
+
+ if (!out) {
+ _currZoomLevel = thumbBounds.w / item.w;
+ _panOffset.x = thumbBounds.x;
+ _panOffset.y = thumbBounds.y - _initalWindowScrollY;
+
+ self[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;
+ _applyCurrentZoomPan();
+ }
+
+ _registerStartAnimation('initialZoom');
+
+ if (out && !closeWithRaf) {
+ framework.removeClass(template, 'pswp--animated-in');
+ }
+
+ if (fadeEverything) {
+ if (out) {
+ framework[(closeWithRaf ? 'remove' : 'add') + 'Class'](
+ template,
+ 'pswp--animate_opacity'
+ );
+ } else {
+ setTimeout(function () {
+ framework.addClass(template, 'pswp--animate_opacity');
+ }, 30);
+ }
+ }
+
+ _showOrHideTimeout = setTimeout(
+ function () {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
+
+ if (!out) {
+ // "in" animation always uses CSS transitions (instead of rAF).
+ // CSS transition work faster here,
+ // as developer may also want to animate other things,
+ // like ui on top of sliding area, which can be animated just via CSS
+
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
+ _applyBgOpacity(1);
+
+ if (fadeEverything) {
+ template.style.opacity = 1;
+ } else {
+ _applyBgOpacity(1);
+ }
+
+ _showOrHideTimeout = setTimeout(
+ onComplete,
+ duration + 20
+ );
+ } else {
+ // "out" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position
+ var destZoomLevel = thumbBounds.w / item.w,
+ initialPanOffset = {
+ x: _panOffset.x,
+ y: _panOffset.y,
+ },
+ initialZoomLevel = _currZoomLevel,
+ initalBgOpacity = _bgOpacity,
+ onUpdate = function (now) {
+ if (now === 1) {
+ _currZoomLevel = destZoomLevel;
+ _panOffset.x = thumbBounds.x;
+ _panOffset.y =
+ thumbBounds.y - _currentWindowScrollY;
+ } else {
+ _currZoomLevel =
+ (destZoomLevel - initialZoomLevel) *
+ now +
+ initialZoomLevel;
+ _panOffset.x =
+ (thumbBounds.x - initialPanOffset.x) *
+ now +
+ initialPanOffset.x;
+ _panOffset.y =
+ (thumbBounds.y -
+ _currentWindowScrollY -
+ initialPanOffset.y) *
+ now +
+ initialPanOffset.y;
+ }
+
+ _applyCurrentZoomPan();
+ if (fadeEverything) {
+ template.style.opacity = 1 - now;
+ } else {
+ _applyBgOpacity(
+ initalBgOpacity - now * initalBgOpacity
+ );
+ }
+ };
+
+ if (closeWithRaf) {
+ _animateProp(
+ 'initialZoom',
+ 0,
+ 1,
+ duration,
+ framework.easing.cubic.out,
+ onUpdate,
+ onComplete
+ );
+ } else {
+ onUpdate(1);
+ _showOrHideTimeout = setTimeout(
+ onComplete,
+ duration + 20
+ );
+ }
+ }
+ },
+ out ? 25 : 90
+ ); // Main purpose of this delay is to give browser time to paint and
+ // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).
+ // Which avoids lag at the beginning of scale transition.
+ };
+ startAnimation();
+ };
+
+
+/*>>show-hide-transition*/
+
+/*>>items-controller*/
+/**
+ *
+ * Controller manages gallery items, their dimensions, and their content.
+ *
+ */
+
+var _items,
+ _tempPanAreaSize = {},
+ _imagesToAppendPool = [],
+ _initialContentSet,
+ _initialZoomRunning,
+ _controllerDefaultOptions = {
+ index: 0,
+ errorMsg:
+ '',
+ forceProgressiveLoading: false, // TODO
+ preload: [1, 1],
+ getNumItemsFn: function () {
+ return _items.length;
+ },
+ };
+
+var _getItemAt,
+ _getNumItems,
+ _initialIsLoop,
+ _getZeroBounds = function () {
+ return {
+ center: { x: 0, y: 0 },
+ max: { x: 0, y: 0 },
+ min: { x: 0, y: 0 },
+ };
+ },
+ _calculateSingleItemPanBounds = function (
+ item,
+ realPanElementW,
+ realPanElementH
+ ) {
+ var bounds = item.bounds;
+
+ // position of element when it's centered
+ bounds.center.x = Math.round(
+ (_tempPanAreaSize.x - realPanElementW) / 2
+ );
+ bounds.center.y =
+ Math.round((_tempPanAreaSize.y - realPanElementH) / 2) +
+ item.vGap.top;
+
+ // maximum pan position
+ bounds.max.x =
+ realPanElementW > _tempPanAreaSize.x
+ ? Math.round(_tempPanAreaSize.x - realPanElementW)
+ : bounds.center.x;
+
+ bounds.max.y =
+ realPanElementH > _tempPanAreaSize.y
+ ? Math.round(_tempPanAreaSize.y - realPanElementH) +
+ item.vGap.top
+ : bounds.center.y;
+
+ // minimum pan position
+ bounds.min.x =
+ realPanElementW > _tempPanAreaSize.x ? 0 : bounds.center.x;
+ bounds.min.y =
+ realPanElementH > _tempPanAreaSize.y
+ ? item.vGap.top
+ : bounds.center.y;
+ },
+ _calculateItemSize = function (item, viewportSize, zoomLevel) {
+ if (item.src && !item.loadError) {
+ var isInitial = !zoomLevel;
+
+ if (isInitial) {
+ if (!item.vGap) {
+ item.vGap = { top: 0, bottom: 0 };
+ }
+ // allows overriding vertical margin for individual items
+ _shout('parseVerticalMargin', item);
+ }
+
+ _tempPanAreaSize.x = viewportSize.x;
+ _tempPanAreaSize.y =
+ viewportSize.y - item.vGap.top - item.vGap.bottom;
+
+ if (isInitial) {
+ var hRatio = _tempPanAreaSize.x / item.w;
+ var vRatio = _tempPanAreaSize.y / item.h;
+
+ item.fitRatio = hRatio < vRatio ? hRatio : vRatio;
+ //item.fillRatio = hRatio > vRatio ? hRatio : vRatio;
+
+ var scaleMode = _options.scaleMode;
+
+ if (scaleMode === 'orig') {
+ zoomLevel = 1;
+ } else if (scaleMode === 'fit') {
+ zoomLevel = item.fitRatio;
+ }
+
+ if (zoomLevel > 1) {
+ zoomLevel = 1;
+ }
+
+ item.initialZoomLevel = zoomLevel;
+
+ if (!item.bounds) {
+ // reuse bounds object
+ item.bounds = _getZeroBounds();
+ }
+ }
+
+ if (!zoomLevel) {
+ return;
+ }
+
+ _calculateSingleItemPanBounds(
+ item,
+ item.w * zoomLevel,
+ item.h * zoomLevel
+ );
+
+ if (isInitial && zoomLevel === item.initialZoomLevel) {
+ item.initialPosition = item.bounds.center;
+ }
+
+ return item.bounds;
+ } else {
+ item.w = item.h = 0;
+ item.initialZoomLevel = item.fitRatio = 1;
+ item.bounds = _getZeroBounds();
+ item.initialPosition = item.bounds.center;
+
+ // if it's not image, we return zero bounds (content is not zoomable)
+ return item.bounds;
+ }
+ },
+ _appendImage = function (
+ index,
+ item,
+ baseDiv,
+ img,
+ preventAnimation,
+ keepPlaceholder
+ ) {
+ if (item.loadError) {
+ return;
+ }
+
+ if (img) {
+ item.imageAppended = true;
+ _setImageSize(
+ item,
+ img,
+ item === self.currItem && _renderMaxResolution
+ );
+
+ baseDiv.appendChild(img);
+
+ if (keepPlaceholder) {
+ setTimeout(function () {
+ if (item && item.loaded && item.placeholder) {
+ item.placeholder.style.display = 'none';
+ item.placeholder = null;
+ }
+ }, 500);
+ }
+ }
+ },
+ _preloadImage = function (item) {
+ item.loading = true;
+ item.loaded = false;
+ var img = (item.img = framework.createEl('pswp__img', 'img'));
+ img.oncontextmenu=(e)=>e.preventDefault();
+ var onComplete = function () {
+ item.loading = false;
+ item.loaded = true;
+
+ if (item.loadComplete) {
+ item.loadComplete(item);
+ } else {
+ item.img = null; // no need to store image object
+ }
+ img.onload = img.onerror = null;
+ img = null;
+ };
+ img.onload = onComplete;
+ img.onerror = function () {
+ item.loadError = true;
+ onComplete();
+ };
+
+ img.src = item.src; // + '?a=' + Math.random();
+
+ return img;
+ },
+ _checkForError = function (item, cleanUp) {
+ if (item.src && item.loadError && item.container) {
+ if (cleanUp) {
+ item.container.innerHTML = '';
+ }
+
+ item.container.innerHTML = _options.errorMsg.replace(
+ '%url%',
+ item.src
+ );
+ return true;
+ }
+ },
+ _setImageSize = function (item, img, maxRes) {
+ if (!item.src || !item.container) {
+ return;
+ }
+
+ if (!img) {
+ img = item.container.lastChild;
+ }
+
+ var w = maxRes ? item.w : Math.round(item.w * item.fitRatio),
+ h = maxRes ? item.h : Math.round(item.h * item.fitRatio);
+
+ if (item.placeholder && !item.loaded) {
+ item.placeholder.style.width = w + 'px';
+ item.placeholder.style.height = h + 'px';
+ }
+
+ img.style.width = w + 'px';
+ img.style.height = h + 'px';
+ },
+ _appendImagesPool = function () {
+ if (_imagesToAppendPool.length) {
+ var poolItem;
+
+ for (var i = 0; i < _imagesToAppendPool.length; i++) {
+ poolItem = _imagesToAppendPool[i];
+ if (poolItem.holder.index === poolItem.index) {
+ _appendImage(
+ poolItem.index,
+ poolItem.item,
+ poolItem.baseDiv,
+ poolItem.img,
+ false,
+ poolItem.clearPlaceholder
+ );
+ }
+ }
+ _imagesToAppendPool = [];
+ }
+ };
+
+_registerModule('Controller', {
+ publicMethods: {
+ lazyLoadItem: function (index) {
+ index = _getLoopedId(index);
+ var item = _getItemAt(index);
+ if (!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {
+ return;
+ }
+
+ _shout('gettingData', index, item);
+
+ if (!item.src) {
+ return;
+ }
+
+ _preloadImage(item);
+ },
+ initController: function () {
+ framework.extend(_options, _controllerDefaultOptions, true);
+ self.items = _items = items;
+ _getItemAt = self.getItemAt;
+ _getNumItems = _options.getNumItemsFn; //self.getNumItems;
+
+ _initialIsLoop = _options.loop;
+ if (_getNumItems() < 3) {
+ _options.loop = false; // disable loop if less then 3 items
+ }
+
+ _listen('beforeChange', function (diff) {
+ self.lazyLoadItem(_currentItemIndex);
+ });
+
+ _listen('initialLayout', function () {
+ self.currItem.initialLayout =
+ _options.getThumbBoundsFn &&
+ _options.getThumbBoundsFn(_currentItemIndex);
+ });
+
+ _listen('mainScrollAnimComplete', _appendImagesPool);
+ _listen('initialZoomInEnd', _appendImagesPool);
+
+ _listen('destroy', function () {
+ var item;
+ for (var i = 0; i < _items.length; i++) {
+ item = _items[i];
+ // remove reference to DOM elements, for GC
+ if (item.container) {
+ item.container = null;
+ }
+ if (item.placeholder) {
+ item.placeholder = null;
+ }
+ if (item.img) {
+ item.img = null;
+ }
+ if (item.preloader) {
+ item.preloader = null;
+ }
+ if (item.loadError) {
+ item.loaded = item.loadError = false;
+ }
+ }
+ _imagesToAppendPool = null;
+ });
+ },
+
+ getItemAt: function (index) {
+ if (index >= 0) {
+ return _items[index] !== undefined ? _items[index] : false;
+ }
+ return false;
+ },
+
+ allowProgressiveImg: function () {
+ // 1. Progressive image loading isn't working on webkit/blink
+ // when hw-acceleration (e.g. translateZ) is applied to IMG element.
+ // That's why in PhotoSwipe parent element gets zoom transform, not image itself.
+ //
+ // 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.
+ // That's why it's disabled on touch devices (mainly because of swipe transition)
+ //
+ // 3. Progressive image loading sometimes doesn't work in IE (up to 11).
+
+ // Don't allow progressive loading on non-large touch devices
+ return (
+ _options.forceProgressiveLoading ||
+ !_likelyTouchDevice ||
+ _options.mouseUsed ||
+ screen.width > 1200
+ );
+ // 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)
+ },
+
+ setContent: function (holder, index) {
+ if (_options.loop) {
+ index = _getLoopedId(index);
+ }
+
+ var prevItem = self.getItemAt(holder.index);
+ if (prevItem) {
+ prevItem.container = null;
+ }
+
+ var item = self.getItemAt(index),
+ img;
+
+ if (!item) {
+ holder.el.innerHTML = '';
+ return;
+ }
+
+ // allow to override data
+ if (index === _currentItemIndex) {
+ _shout('gettingData', index, item);
+ }
+
+ holder.index = index;
+ holder.item = item;
+
+ // base container DIV is created only once for each of 3 holders
+ var baseDiv = (item.container =
+ framework.createEl('pswp__zoom-wrap'));
+
+ if (!item.src && item.html) {
+ if (item.html.tagName) {
+ baseDiv.appendChild(item.html);
+ } else {
+ baseDiv.innerHTML = item.html;
+ }
+ }
+
+ _checkForError(item);
+
+ _calculateItemSize(item, _viewportSize);
+
+ if (item.src && !item.loadError && !item.loaded) {
+ item.loadComplete = function (item) {
+ // gallery closed before image finished loading
+ if (!_isOpen) {
+ return;
+ }
+
+ // check if holder hasn't changed while image was loading
+ if (holder && holder.index === index) {
+ if (_checkForError(item, true)) {
+ item.loadComplete = item.img = null;
+ _calculateItemSize(item, _viewportSize);
+ _applyZoomPanToItem(item);
+
+ if (holder.index === _currentItemIndex) {
+ // recalculate dimensions
+ self.updateCurrZoomItem();
+ }
+ return;
+ }
+ if (!item.imageAppended) {
+ if (
+ _features.transform &&
+ (_mainScrollAnimating || _initialZoomRunning)
+ ) {
+ _imagesToAppendPool.push({
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder,
+ clearPlaceholder: true,
+ });
+ } else {
+ _appendImage(
+ index,
+ item,
+ baseDiv,
+ item.img,
+ _mainScrollAnimating || _initialZoomRunning,
+ true
+ );
+ }
+ } else {
+ // remove preloader & mini-img
+ if (!_initialZoomRunning && item.placeholder) {
+ item.placeholder.style.display = 'none';
+ item.placeholder = null;
+ }
+ }
+ }
+
+ item.loadComplete = null;
+ item.img = null; // no need to store image element after it's added
+
+ _shout('imageLoadComplete', index, item);
+ };
+
+ if (framework.features.transform) {
+ var placeholderClassName =
+ 'pswp__img pswp__img--placeholder';
+ placeholderClassName += item.msrc
+ ? ''
+ : ' pswp__img--placeholder--blank';
+
+ var placeholder = framework.createEl(
+ placeholderClassName,
+ item.msrc ? 'img' : ''
+ );
+ placeholder.oncontextmenu=(e)=>e.preventDefault();
+ if (item.msrc) {
+ placeholder.src = item.msrc;
+ }
+
+ _setImageSize(item, placeholder);
+
+ baseDiv.appendChild(placeholder);
+ item.placeholder = placeholder;
+ }
+
+ if (self.allowProgressiveImg()) {
+ // just append image
+ if (!_initialContentSet && _features.transform) {
+ _imagesToAppendPool.push({
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder,
+ });
+ } else {
+ _appendImage(
+ index,
+ item,
+ baseDiv,
+ item.img,
+ true,
+ true
+ );
+ }
+ }
+ } else if (item.src && !item.loadError) {
+ // image object is created every time, due to bugs of image loading & delay when switching images
+ img = framework.createEl('pswp__img', 'img');
+ img.style.opacity = 1;
+ img.src = item.src;
+ img.oncontextmenu=(e)=>e.preventDefault();
+ _setImageSize(item, img);
+ _appendImage(index, item, baseDiv, img, true);
+ }
+
+ if (!_initialContentSet && index === _currentItemIndex) {
+ _currZoomElementStyle = baseDiv.style;
+ if (!item.initialPosition) {
+ item.initialPosition = { x: 48, y: 44 };
+ item.bounds = {
+ center: {
+ x: 48,
+ y: 44,
+ },
+ max: {
+ x: 48,
+ y: 44,
+ },
+ min: {
+ x: 48,
+ y: 44,
+ },
+ };
+ item.h = window.innerHeight;
+ item.w = window.innerWidth;
+ item.fitRatio = 0.9067796610169492;
+ item.initialZoomLevel = 0.9067796610169492;
+ }
+ _showOrHide(item, img || item.img);
+ } else {
+ _applyZoomPanToItem(item);
+ }
+
+ holder.el.innerHTML = '';
+ holder.el.appendChild(baseDiv);
+ },
+
+ cleanSlide: function (item) {
+ if (item.img) {
+ item.img.onload = item.img.onerror = null;
+ }
+ item.loaded = item.loading = item.img = item.imageAppended = false;
+ },
+ },
+});
+
+
+/*>>items-controller*/
+
+/*>>tap*/
+/**
+ * tap.js:
+ *
+ * Displatches tap and double-tap events.
+ *
+ */
+
+var tapTimer,
+ tapReleasePoint = {},
+ _dispatchTapEvent = function (origEvent, releasePoint, pointerType) {
+ var e = document.createEvent('CustomEvent'),
+ eDetail = {
+ origEvent: origEvent,
+ target: origEvent.target,
+ releasePoint: releasePoint,
+ pointerType: pointerType || 'touch',
+ };
+
+ e.initCustomEvent('pswpTap', true, true, eDetail);
+ origEvent.target.dispatchEvent(e);
+ };
+
+_registerModule('Tap', {
+ publicMethods: {
+ initTap: function () {
+ _listen('firstTouchStart', self.onTapStart);
+ _listen('touchRelease', self.onTapRelease);
+ _listen('destroy', function () {
+ tapReleasePoint = {};
+ tapTimer = null;
+ });
+ },
+ onTapStart: function (touchList) {
+ if (touchList.length > 1) {
+ clearTimeout(tapTimer);
+ tapTimer = null;
+ }
+ },
+ onTapRelease: function (e, releasePoint) {
+ if (!releasePoint) {
+ return;
+ }
+
+ if (!_moved && !_isMultitouch && !_numAnimations) {
+ var p0 = releasePoint;
+ if (tapTimer) {
+ clearTimeout(tapTimer);
+ tapTimer = null;
+
+ // Check if taped on the same place
+ if (_isNearbyPoints(p0, tapReleasePoint)) {
+ _shout('doubleTap', p0);
+ return;
+ }
+ }
+
+ if (releasePoint.type === 'mouse') {
+ _dispatchTapEvent(e, releasePoint, 'mouse');
+ return;
+ }
+
+ var clickedTagName = e.target.tagName.toUpperCase();
+ // avoid double tap delay on buttons and elements that have class pswp__single-tap
+ if (
+ clickedTagName === 'BUTTON' ||
+ framework.hasClass(e.target, 'pswp__single-tap')
+ ) {
+ _dispatchTapEvent(e, releasePoint);
+ return;
+ }
+
+ _equalizePoints(tapReleasePoint, p0);
+
+ tapTimer = setTimeout(function () {
+ _dispatchTapEvent(e, releasePoint);
+ tapTimer = null;
+ }, 300);
+ }
+ },
+ },
+});
+
+
+/*>>tap*/
+
+/*>>desktop-zoom*/
+/**
+ *
+ * desktop-zoom.js:
+ *
+ * - Binds mousewheel event for paning zoomed image.
+ * - Manages "dragging", "zoomed-in", "zoom-out" classes.
+ * (which are used for cursors and zoom icon)
+ * - Adds toggleDesktopZoom function.
+ *
+ */
+
+var _wheelDelta;
+
+_registerModule('DesktopZoom', {
+ publicMethods: {
+ initDesktopZoom: function () {
+ if (_oldIE) {
+ // no zoom for old IE (<=8)
+ return;
+ }
+
+ if (_likelyTouchDevice) {
+ // if detected hardware touch support, we wait until mouse is used,
+ // and only then apply desktop-zoom features
+ _listen('mouseUsed', function () {
+ self.setupDesktopZoom();
+ });
+ } else {
+ self.setupDesktopZoom(true);
+ }
+ },
+
+ setupDesktopZoom: function (onInit) {
+ _wheelDelta = {};
+
+ var events = 'wheel mousewheel DOMMouseScroll';
+
+ _listen('bindEvents', function () {
+ framework.bind(template, events, self.handleMouseWheel);
+ });
+
+ _listen('unbindEvents', function () {
+ if (_wheelDelta) {
+ framework.unbind(template, events, self.handleMouseWheel);
+ }
+ });
+
+ self.mouseZoomedIn = false;
+
+ var hasDraggingClass,
+ updateZoomable = function () {
+ if (self.mouseZoomedIn) {
+ framework.removeClass(template, 'pswp--zoomed-in');
+ self.mouseZoomedIn = false;
+ }
+ if (_currZoomLevel < 1) {
+ framework.addClass(template, 'pswp--zoom-allowed');
+ } else {
+ framework.removeClass(template, 'pswp--zoom-allowed');
+ }
+ removeDraggingClass();
+ },
+ removeDraggingClass = function () {
+ if (hasDraggingClass) {
+ framework.removeClass(template, 'pswp--dragging');
+ hasDraggingClass = false;
+ }
+ };
+
+ _listen('resize', updateZoomable);
+ _listen('afterChange', updateZoomable);
+ _listen('pointerDown', function () {
+ if (self.mouseZoomedIn) {
+ hasDraggingClass = true;
+ framework.addClass(template, 'pswp--dragging');
+ }
+ });
+ _listen('pointerUp', removeDraggingClass);
+
+ if (!onInit) {
+ updateZoomable();
+ }
+ },
+
+ handleMouseWheel: function (e) {
+ if (_currZoomLevel <= self.currItem.fitRatio) {
+ if (_options.modal) {
+ if (
+ !_options.closeOnScroll ||
+ _numAnimations ||
+ _isDragging
+ ) {
+ e.preventDefault();
+ } else if (_transformKey && Math.abs(e.deltaY) > 2) {
+ // close PhotoSwipe
+ // if browser supports transforms & scroll changed enough
+ _closedByScroll = true;
+ self.close();
+ }
+ }
+ return true;
+ }
+
+ // allow just one event to fire
+ e.stopPropagation();
+
+ // https://developer.mozilla.org/en-US/docs/Web/Events/wheel
+ _wheelDelta.x = 0;
+
+ if ('deltaX' in e) {
+ if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {
+ // 18 - average line height
+ _wheelDelta.x = e.deltaX * 18;
+ _wheelDelta.y = e.deltaY * 18;
+ } else {
+ _wheelDelta.x = e.deltaX;
+ _wheelDelta.y = e.deltaY;
+ }
+ } else if ('wheelDelta' in e) {
+ if (e.wheelDeltaX) {
+ _wheelDelta.x = -0.16 * e.wheelDeltaX;
+ }
+ if (e.wheelDeltaY) {
+ _wheelDelta.y = -0.16 * e.wheelDeltaY;
+ } else {
+ _wheelDelta.y = -0.16 * e.wheelDelta;
+ }
+ } else if ('detail' in e) {
+ _wheelDelta.y = e.detail;
+ } else {
+ return;
+ }
+
+ _calculatePanBounds(_currZoomLevel, true);
+
+ var newPanX = _panOffset.x - _wheelDelta.x,
+ newPanY = _panOffset.y - _wheelDelta.y;
+
+ // only prevent scrolling in nonmodal mode when not at edges
+ if (
+ _options.modal ||
+ (newPanX <= _currPanBounds.min.x &&
+ newPanX >= _currPanBounds.max.x &&
+ newPanY <= _currPanBounds.min.y &&
+ newPanY >= _currPanBounds.max.y)
+ ) {
+ e.preventDefault();
+ }
+
+ // TODO: use rAF instead of mousewheel?
+ self.panTo(newPanX, newPanY);
+ },
+
+ toggleDesktopZoom: function (centerPoint) {
+ centerPoint = centerPoint || {
+ x: _viewportSize.x / 2 + _offset.x,
+ y: _viewportSize.y / 2 + _offset.y,
+ };
+
+ var doubleTapZoomLevel = _options.getDoubleTapZoom(
+ true,
+ self.currItem
+ );
+ var zoomOut = _currZoomLevel === doubleTapZoomLevel;
+
+ self.mouseZoomedIn = !zoomOut;
+
+ self.zoomTo(
+ zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel,
+ centerPoint,
+ 333
+ );
+ framework[(!zoomOut ? 'add' : 'remove') + 'Class'](
+ template,
+ 'pswp--zoomed-in'
+ );
+ },
+ },
+});
+
+
+/*>>desktop-zoom*/
+
+/*>>history*/
+/**
+ *
+ * history.js:
+ *
+ * - Back button to close gallery.
+ *
+ * - Unique URL for each slide: example.com/&pid=1&gid=3
+ * (where PID is picture index, and GID and gallery index)
+ *
+ * - Switch URL when slides change.
+ *
+ */
+
+var _historyDefaultOptions = {
+ history: true,
+ galleryUID: 1,
+};
+
+var _historyUpdateTimeout,
+ _hashChangeTimeout,
+ _hashAnimCheckTimeout,
+ _hashChangedByScript,
+ _hashChangedByHistory,
+ _hashReseted,
+ _initialHash,
+ _historyChanged,
+ _closedFromURL,
+ _urlChangedOnce,
+ _windowLoc,
+ _supportsPushState,
+ _getHash = function () {
+ return _windowLoc.hash.substring(1);
+ },
+ _cleanHistoryTimeouts = function () {
+ if (_historyUpdateTimeout) {
+ clearTimeout(_historyUpdateTimeout);
+ }
+
+ if (_hashAnimCheckTimeout) {
+ clearTimeout(_hashAnimCheckTimeout);
+ }
+ },
+ // pid - Picture index
+ // gid - Gallery index
+ _parseItemIndexFromURL = function () {
+ var hash = _getHash(),
+ params = {};
+
+ if (hash.length < 5) {
+ // pid=1
+ return params;
+ }
+
+ var i,
+ vars = hash.split('&');
+ for (i = 0; i < vars.length; i++) {
+ if (!vars[i]) {
+ continue;
+ }
+ var pair = vars[i].split('=');
+ if (pair.length < 2) {
+ continue;
+ }
+ params[pair[0]] = pair[1];
+ }
+ if (_options.galleryPIDs) {
+ // detect custom pid in hash and search for it among the items collection
+ var searchfor = params.pid;
+ params.pid = 0; // if custom pid cannot be found, fallback to the first item
+ for (i = 0; i < _items.length; i++) {
+ if (_items[i].pid === searchfor) {
+ params.pid = i;
+ break;
+ }
+ }
+ } else {
+ params.pid = parseInt(params.pid, 10) - 1;
+ }
+ if (params.pid < 0) {
+ params.pid = 0;
+ }
+ return params;
+ },
+ _updateHash = function () {
+ if (_hashAnimCheckTimeout) {
+ clearTimeout(_hashAnimCheckTimeout);
+ }
+
+ if (_numAnimations || _isDragging) {
+ // changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation
+ // that's why we update hash only when no animations running
+ _hashAnimCheckTimeout = setTimeout(_updateHash, 500);
+ return;
+ }
+
+ if (_hashChangedByScript) {
+ clearTimeout(_hashChangeTimeout);
+ } else {
+ _hashChangedByScript = true;
+ }
+
+ var pid = _currentItemIndex + 1;
+ var item = _getItemAt(_currentItemIndex);
+ if (item.hasOwnProperty('pid')) {
+ // carry forward any custom pid assigned to the item
+ pid = item.pid;
+ }
+ var newHash =
+ _initialHash +
+ '&' +
+ 'gid=' +
+ _options.galleryUID +
+ '&' +
+ 'pid=' +
+ pid;
+
+ if (!_historyChanged) {
+ if (_windowLoc.hash.indexOf(newHash) === -1) {
+ _urlChangedOnce = true;
+ }
+ // first time - add new hisory record, then just replace
+ }
+
+ var newURL = _windowLoc.href.split('#')[0] + '#' + newHash;
+
+ if (_supportsPushState) {
+ if ('#' + newHash !== window.location.hash) {
+ history[_historyChanged ? 'replaceState' : 'pushState'](
+ '',
+ document.title,
+ newURL
+ );
+ }
+ } else {
+ if (_historyChanged) {
+ _windowLoc.replace(newURL);
+ } else {
+ _windowLoc.hash = newHash;
+ }
+ }
+
+ _historyChanged = true;
+ _hashChangeTimeout = setTimeout(function () {
+ _hashChangedByScript = false;
+ }, 60);
+ };
+
+_registerModule('History', {
+ publicMethods: {
+ initHistory: function () {
+ framework.extend(_options, _historyDefaultOptions, true);
+
+ if (!_options.history) {
+ return;
+ }
+
+ _windowLoc = window.location;
+ _urlChangedOnce = false;
+ _closedFromURL = false;
+ _historyChanged = false;
+ _initialHash = _getHash();
+ _supportsPushState = 'pushState' in history;
+
+ if (_initialHash.indexOf('gid=') > -1) {
+ _initialHash = _initialHash.split('&gid=')[0];
+ _initialHash = _initialHash.split('?gid=')[0];
+ }
+
+ _listen('afterChange', self.updateURL);
+ _listen('unbindEvents', function () {
+ framework.unbind(window, 'hashchange', self.onHashChange);
+ });
+
+ var returnToOriginal = function () {
+ _hashReseted = true;
+ if (!_closedFromURL) {
+ if (_urlChangedOnce) {
+ history.back();
+ } else {
+ if (_initialHash) {
+ _windowLoc.hash = _initialHash;
+ } else {
+ if (_supportsPushState) {
+ // remove hash from url without refreshing it or scrolling to top
+ history.pushState(
+ '',
+ document.title,
+ _windowLoc.pathname + _windowLoc.search
+ );
+ } else {
+ _windowLoc.hash = '';
+ }
+ }
+ }
+ }
+
+ _cleanHistoryTimeouts();
+ };
+
+ _listen('unbindEvents', function () {
+ if (_closedByScroll) {
+ // if PhotoSwipe is closed by scroll, we go "back" before the closing animation starts
+ // this is done to keep the scroll position
+ returnToOriginal();
+ }
+ });
+ _listen('destroy', function () {
+ if (!_hashReseted) {
+ returnToOriginal();
+ }
+ });
+ _listen('firstUpdate', function () {
+ _currentItemIndex = _parseItemIndexFromURL().pid;
+ });
+
+ var index = _initialHash.indexOf('pid=');
+ if (index > -1) {
+ _initialHash = _initialHash.substring(0, index);
+ if (_initialHash.slice(-1) === '&') {
+ _initialHash = _initialHash.slice(0, -1);
+ }
+ }
+
+ setTimeout(function () {
+ if (_isOpen) {
+ // hasn't destroyed yet
+ framework.bind(window, 'hashchange', self.onHashChange);
+ }
+ }, 40);
+ },
+ onHashChange: function () {
+ if (_getHash() === _initialHash) {
+ _closedFromURL = true;
+ self.close();
+ return;
+ }
+ if (!_hashChangedByScript) {
+ _hashChangedByHistory = true;
+ self.goTo(_parseItemIndexFromURL().pid);
+ _hashChangedByHistory = false;
+ }
+ },
+ updateURL: function () {
+ // Delay the update of URL, to avoid lag during transition,
+ // and to not to trigger actions like "refresh page sound" or "blinking favicon" to often
+
+ _cleanHistoryTimeouts();
+
+ if (_hashChangedByHistory) {
+ return;
+ }
+
+ if (!_historyChanged) {
+ _updateHash(); // first time
+ } else {
+ _historyUpdateTimeout = setTimeout(_updateHash, 800);
+ }
+ },
+ },
+});
+
+
+/*>>history*/
+ framework.extend(self, publicMethods); };
+ return PhotoSwipe;
+});
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/photoswipe.min.js b/apps/photos/thirdparty/photoswipe/dist/photoswipe.min.js
new file mode 100644
index 000000000..03708613a
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/dist/photoswipe.min.js
@@ -0,0 +1,4 @@
+/*! PhotoSwipe - v4.1.3 - 2019-01-08
+* http://photoswipe.com
+* Copyright (c) 2019 Dmitry Semenov; */
+!function(a,b){"function"==typeof define&&define.amd?define(b):"object"==typeof exports?module.exports=b():a.PhotoSwipe=b()}(this,function(){"use strict";var a=function(a,b,c,d){var e={features:null,bind:function(a,b,c,d){var e=(d?"remove":"add")+"EventListener";b=b.split(" ");for(var f=0;f0&&(g=parseInt(g[1],10),g>=1&&g<8&&(d.isOldIOSPhone=!0))}var h=f.match(/Android\s([0-9\.]*)/),i=h?h[1]:0;i=parseFloat(i),i>=1&&(i<4.4&&(d.isOldAndroid=!0),d.androidVersion=i),d.isMobileOpera=/opera mini|opera mobi/i.test(f)}for(var j,k,l=["transform","perspective","animationName"],m=["","webkit","Moz","ms","O"],n=0;n<4;n++){c=m[n];for(var o=0;o<3;o++)j=l[o],k=c+(c?j.charAt(0).toUpperCase()+j.slice(1):j),!d[j]&&k in b&&(d[j]=k);c&&!d.raf&&(c=c.toLowerCase(),d.raf=window[c+"RequestAnimationFrame"],d.raf&&(d.caf=window[c+"CancelAnimationFrame"]||window[c+"CancelRequestAnimationFrame"]))}if(!d.raf){var p=0;d.raf=function(a){var b=(new Date).getTime(),c=Math.max(0,16-(b-p)),d=window.setTimeout(function(){a(b+c)},c);return p=b+c,d},d.caf=function(a){clearTimeout(a)}}return d.svg=!!document.createElementNS&&!!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,e.features=d,d}};e.detectFeatures(),e.features.oldIE&&(e.bind=function(a,b,c,d){b=b.split(" ");for(var e,f=(d?"detach":"attach")+"Event",g=function(){c.handleEvent.call(c)},h=0;hb-1?a-b:a<0?b+a:a},Ba={},Ca=function(a,b){return Ba[a]||(Ba[a]=[]),Ba[a].push(b)},Da=function(a){var b=Ba[a];if(b){var c=Array.prototype.slice.call(arguments);c.shift();for(var d=0;df.currItem.fitRatio?ya||(mc(f.currItem,!1,!0),ya=!0):ya&&(mc(f.currItem),ya=!1)),Ga(ea,pa.x,pa.y,s))},Ia=function(a){a.container&&Ga(a.container.style,a.initialPosition.x,a.initialPosition.y,a.initialZoomLevel,a)},Ja=function(a,b){b[E]=u+a+"px, 0px"+v},Ka=function(a,b){if(!i.loop&&b){var c=m+(ta.x*ra-a)/ta.x,d=Math.round(a-tb.x);(c<0&&d>0||c>=ac()-1&&d<0)&&(a=tb.x+d*i.mainScrollEndFriction)}tb.x=a,Ja(a,n)},La=function(a,b){var c=ub[a]-sa[a];return oa[a]+na[a]+c-c*(b/t)},Ma=function(a,b){a.x=b.x,a.y=b.y,b.id&&(a.id=b.id)},Na=function(a){a.x=Math.round(a.x),a.y=Math.round(a.y)},Oa=null,Pa=function(){Oa&&(e.unbind(document,"mousemove",Pa),e.addClass(a,"pswp--has_mouse"),i.mouseUsed=!0,Da("mouseUsed")),Oa=setTimeout(function(){Oa=null},100)},Qa=function(){e.bind(document,"keydown",f),N.transform&&e.bind(f.scrollWrap,"click",f),i.mouseUsed||e.bind(document,"mousemove",Pa),e.bind(window,"resize scroll orientationchange",f),Da("bindEvents")},Ra=function(){e.unbind(window,"resize scroll orientationchange",f),e.unbind(window,"scroll",r.scroll),e.unbind(document,"keydown",f),e.unbind(document,"mousemove",Pa),N.transform&&e.unbind(f.scrollWrap,"click",f),V&&e.unbind(window,p,f),clearTimeout(O),Da("unbindEvents")},Sa=function(a,b){var c=ic(f.currItem,qa,a);return b&&(da=c),c},Ta=function(a){return a||(a=f.currItem),a.initialZoomLevel},Ua=function(a){return a||(a=f.currItem),a.w>0?i.maxSpreadZoom:1},Va=function(a,b,c,d){return d===f.currItem.initialZoomLevel?(c[a]=f.currItem.initialPosition[a],!0):(c[a]=La(a,d),c[a]>b.min[a]?(c[a]=b.min[a],!0):c[a]1?1:a.fitRatio,c=a.container.style,d=b*a.w,e=b*a.h;c.width=d+"px",c.height=e+"px",c.left=a.initialPosition.x+"px",c.top=a.initialPosition.y+"px"},Ha=function(){if(ea){var a=ea,b=f.currItem,c=b.fitRatio>1?1:b.fitRatio,d=c*b.w,e=c*b.h;a.width=d+"px",a.height=e+"px",a.left=pa.x+"px",a.top=pa.y+"px"}}},Xa=function(a){var b="";i.escKey&&27===a.keyCode?b="close":i.arrowKeys&&(37===a.keyCode?b="prev":39===a.keyCode&&(b="next")),b&&(a.ctrlKey||a.altKey||a.shiftKey||a.metaKey||(a.preventDefault?a.preventDefault():a.returnValue=!1,f[b]()))},Ya=function(a){a&&(Y||X||fa||T)&&(a.preventDefault(),a.stopPropagation())},Za=function(){f.setScrollOffset(0,e.getScrollY())},$a={},_a=0,ab=function(a){$a[a]&&($a[a].raf&&I($a[a].raf),_a--,delete $a[a])},bb=function(a){$a[a]&&ab(a),$a[a]||(_a++,$a[a]={})},cb=function(){for(var a in $a)$a.hasOwnProperty(a)&&ab(a)},db=function(a,b,c,d,e,f,g){var h,i=Ea();bb(a);var j=function(){if($a[a]){if(h=Ea()-i,h>=d)return ab(a),f(c),void(g&&g());f((c-b)*e(h/d)+b),$a[a].raf=H(j)}};j()},eb={shout:Da,listen:Ca,viewportSize:qa,options:i,isMainScrollAnimating:function(){return fa},getZoomLevel:function(){return s},getCurrentIndex:function(){return m},isDragging:function(){return V},isZooming:function(){return aa},setScrollOffset:function(a,b){sa.x=a,M=sa.y=b,Da("updateScrollOffset",sa)},applyZoomPan:function(a,b,c,d){pa.x=b,pa.y=c,s=a,Ha(d)},init:function(){if(!j&&!k){var c;f.framework=e,f.template=a,f.bg=e.getChildByClass(a,"pswp__bg"),J=a.className,j=!0,N=e.detectFeatures(),H=N.raf,I=N.caf,E=N.transform,L=N.oldIE,f.scrollWrap=e.getChildByClass(a,"pswp__scroll-wrap"),f.container=e.getChildByClass(f.scrollWrap,"pswp__container"),n=f.container.style,f.itemHolders=y=[{el:f.container.children[0],wrap:0,index:-1},{el:f.container.children[1],wrap:0,index:-1},{el:f.container.children[2],wrap:0,index:-1}],y[0].el.style.display=y[2].el.style.display="none",Wa(),r={resize:f.updateSize,orientationchange:function(){clearTimeout(O),O=setTimeout(function(){qa.x!==f.scrollWrap.clientWidth&&f.updateSize()},500)},scroll:Za,keydown:Xa,click:Ya};var d=N.isOldIOSPhone||N.isOldAndroid||N.isMobileOpera;for(N.animationName&&N.transform&&!d||(i.showAnimationDuration=i.hideAnimationDuration=0),c=0;c=ac())&&(m=0),f.currItem=_b(m),(N.isOldIOSPhone||N.isOldAndroid)&&(va=!1),a.setAttribute("aria-hidden","false"),i.modal&&(va?a.style.position="fixed":(a.style.position="absolute",a.style.top=e.getScrollY()+"px")),void 0===M&&(Da("initialLayout"),M=K=e.getScrollY());var l="pswp--open ";for(i.mainClass&&(l+=i.mainClass+" "),i.showHideOpacity&&(l+="pswp--animate_opacity "),l+=G?"pswp--touch":"pswp--notouch",l+=N.animationName?" pswp--css_animation":"",l+=N.svg?" pswp--svg":"",e.addClass(a,l),f.updateSize(),o=-1,ua=null,c=0;cda.min.x?a=da.min.x:ada.min.y?b=da.min.y:b=h&&(o+=ua+(ua>0?-h:h),c=h);for(var d=0;d0?(b=y.shift(),y[h-1]=b,o++,Ja((o+2)*ta.x,b.el.style),f.setContent(b,m-c+d+1+1)):(b=y.pop(),y.unshift(b),o--,Ja(o*ta.x,b.el.style),f.setContent(b,m+c-d-1-1));if(ea&&1===Math.abs(ua)){var e=_b(z);e.initialZoomLevel!==s&&(ic(e,qa),mc(e),Ia(e))}ua=0,f.updateCurrZoomItem(),z=m,Da("afterChange")}}},updateSize:function(b){if(!va&&i.modal){var c=e.getScrollY();if(M!==c&&(a.style.top=c+"px",M=c),!b&&xa.x===window.innerWidth&&xa.y===window.innerHeight)return;xa.x=window.innerWidth,xa.y=window.innerHeight,a.style.height=xa.y+"px"}if(qa.x=f.scrollWrap.clientWidth,qa.y=f.scrollWrap.clientHeight,Za(),ta.x=qa.x+Math.round(qa.x*i.spacing),ta.y=qa.y,Ka(ta.x*ra),Da("beforeResize"),void 0!==o){for(var d,g,j,k=0;k2&&(j=Aa(j)),g=_b(j),g&&(x||g.needsUpdate||!g.bounds)?(f.cleanSlide(g),f.setContent(d,j),1===k&&(f.currItem=g,f.updateCurrZoomItem(!0)),g.needsUpdate=!1):d.index===-1&&j>=0&&f.setContent(d,j),g&&g.container&&(ic(g,qa),mc(g),Ia(g));x=!1}t=s=f.currItem.initialZoomLevel,da=f.currItem.bounds,da&&(pa.x=da.center.x,pa.y=da.center.y,Ha(!0)),Da("resize")},zoomTo:function(a,b,c,d,f){b&&(t=s,ub.x=Math.abs(b.x)-pa.x,ub.y=Math.abs(b.y)-pa.y,Ma(oa,pa));var g=Sa(a,!1),h={};Va("x",g,h,a),Va("y",g,h,a);var i=s,j={x:pa.x,y:pa.y};Na(h);var k=function(b){1===b?(s=a,pa.x=h.x,pa.y=h.y):(s=(a-i)*b+i,pa.x=(h.x-j.x)*b+j.x,pa.y=(h.y-j.y)*b+j.y),f&&f(b),Ha(1===b)};c?db("customZoomTo",0,1,c,d||e.easing.sine.inOut,k):k(1)}},fb=30,gb=10,hb={},ib={},jb={},kb={},lb={},mb=[],nb={},ob=[],pb={},qb=0,rb=ma(),sb=0,tb=ma(),ub=ma(),vb=ma(),wb=function(a,b){return a.x===b.x&&a.y===b.y},xb=function(a,b){return Math.abs(a.x-b.x)-1)&&(b(a)?a:Cb(a.parentNode,b)))},Db={},Eb=function(a,b){return Db.prevent=!Cb(a.target,i.isClickableElement),Da("preventDragEvent",a,b,Db),Db.prevent},Fb=function(a,b){return b.x=a.pageX,b.y=a.pageY,b.id=a.identifier,b},Gb=function(a,b,c){c.x=.5*(a.x+b.x),c.y=.5*(a.y+b.y)},Hb=function(a,b,c){if(a-Q>50){var d=ob.length>2?ob.shift():{};d.x=b,d.y=c,ob.push(d),Q=a}},Ib=function(){var a=pa.y-f.currItem.initialPosition.y;return 1-Math.abs(a/(qa.y/2))},Jb={},Kb={},Lb=[],Mb=function(a){for(;Lb.length>0;)Lb.pop();return F?(la=0,mb.forEach(function(a){0===la?Lb[0]=a:1===la&&(Lb[1]=a),la++})):a.type.indexOf("touch")>-1?a.touches&&a.touches.length>0&&(Lb[0]=Fb(a.touches[0],Jb),a.touches.length>1&&(Lb[1]=Fb(a.touches[1],Kb))):(Jb.x=a.pageX,Jb.y=a.pageY,Jb.id="",Lb[0]=Jb),Lb},Nb=function(a,b){var c,d,e,g,h=0,j=pa[a]+b[a],k=b[a]>0,l=tb.x+b.x,m=tb.x-nb.x;return c=j>da.min[a]||jda.min[a]&&(c=i.panEndFriction,h=da.min[a]-j,d=da.min[a]-oa[a]),(d<=0||m<0)&&ac()>1?(g=l,m<0&&l>nb.x&&(g=nb.x)):da.min.x!==da.max.x&&(e=j)):(j0)&&ac()>1?(g=l,m>0&&lf.currItem.fitRatio&&(pa[a]+=b[a]*c)):(void 0!==g&&(Ka(g,!0),$=g!==nb.x),da.min.x!==da.max.x&&(void 0!==e?pa.x=e:$||(pa.x+=b.x*c)),void 0!==g)},Ob=function(a){if(!("mousedown"===a.type&&a.button>0)){if($b)return void a.preventDefault();if(!U||"mousedown"!==a.type){if(Eb(a,!0)&&a.preventDefault(),Da("pointerDown"),F){var b=e.arraySearch(mb,a.pointerId,"id");b<0&&(b=mb.length),mb[b]={x:a.pageX,y:a.pageY,id:a.pointerId}}var c=Mb(a),d=c.length;_=null,cb(),V&&1!==d||(V=ha=!0,e.bind(window,p,f),S=ka=ia=T=$=Y=W=X=!1,ga=null,Da("firstTouchStart",c),Ma(oa,pa),na.x=na.y=0,Ma(kb,c[0]),Ma(lb,kb),nb.x=ta.x*ra,ob=[{x:kb.x,y:kb.y}],Q=P=Ea(),Sa(s,!0),zb(),Ab()),!aa&&d>1&&!fa&&!$&&(t=s,X=!1,aa=W=!0,na.y=na.x=0,Ma(oa,pa),Ma(hb,c[0]),Ma(ib,c[1]),Gb(hb,ib,vb),ub.x=Math.abs(vb.x)-pa.x,ub.y=Math.abs(vb.y)-pa.y,ba=ca=yb(hb,ib))}}},Pb=function(a){if(a.preventDefault(),F){var b=e.arraySearch(mb,a.pointerId,"id");if(b>-1){var c=mb[b];c.x=a.pageX,c.y=a.pageY}}if(V){var d=Mb(a);if(ga||Y||aa)_=d;else if(tb.x!==ta.x*ra)ga="h";else{var f=Math.abs(d[0].x-kb.x)-Math.abs(d[0].y-kb.y);Math.abs(f)>=gb&&(ga=f>0?"h":"v",_=d)}}},Qb=function(){if(_){var a=_.length;if(0!==a)if(Ma(hb,_[0]),jb.x=hb.x-kb.x,jb.y=hb.y-kb.y,aa&&a>1){if(kb.x=hb.x,kb.y=hb.y,!jb.x&&!jb.y&&wb(_[1],ib))return;Ma(ib,_[1]),X||(X=!0,Da("zoomGestureStarted"));var b=yb(hb,ib),c=Vb(b);c>f.currItem.initialZoomLevel+f.currItem.initialZoomLevel/15&&(ka=!0);var d=1,e=Ta(),g=Ua();if(c1&&(d=1),c=e-d*(e/3);else c>g&&(d=(c-g)/(6*e),d>1&&(d=1),c=g+d*e);d<0&&(d=0),ba=b,Gb(hb,ib,rb),na.x+=rb.x-vb.x,na.y+=rb.y-vb.y,Ma(vb,rb),pa.x=La("x",c),pa.y=La("y",c),S=c>s,s=c,Ha()}else{if(!ga)return;if(ha&&(ha=!1,Math.abs(jb.x)>=gb&&(jb.x-=_[0].x-lb.x),Math.abs(jb.y)>=gb&&(jb.y-=_[0].y-lb.y)),kb.x=hb.x,kb.y=hb.y,0===jb.x&&0===jb.y)return;if("v"===ga&&i.closeOnVerticalDrag&&!Bb()){na.y+=jb.y,pa.y+=jb.y;var k=Ib();return T=!0,Da("onVerticalDrag",k),Fa(k),void Ha()}Hb(Ea(),hb.x,hb.y),Y=!0,da=f.currItem.bounds;var l=Nb("x",jb);l||(Nb("y",jb),Na(pa),Ha())}}},Rb=function(a){if(N.isOldAndroid){if(U&&"mouseup"===a.type)return;a.type.indexOf("touch")>-1&&(clearTimeout(U),U=setTimeout(function(){U=0},600))}Da("pointerUp"),Eb(a,!1)&&a.preventDefault();var b;if(F){var c=e.arraySearch(mb,a.pointerId,"id");if(c>-1)if(b=mb.splice(c,1)[0],navigator.msPointerEnabled){var d={4:"mouse",2:"touch",3:"pen"};b.type=d[a.pointerType],b.type||(b.type=a.pointerType||"mouse")}else b.type=a.pointerType||"mouse"}var g,h=Mb(a),j=h.length;if("mouseup"===a.type&&(j=0),2===j)return _=null,!0;1===j&&Ma(lb,h[0]),0!==j||ga||fa||(b||("mouseup"===a.type?b={x:a.pageX,y:a.pageY,type:"mouse"}:a.changedTouches&&a.changedTouches[0]&&(b={x:a.changedTouches[0].pageX,y:a.changedTouches[0].pageY,type:"touch"})),Da("touchRelease",a,b));var k=-1;if(0===j&&(V=!1,e.unbind(window,p,f),zb(),aa?k=0:sb!==-1&&(k=Ea()-sb)),sb=1===j?Ea():-1,g=k!==-1&&k<150?"zoom":"swipe",aa&&j<2&&(aa=!1,1===j&&(g="zoomPointerUp"),Da("zoomGestureEnded")),_=null,Y||X||fa||T)if(cb(),R||(R=Sb()),R.calculateSwipeSpeed("x"),T){var l=Ib();if(lf.currItem.fitRatio&&Tb(R))}},Sb=function(){var a,b,c={lastFlickOffset:{},lastFlickDist:{},lastFlickSpeed:{},slowDownRatio:{},slowDownRatioReverse:{},speedDecelerationRatio:{},speedDecelerationRatioAbs:{},distanceOffset:{},backAnimDestination:{},backAnimStarted:{},calculateSwipeSpeed:function(d){ob.length>1?(a=Ea()-Q+50,b=ob[ob.length-2][d]):(a=Ea()-P,b=lb[d]),c.lastFlickOffset[d]=kb[d]-b,c.lastFlickDist[d]=Math.abs(c.lastFlickOffset[d]),c.lastFlickDist[d]>20?c.lastFlickSpeed[d]=c.lastFlickOffset[d]/a:c.lastFlickSpeed[d]=0,Math.abs(c.lastFlickSpeed[d])<.1&&(c.lastFlickSpeed[d]=0),c.slowDownRatio[d]=.95,c.slowDownRatioReverse[d]=1-c.slowDownRatio[d],c.speedDecelerationRatio[d]=1},calculateOverBoundsAnimOffset:function(a,b){c.backAnimStarted[a]||(pa[a]>da.min[a]?c.backAnimDestination[a]=da.min[a]:pa[a]fb&&(h||b.lastFlickOffset.x>20)?d=-1:g<-fb&&(h||b.lastFlickOffset.x<-20)&&(d=1)}var j;d&&(m+=d,m<0?(m=i.loop?ac()-1:0,j=!0):m>=ac()&&(m=i.loop?0:ac()-1,j=!0),j&&!i.loop||(ua+=d,ra-=d,c=!0));var k,l=ta.x*ra,n=Math.abs(l-tb.x);return c||l>tb.x==b.lastFlickSpeed.x>0?(k=Math.abs(b.lastFlickSpeed.x)>0?n/Math.abs(b.lastFlickSpeed.x):333,k=Math.min(k,400),k=Math.max(k,250)):k=333,qb===m&&(c=!1),fa=!0,Da("mainScrollAnimStart"),db("mainScroll",tb.x,l,k,e.easing.cubic.out,Ka,function(){cb(),fa=!1,qb=-1,(c||qb!==m)&&f.updateCurrItem(),Da("mainScrollAnimComplete")}),c&&f.updateCurrItem(!0),c},Vb=function(a){return 1/ca*a*t},Wb=function(){var a=s,b=Ta(),c=Ua();sc&&(a=c);var d,g=1,h=ja;return ia&&!S&&!ka&&s1||navigator.msMaxTouchPoints>1),f.likelyTouchDevice=G,r[A]=Ob,r[B]=Pb,r[C]=Rb,D&&(r[D]=r[C]),N.touch&&(q+=" mousedown",p+=" mousemove mouseup",r.mousedown=r[A],r.mousemove=r[B],r.mouseup=r[C]),G||(i.allowPanToNext=!1)}}});var Xb,Yb,Zb,$b,_b,ac,bc,cc=function(b,c,d,g){Xb&&clearTimeout(Xb),$b=!0,Zb=!0;var h;b.initialLayout?(h=b.initialLayout,b.initialLayout=null):h=i.getThumbBoundsFn&&i.getThumbBoundsFn(m);var j=d?i.hideAnimationDuration:i.showAnimationDuration,k=function(){ab("initialZoom"),d?(f.template.removeAttribute("style"),f.bg.removeAttribute("style")):(Fa(1),c&&(c.style.display="block"),e.addClass(a,"pswp--animated-in"),Da("initialZoom"+(d?"OutEnd":"InEnd"))),g&&g(),$b=!1};if(!j||!h||void 0===h.x)return Da("initialZoom"+(d?"Out":"In")),s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),a.style.opacity=d?0:1,Fa(1),void(j?setTimeout(function(){k()},j):k());var n=function(){var c=l,g=!f.currItem.src||f.currItem.loadError||i.showHideOpacity;b.miniImg&&(b.miniImg.style.webkitBackfaceVisibility="hidden"),d||(s=h.w/b.w,pa.x=h.x,pa.y=h.y-K,f[g?"template":"bg"].style.opacity=.001,Ha()),bb("initialZoom"),d&&!c&&e.removeClass(a,"pswp--animated-in"),g&&(d?e[(c?"remove":"add")+"Class"](a,"pswp--animate_opacity"):setTimeout(function(){e.addClass(a,"pswp--animate_opacity")},30)),Xb=setTimeout(function(){if(Da("initialZoom"+(d?"Out":"In")),d){var f=h.w/b.w,i={x:pa.x,y:pa.y},l=s,m=ja,n=function(b){1===b?(s=f,pa.x=h.x,pa.y=h.y-M):(s=(f-l)*b+l,pa.x=(h.x-i.x)*b+i.x,pa.y=(h.y-M-i.y)*b+i.y),Ha(),g?a.style.opacity=1-b:Fa(m-b*m)};c?db("initialZoom",0,1,j,e.easing.cubic.out,n,k):(n(1),Xb=setTimeout(k,j+20))}else s=b.initialZoomLevel,Ma(pa,b.initialPosition),Ha(),Fa(1),g?a.style.opacity=1:Fa(1),Xb=setTimeout(k,j+20)},d?25:90)};n()},dc={},ec=[],fc={index:0,errorMsg:'',forceProgressiveLoading:!1,preload:[1,1],getNumItemsFn:function(){return Yb.length}},gc=function(){return{center:{x:0,y:0},max:{x:0,y:0},min:{x:0,y:0}}},hc=function(a,b,c){var d=a.bounds;d.center.x=Math.round((dc.x-b)/2),d.center.y=Math.round((dc.y-c)/2)+a.vGap.top,d.max.x=b>dc.x?Math.round(dc.x-b):d.center.x,d.max.y=c>dc.y?Math.round(dc.y-c)+a.vGap.top:d.center.y,d.min.x=b>dc.x?0:d.center.x,d.min.y=c>dc.y?a.vGap.top:d.center.y},ic=function(a,b,c){if(a.src&&!a.loadError){var d=!c;if(d&&(a.vGap||(a.vGap={top:0,bottom:0}),Da("parseVerticalMargin",a)),dc.x=b.x,dc.y=b.y-a.vGap.top-a.vGap.bottom,d){var e=dc.x/a.w,f=dc.y/a.h;a.fitRatio=e1&&(c=1),a.initialZoomLevel=c,a.bounds||(a.bounds=gc())}if(!c)return;return hc(a,a.w*c,a.h*c),d&&c===a.initialZoomLevel&&(a.initialPosition=a.bounds.center),a.bounds}return a.w=a.h=0,a.initialZoomLevel=a.fitRatio=1,a.bounds=gc(),a.initialPosition=a.bounds.center,a.bounds},jc=function(a,b,c,d,e,g){b.loadError||d&&(b.imageAppended=!0,mc(b,d,b===f.currItem&&ya),c.appendChild(d),g&&setTimeout(function(){b&&b.loaded&&b.placeholder&&(b.placeholder.style.display="none",b.placeholder=null)},500))},kc=function(a){a.loading=!0,a.loaded=!1;var b=a.img=e.createEl("pswp__img","img"),c=function(){a.loading=!1,a.loaded=!0,a.loadComplete?a.loadComplete(a):a.img=null,b.onload=b.onerror=null,b=null};return b.onload=c,b.onerror=function(){a.loadError=!0,c()},b.src=a.src,b},lc=function(a,b){if(a.src&&a.loadError&&a.container)return b&&(a.container.innerHTML=""),a.container.innerHTML=i.errorMsg.replace("%url%",a.src),!0},mc=function(a,b,c){if(a.src){b||(b=a.container.lastChild);var d=c?a.w:Math.round(a.w*a.fitRatio),e=c?a.h:Math.round(a.h*a.fitRatio);a.placeholder&&!a.loaded&&(a.placeholder.style.width=d+"px",a.placeholder.style.height=e+"px"),b.style.width=d+"px",b.style.height=e+"px"}},nc=function(){if(ec.length){for(var a,b=0;b=0,e=Math.min(c[0],ac()),g=Math.min(c[1],ac());for(b=1;b<=(d?g:e);b++)f.lazyLoadItem(m+b);for(b=1;b<=(d?e:g);b++)f.lazyLoadItem(m-b)}),Ca("initialLayout",function(){f.currItem.initialLayout=i.getThumbBoundsFn&&i.getThumbBoundsFn(m)}),Ca("mainScrollAnimComplete",nc),Ca("initialZoomInEnd",nc),Ca("destroy",function(){for(var a,b=0;b=0&&(void 0!==Yb[a]&&Yb[a])},allowProgressiveImg:function(){return i.forceProgressiveLoading||!G||i.mouseUsed||screen.width>1200},setContent:function(a,b){i.loop&&(b=Aa(b));var c=f.getItemAt(a.index);c&&(c.container=null);var d,g=f.getItemAt(b);if(!g)return void(a.el.innerHTML="");Da("gettingData",b,g),a.index=b,a.item=g;var h=g.container=e.createEl("pswp__zoom-wrap");if(!g.src&&g.html&&(g.html.tagName?h.appendChild(g.html):h.innerHTML=g.html),lc(g),ic(g,qa),!g.src||g.loadError||g.loaded)g.src&&!g.loadError&&(d=e.createEl("pswp__img","img"),d.style.opacity=1,d.src=g.src,mc(g,d),jc(b,g,h,d,!0));else{if(g.loadComplete=function(c){if(j){if(a&&a.index===b){if(lc(c,!0))return c.loadComplete=c.img=null,ic(c,qa),Ia(c),void(a.index===m&&f.updateCurrZoomItem());c.imageAppended?!$b&&c.placeholder&&(c.placeholder.style.display="none",c.placeholder=null):N.transform&&(fa||$b)?ec.push({item:c,baseDiv:h,img:c.img,index:b,holder:a,clearPlaceholder:!0}):jc(b,c,h,c.img,fa||$b,!0)}c.loadComplete=null,c.img=null,Da("imageLoadComplete",b,c)}},e.features.transform){var k="pswp__img pswp__img--placeholder";k+=g.msrc?"":" pswp__img--placeholder--blank";var l=e.createEl(k,g.msrc?"img":"");g.msrc&&(l.src=g.msrc),mc(g,l),h.appendChild(l),g.placeholder=l}g.loading||kc(g),f.allowProgressiveImg()&&(!Zb&&N.transform?ec.push({item:g,baseDiv:h,img:g.img,index:b,holder:a}):jc(b,g,h,g.img,!0,!0))}Zb||b!==m?Ia(g):(ea=h.style,cc(g,d||g.img)),a.el.innerHTML="",a.el.appendChild(h)},cleanSlide:function(a){a.img&&(a.img.onload=a.img.onerror=null),a.loaded=a.loading=a.img=a.imageAppended=!1}}});var oc,pc={},qc=function(a,b,c){var d=document.createEvent("CustomEvent"),e={origEvent:a,target:a.target,releasePoint:b,pointerType:c||"touch"};d.initCustomEvent("pswpTap",!0,!0,e),a.target.dispatchEvent(d)};za("Tap",{publicMethods:{initTap:function(){Ca("firstTouchStart",f.onTapStart),Ca("touchRelease",f.onTapRelease),Ca("destroy",function(){pc={},oc=null})},onTapStart:function(a){a.length>1&&(clearTimeout(oc),oc=null)},onTapRelease:function(a,b){if(b&&!Y&&!W&&!_a){var c=b;if(oc&&(clearTimeout(oc),oc=null,xb(c,pc)))return void Da("doubleTap",c);if("mouse"===b.type)return void qc(a,b,"mouse");var d=a.target.tagName.toUpperCase();if("BUTTON"===d||e.hasClass(a.target,"pswp__single-tap"))return void qc(a,b);Ma(pc,c),oc=setTimeout(function(){qc(a,b),oc=null},300)}}}});var rc;za("DesktopZoom",{publicMethods:{initDesktopZoom:function(){L||(G?Ca("mouseUsed",function(){f.setupDesktopZoom()}):f.setupDesktopZoom(!0))},setupDesktopZoom:function(b){rc={};var c="wheel mousewheel DOMMouseScroll";Ca("bindEvents",function(){e.bind(a,c,f.handleMouseWheel)}),Ca("unbindEvents",function(){rc&&e.unbind(a,c,f.handleMouseWheel)}),f.mouseZoomedIn=!1;var d,g=function(){f.mouseZoomedIn&&(e.removeClass(a,"pswp--zoomed-in"),f.mouseZoomedIn=!1),s<1?e.addClass(a,"pswp--zoom-allowed"):e.removeClass(a,"pswp--zoom-allowed"),h()},h=function(){d&&(e.removeClass(a,"pswp--dragging"),d=!1)};Ca("resize",g),Ca("afterChange",g),Ca("pointerDown",function(){f.mouseZoomedIn&&(d=!0,e.addClass(a,"pswp--dragging"))}),Ca("pointerUp",h),b||g()},handleMouseWheel:function(a){if(s<=f.currItem.fitRatio)return i.modal&&(!i.closeOnScroll||_a||V?a.preventDefault():E&&Math.abs(a.deltaY)>2&&(l=!0,f.close())),!0;if(a.stopPropagation(),rc.x=0,"deltaX"in a)1===a.deltaMode?(rc.x=18*a.deltaX,rc.y=18*a.deltaY):(rc.x=a.deltaX,rc.y=a.deltaY);else if("wheelDelta"in a)a.wheelDeltaX&&(rc.x=-.16*a.wheelDeltaX),a.wheelDeltaY?rc.y=-.16*a.wheelDeltaY:rc.y=-.16*a.wheelDelta;else{if(!("detail"in a))return;rc.y=a.detail}Sa(s,!0);var b=pa.x-rc.x,c=pa.y-rc.y;(i.modal||b<=da.min.x&&b>=da.max.x&&c<=da.min.y&&c>=da.max.y)&&a.preventDefault(),f.panTo(b,c)},toggleDesktopZoom:function(b){b=b||{x:qa.x/2+sa.x,y:qa.y/2+sa.y};var c=i.getDoubleTapZoom(!0,f.currItem),d=s===c;f.mouseZoomedIn=!d,f.zoomTo(d?f.currItem.initialZoomLevel:c,b,333),e[(d?"remove":"add")+"Class"](a,"pswp--zoomed-in")}}});var sc,tc,uc,vc,wc,xc,yc,zc,Ac,Bc,Cc,Dc,Ec={history:!0,galleryUID:1},Fc=function(){return Cc.hash.substring(1)},Gc=function(){sc&&clearTimeout(sc),uc&&clearTimeout(uc)},Hc=function(){var a=Fc(),b={};if(a.length<5)return b;var c,d=a.split("&");for(c=0;c-1&&(yc=yc.split("&gid=")[0],yc=yc.split("?gid=")[0]),Ca("afterChange",f.updateURL),Ca("unbindEvents",function(){e.unbind(window,"hashchange",f.onHashChange)});var a=function(){xc=!0,Ac||(Bc?history.back():yc?Cc.hash=yc:Dc?history.pushState("",document.title,Cc.pathname+Cc.search):Cc.hash=""),Gc()};Ca("unbindEvents",function(){l&&a()}),Ca("destroy",function(){xc||a()}),Ca("firstUpdate",function(){m=Hc().pid});var b=yc.indexOf("pid=");b>-1&&(yc=yc.substring(0,b),"&"===yc.slice(-1)&&(yc=yc.slice(0,-1))),setTimeout(function(){j&&e.bind(window,"hashchange",f.onHashChange)},40)}},onHashChange:function(){return Fc()===yc?(Ac=!0,void f.close()):void(vc||(wc=!0,f.goTo(Hc().pid),wc=!1))},updateURL:function(){Gc(),wc||(zc?sc=setTimeout(Ic,800):Ic())}}}),e.extend(f,eb)};return a});
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/dist/preloader.gif b/apps/photos/thirdparty/photoswipe/dist/preloader.gif
new file mode 100644
index 000000000..b8faa697c
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/dist/preloader.gif differ
diff --git a/apps/photos/thirdparty/photoswipe/package.json b/apps/photos/thirdparty/photoswipe/package.json
new file mode 100644
index 000000000..8aca8e703
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "photoswipe",
+ "version": "4.1.6",
+ "engines": {
+ "node": ">= 0.8.0"
+ },
+ "scripts": {
+ "test": "grunt jshint",
+ "build":" grunt pswpbuild"
+ },
+ "devDependencies": {
+ "grunt": "~1.0.3",
+ "grunt-autoprefixer": "^3.0.3",
+ "grunt-contrib-clean": "~2.0.0",
+ "grunt-contrib-concat": "~1.0.1",
+ "grunt-contrib-copy": "^1.0.0",
+ "grunt-contrib-cssmin": "^3.0.0",
+ "grunt-contrib-jshint": "~2.0.0",
+ "grunt-contrib-uglify": "~4.0.0",
+ "grunt-contrib-watch": "~1.1.0",
+ "grunt-jekyll": "~1.0.0",
+ "grunt-sass": "^3.0.2",
+ "grunt-svgmin": "^5.0.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/dimsemenov/Photoswipe.git"
+ },
+ "description": "JavaScript gallery",
+ "bugs": {
+ "url": "https://github.com/dimsemenov/Photoswipe/issues"
+ },
+ "homepage": "https://photoswipe.com",
+ "main": "dist/photoswipe.js",
+ "keywords": [
+ "gallery",
+ "lightbox",
+ "photo",
+ "image",
+ "touch",
+ "swipe",
+ "zoom"
+ ],
+ "author": "Dmitry Semenov (http://dimsemenov.com)",
+ "license": "MIT"
+}
diff --git a/apps/photos/thirdparty/photoswipe/photoswipe.json b/apps/photos/thirdparty/photoswipe/photoswipe.json
new file mode 100644
index 000000000..566cc43ec
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/photoswipe.json
@@ -0,0 +1,26 @@
+{
+ "name": "PhotoSwipe",
+ "title": "Photoswipe",
+ "description": "",
+ "version": "4.1.4",
+ "homepage": "http://photoswipe.com",
+ "demo": "http://photoswipe.com",
+ "docs": "http://photoswipe.com",
+ "author": {
+ "name": "Dmitry Semenov",
+ "email": "diiiimaaaa@gmail.com",
+ "url": "http://dimsemenov.com"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/dimsemenov/PhotoSwipe.git"
+ },
+ "bugs": "https://github.com/dimsemenov/PhotoSwipe/issues",
+ "keywords": ["photoswipe","gallery","touch","mobile"],
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/src/css/_main-settings.scss b/apps/photos/thirdparty/photoswipe/src/css/_main-settings.scss
new file mode 100644
index 000000000..8bb2261be
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/_main-settings.scss
@@ -0,0 +1,9 @@
+$pswp__show-hide-transition-duration: 333ms !default;
+$pswp__controls-transition-duration: 333ms !default;
+$pswp__background-color: #000 !default;
+$pswp__placeholder-color: #222 !default;
+$pswp__box-sizing-border-box: true !default; // disable .pswp * { box-sizing:border-box } (in case you already have it in your site css)
+$pswp__root-z-index: 1500 !default;
+$pswp__assets-path: '' !default; // path to skin assets folder (preloader, PNG and SVG sprite)
+$pswp__error-text-color: #ccc !default; // "Image not loaded" text color
+$pswp__include-minimal-style: true !default;
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/Data b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/Data
new file mode 100644
index 000000000..13aace7b8
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/Data differ
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/metadata b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/metadata
new file mode 100644
index 000000000..64bd629e9
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/metadata
@@ -0,0 +1,18 @@
+
+
+
+
+ app
+ com.bohemiancoding.sketch3
+ build
+ 7574
+ commit
+ 8099b4f0b25d32201a4f1a171811eda68e6b1bd1
+ fonts
+
+ length
+ 57208
+ version
+ 36
+
+
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/version b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/version
new file mode 100644
index 000000000..dce6588ca
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin-svg.sketch/version
@@ -0,0 +1 @@
+36
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.png b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.png
new file mode 100644
index 000000000..441c502c9
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.png differ
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.psd b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.psd
new file mode 100644
index 000000000..1aba79173
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.psd differ
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.scss b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.scss
new file mode 100644
index 000000000..c2c47b106
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.scss
@@ -0,0 +1,579 @@
+/*! PhotoSwipe Default UI CSS by Dmitry Semenov | photoswipe.com | MIT license */
+
+/*
+
+ Contents:
+
+ 1. Buttons
+ 2. Share modal and links
+ 3. Index indicator ("1 of X" counter)
+ 4. Caption
+ 5. Loading indicator
+ 6. Additional styles (root element, top bar, idle state, hidden state, etc.)
+
+*/
+
+// PhotoSwipe uses Autoprefixer, so vendor prefixed are added automatically when needed.
+
+@import '../main-settings';
+
+/*
+
+ 1. Buttons
+
+ */
+
+/* css reset */
+.pswp__button {
+ width: 44px;
+ height: 44px;
+ position: relative;
+ background: none;
+ cursor: pointer;
+ overflow: visible;
+ -webkit-appearance: none;
+ display: block;
+ border: 0;
+ padding: 0;
+ margin: 0;
+ float: right;
+ opacity: 0.75;
+ transition: opacity 0.2s;
+ box-shadow: none;
+
+ &:focus,
+ &:hover {
+ opacity: 1;
+ }
+
+ &:active {
+ outline: none;
+ opacity: 0.9;
+ }
+
+ &::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+ }
+}
+
+/* pswp__ui--over-close class it added when mouse is over element that should close gallery */
+.pswp__ui--over-close .pswp__button--close {
+ opacity: 1;
+}
+
+.pswp__button,
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+ background: url(#{$pswp__assets-path}default-skin.png) 0 0 no-repeat;
+ background-size: 264px 88px;
+ width: 44px;
+ height: 44px;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.1),
+ (min-resolution: 105dpi),
+ (min-resolution: 1.1dppx) {
+ /* Serve SVG sprite if browser supports SVG and resolution is more than 105dpi */
+ .pswp--svg .pswp__button,
+ .pswp--svg .pswp__button--arrow--left:before,
+ .pswp--svg .pswp__button--arrow--right:before {
+ background-image: url(#{$pswp__assets-path}default-skin.svg);
+ }
+
+ .pswp--svg .pswp__button--arrow--left,
+ .pswp--svg .pswp__button--arrow--right {
+ background: none;
+ }
+}
+
+.pswp__button--close {
+ background-position: 0 -44px;
+}
+
+.pswp__button--share {
+ background-position: -44px -44px;
+}
+
+.pswp__button--fs {
+ display: none;
+}
+
+.pswp--supports-fs .pswp__button--fs {
+ display: block;
+}
+
+.pswp--fs .pswp__button--fs {
+ background-position: -44px 0;
+}
+
+.pswp__button--zoom {
+ display: none;
+ background-position: -88px 0;
+}
+
+.pswp--zoom-allowed .pswp__button--zoom {
+ display: block;
+}
+
+.pswp--zoomed-in .pswp__button--zoom {
+ background-position: -132px 0;
+}
+
+/* no arrows on touch screens */
+.pswp--touch {
+ .pswp__button--arrow--left,
+ .pswp__button--arrow--right {
+ visibility: hidden;
+ }
+}
+
+/*
+ Arrow buttons hit area
+ (icon is added to :before pseudo-element)
+*/
+.pswp__button--arrow--left,
+.pswp__button--arrow--right {
+ background: none;
+ top: 50%;
+ margin-top: -50px;
+ width: 70px;
+ height: 100px;
+ position: absolute;
+}
+
+.pswp__button--arrow--left {
+ left: 0;
+}
+
+.pswp__button--arrow--right {
+ right: 0;
+}
+
+.pswp__button--arrow--left:before,
+.pswp__button--arrow--right:before {
+ content: '';
+ top: 35px;
+ background-color: rgba(0, 0, 0, 0.3);
+ height: 30px;
+ width: 32px;
+ position: absolute;
+}
+
+.pswp__button--arrow--left:before {
+ left: 6px;
+ background-position: -138px -44px;
+}
+
+.pswp__button--arrow--right:before {
+ right: 6px;
+ background-position: -94px -44px;
+}
+
+/*
+
+ 2. Share modal/popup and links
+
+ */
+
+.pswp__counter,
+.pswp__share-modal {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+
+.pswp__share-modal {
+ display: block;
+ background: rgba(0, 0, 0, 0.5);
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ padding: 10px;
+ position: absolute;
+ z-index: $pswp__root-z-index + 100;
+ opacity: 0;
+ transition: opacity 0.25s ease-out;
+ -webkit-backface-visibility: hidden;
+ will-change: opacity;
+}
+
+.pswp__share-modal--hidden {
+ display: none;
+}
+
+.pswp__share-tooltip {
+ z-index: $pswp__root-z-index + 120;
+ position: absolute;
+ background: #fff;
+ top: 56px;
+ border-radius: 2px;
+ display: block;
+ width: auto;
+ right: 44px;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25);
+ transform: translateY(6px);
+ transition: transform 0.25s;
+ -webkit-backface-visibility: hidden;
+ will-change: transform;
+
+ a {
+ display: block;
+ padding: 8px 12px;
+ color: #000;
+ text-decoration: none;
+ font-size: 14px;
+ line-height: 18px;
+
+ &:hover {
+ text-decoration: none;
+ color: #000;
+ }
+
+ &:first-child {
+ /* round corners on the first/last list item */
+ border-radius: 2px 2px 0 0;
+ }
+
+ &:last-child {
+ border-radius: 0 0 2px 2px;
+ }
+ }
+}
+
+.pswp__share-modal--fade-in {
+ opacity: 1;
+
+ .pswp__share-tooltip {
+ transform: translateY(0);
+ }
+}
+
+/* increase size of share links on touch devices */
+.pswp--touch .pswp__share-tooltip a {
+ padding: 16px 12px;
+}
+
+a.pswp__share--facebook {
+ &:before {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ position: absolute;
+ top: -12px;
+ right: 15px;
+ border: 6px solid rgba(0, 0, 0, 0);
+ border-bottom-color: #fff;
+ -webkit-pointer-events: none;
+ -moz-pointer-events: none;
+ pointer-events: none;
+ }
+
+ &:hover {
+ background: #3e5c9a;
+ color: #fff;
+
+ &:before {
+ border-bottom-color: #3e5c9a;
+ }
+ }
+}
+
+a.pswp__share--twitter {
+ &:hover {
+ background: #55acee;
+ color: #fff;
+ }
+}
+
+a.pswp__share--pinterest {
+ &:hover {
+ background: #ccc;
+ color: #ce272d;
+ }
+}
+
+a.pswp__share--download {
+ &:hover {
+ background: #ddd;
+ }
+}
+
+/*
+
+ 3. Index indicator ("1 of X" counter)
+
+ */
+
+.pswp__counter {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 44px;
+ font-size: 13px;
+ line-height: 44px;
+ color: #fff;
+ opacity: 0.75;
+ padding: 0 10px;
+}
+
+/*
+
+ 4. Caption
+
+ */
+
+.pswp__caption {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ min-height: 44px;
+
+ small {
+ font-size: 11px;
+ color: #bbb;
+ }
+}
+
+.pswp__caption__center {
+ text-align: left;
+ max-width: 420px;
+ margin: 0 auto;
+ font-size: 13px;
+ padding: 10px;
+ line-height: 20px;
+ color: #ccc;
+}
+
+.pswp__caption--empty {
+ display: none;
+}
+
+/* Fake caption element, used to calculate height of next/prev image */
+.pswp__caption--fake {
+ visibility: hidden;
+}
+
+/*
+
+ 5. Loading indicator (preloader)
+
+ You can play with it here - http://codepen.io/dimsemenov/pen/yyBWoR
+
+ */
+
+.pswp__preloader {
+ width: 44px;
+ height: 44px;
+ position: absolute;
+ top: 0;
+ left: 50%;
+ margin-left: -22px;
+ opacity: 0;
+ transition: opacity 0.25s ease-out;
+ will-change: opacity;
+ direction: ltr;
+}
+
+.pswp__preloader__icn {
+ width: 20px;
+ height: 20px;
+ margin: 12px;
+}
+
+.pswp__preloader--active {
+ opacity: 1;
+
+ .pswp__preloader__icn {
+ /* We use .gif in browsers that don't support CSS animation */
+ background: url(#{$pswp__assets-path}preloader.gif) 0 0 no-repeat;
+ }
+}
+
+.pswp--css_animation {
+ .pswp__preloader--active {
+ opacity: 1;
+
+ .pswp__preloader__icn {
+ animation: clockwise 500ms linear infinite;
+ }
+
+ .pswp__preloader__donut {
+ animation: donut-rotate 1000ms cubic-bezier(0.4, 0, 0.22, 1)
+ infinite;
+ }
+ }
+
+ .pswp__preloader__icn {
+ background: none;
+ opacity: 0.75;
+ width: 14px;
+ height: 14px;
+ position: absolute;
+ left: 15px;
+ top: 15px;
+ margin: 0;
+ }
+
+ .pswp__preloader__cut {
+ /*
+ The idea of animating inner circle is based on Polymer ("material") loading indicator
+ by Keanu Lee https://blog.keanulee.com/2014/10/20/the-tale-of-three-spinners.html
+ */
+ position: relative;
+ width: 7px;
+ height: 14px;
+ overflow: hidden;
+ }
+
+ .pswp__preloader__donut {
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ border: 2px solid #fff;
+ border-radius: 50%;
+ border-left-color: transparent;
+ border-bottom-color: transparent;
+ position: absolute;
+ top: 0;
+ left: 0;
+ background: none;
+ margin: 0;
+ }
+}
+
+@media screen and (max-width: 1024px) {
+ .pswp__preloader {
+ position: relative;
+ left: auto;
+ top: auto;
+ margin: 0;
+ float: right;
+ }
+}
+
+@keyframes clockwise {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+@keyframes donut-rotate {
+ 0% {
+ transform: rotate(0);
+ }
+ 50% {
+ transform: rotate(-140deg);
+ }
+ 100% {
+ transform: rotate(0);
+ }
+}
+
+/*
+
+ 6. Additional styles
+
+ */
+
+/* root element of UI */
+.pswp__ui {
+ -webkit-font-smoothing: auto;
+ visibility: visible;
+ opacity: 1;
+ z-index: $pswp__root-z-index + 50;
+}
+
+/* top black bar with buttons and "1 of X" indicator */
+.pswp__top-bar {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 44px;
+ width: 100%;
+}
+
+.pswp__caption,
+.pswp__top-bar,
+.pswp--has_mouse .pswp__button--arrow--left,
+.pswp--has_mouse .pswp__button--arrow--right {
+ -webkit-backface-visibility: hidden;
+ will-change: opacity;
+ transition: opacity $pswp__controls-transition-duration
+ cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+/* pswp--has_mouse class is added only when two subsequent mousemove events occur */
+.pswp--has_mouse {
+ .pswp__button--arrow--left,
+ .pswp__button--arrow--right {
+ visibility: visible;
+ }
+}
+
+.pswp__top-bar,
+.pswp__caption {
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+/* pswp__ui--fit class is added when main image "fits" between top bar and bottom bar (caption) */
+.pswp__ui--fit {
+ .pswp__top-bar,
+ .pswp__caption {
+ background-color: rgba(0, 0, 0, 0.3);
+ }
+}
+
+/* pswp__ui--idle class is added when mouse isn't moving for several seconds (JS option timeToIdle) */
+
+.pswp__ui--idle {
+ .pswp__top-bar {
+ opacity: 0;
+ }
+
+ .pswp__button--arrow--left,
+ .pswp__button--arrow--right {
+ opacity: 0;
+ }
+}
+
+/*
+ pswp__ui--hidden class is added when controls are hidden
+ e.g. when user taps to toggle visibility of controls
+*/
+.pswp__ui--hidden {
+ .pswp__top-bar,
+ .pswp__caption,
+ .pswp__button--arrow--left,
+ .pswp__button--arrow--right {
+ /* Force paint & create composition layer for controls. */
+ opacity: 0.001;
+ }
+}
+
+/* pswp__ui--one-slide class is added when there is just one item in gallery */
+.pswp__ui--one-slide {
+ .pswp__button--arrow--left,
+ .pswp__button--arrow--right,
+ .pswp__counter {
+ display: none;
+ }
+}
+
+.pswp__element--disabled {
+ display: none !important;
+}
+
+@if $pswp__include-minimal-style == true {
+ .pswp--minimal--dark {
+ .pswp__top-bar {
+ background: none;
+ }
+ }
+}
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.svg b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.svg
new file mode 100644
index 000000000..9d5f0c6a1
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/default-skin/default-skin.svg
@@ -0,0 +1 @@
+default-skin 2
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/src/css/default-skin/preloader.gif b/apps/photos/thirdparty/photoswipe/src/css/default-skin/preloader.gif
new file mode 100644
index 000000000..b8faa697c
Binary files /dev/null and b/apps/photos/thirdparty/photoswipe/src/css/default-skin/preloader.gif differ
diff --git a/apps/photos/thirdparty/photoswipe/src/css/main.scss b/apps/photos/thirdparty/photoswipe/src/css/main.scss
new file mode 100644
index 000000000..0b5e52a31
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/css/main.scss
@@ -0,0 +1,212 @@
+/*! PhotoSwipe main CSS by Dmitry Semenov | photoswipe.com | MIT license */
+
+/*
+ Styles for basic PhotoSwipe functionality (sliding area, open/close transitions)
+*/
+
+// PhotoSwipe uses Autoprefixer, so vendor prefixed are added automatically when needed.
+
+@import 'main-settings';
+
+/* pswp = photoswipe */
+.pswp {
+ display: none;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ overflow: hidden;
+ -ms-touch-action: none;
+ touch-action: none;
+ z-index: $pswp__root-z-index;
+ -webkit-text-size-adjust: 100%;
+ /* create separate layer, to avoid paint on window.onscroll in webkit/blink */
+ -webkit-backface-visibility: hidden;
+ outline: none;
+
+ @if $pswp__box-sizing-border-box == true {
+ * {
+ box-sizing: border-box;
+ }
+ }
+
+ img {
+ max-width: none;
+ }
+}
+
+/* style is added when JS option showHideOpacity is set to true */
+.pswp--animate_opacity {
+ /* 0.001, because opacity:0 doesn't trigger Paint action, which causes lag at start of transition */
+ opacity: 0.001;
+ will-change: opacity;
+ /* for open/close transition */
+ transition: opacity $pswp__show-hide-transition-duration
+ cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp--open {
+ display: block;
+}
+
+.pswp--zoom-allowed .pswp__img {
+ /* autoprefixer: off */
+ cursor: -webkit-zoom-in;
+ cursor: -moz-zoom-in;
+ cursor: zoom-in;
+}
+
+.pswp--zoomed-in .pswp__img {
+ /* autoprefixer: off */
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: grab;
+}
+
+.pswp--dragging .pswp__img {
+ /* autoprefixer: off */
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: grabbing;
+}
+
+/*
+ Background is added as a separate element.
+ As animating opacity is much faster than animating rgba() background-color.
+*/
+.pswp__bg {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ background: $pswp__background-color;
+ opacity: 0;
+ transform: translateZ(0);
+ -webkit-backface-visibility: hidden;
+ will-change: opacity;
+}
+
+.pswp__scroll-wrap {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+
+.pswp__container,
+.pswp__zoom-wrap {
+ -ms-touch-action: none;
+ touch-action: none;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+
+/* Prevent selection and tap highlights */
+.pswp__container,
+.pswp__img {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+ -webkit-touch-callout: none;
+}
+
+.pswp__zoom-wrap {
+ position: absolute;
+ width: 100%;
+ -webkit-transform-origin: left top;
+ -moz-transform-origin: left top;
+ -ms-transform-origin: left top;
+ transform-origin: left top;
+ /* for open/close transition */
+ transition: transform $pswp__show-hide-transition-duration
+ cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp__bg {
+ will-change: opacity;
+ /* for open/close transition */
+ transition: opacity $pswp__show-hide-transition-duration
+ cubic-bezier(0.4, 0, 0.22, 1);
+}
+
+.pswp--animated-in {
+ .pswp__bg,
+ .pswp__zoom-wrap {
+ -webkit-transition: none;
+ transition: none;
+ }
+}
+
+.pswp__container,
+.pswp__zoom-wrap {
+ -webkit-backface-visibility: hidden;
+}
+
+.pswp__item {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ overflow: hidden;
+}
+
+.pswp__img {
+ position: absolute;
+ width: auto;
+ height: auto;
+ top: 0;
+ left: 0;
+}
+
+/*
+ stretched thumbnail or div placeholder element (see below)
+ style is added to avoid flickering in webkit/blink when layers overlap
+*/
+.pswp__img--placeholder {
+ -webkit-backface-visibility: hidden;
+}
+
+/*
+ div element that matches size of large image
+ large image loads on top of it
+*/
+.pswp__img--placeholder--blank {
+ background: $pswp__placeholder-color;
+}
+
+.pswp--ie .pswp__img {
+ width: 100% !important;
+ height: auto !important;
+ left: 0;
+ top: 0;
+}
+
+/*
+ Error message appears when image is not loaded
+ (JS option errorMsg controls markup)
+*/
+.pswp__error-msg {
+ position: absolute;
+ left: 0;
+ top: 50%;
+ width: 100%;
+ text-align: center;
+ font-size: 14px;
+ line-height: 16px;
+ margin-top: -8px;
+ color: $pswp__error-text-color;
+}
+
+.pswp__error-msg a {
+ color: $pswp__error-text-color;
+ text-decoration: underline;
+}
diff --git a/apps/photos/thirdparty/photoswipe/src/js/core.js b/apps/photos/thirdparty/photoswipe/src/js/core.js
new file mode 100644
index 000000000..d2b0665ab
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/core.js
@@ -0,0 +1,1090 @@
+//function(template, UiClass, items, options)
+
+var self = this;
+
+/**
+ * Static vars, don't change unless you know what you're doing.
+ */
+var DOUBLE_TAP_RADIUS = 25,
+ NUM_HOLDERS = 3;
+
+/**
+ * Options
+ */
+var _options = {
+ allowPanToNext: true,
+ spacing: 0.12,
+ bgOpacity: 1,
+ mouseUsed: false,
+ loop: true,
+ pinchToClose: true,
+ closeOnScroll: true,
+ closeOnVerticalDrag: true,
+ verticalDragRange: 0.75,
+ hideAnimationDuration: 333,
+ showAnimationDuration: 333,
+ showHideOpacity: false,
+ focus: true,
+ escKey: true,
+ arrowKeys: true,
+ mainScrollEndFriction: 0.35,
+ panEndFriction: 0.35,
+ isClickableElement: function (el) {
+ return el.tagName === 'A';
+ },
+ getDoubleTapZoom: function (isMouseClick, item) {
+ if (isMouseClick) {
+ return 1;
+ } else {
+ return item.initialZoomLevel < 0.7 ? 1 : 1.33;
+ }
+ },
+ maxSpreadZoom: 1.33,
+ modal: true,
+
+ // not fully implemented yet
+ scaleMode: 'fit', // TODO
+};
+framework.extend(_options, options);
+
+/**
+ * Private helper variables & functions
+ */
+
+var _getEmptyPoint = function () {
+ return { x: 0, y: 0 };
+};
+
+var _isOpen,
+ _isDestroying,
+ _closedByScroll,
+ _currentItemIndex,
+ _containerStyle,
+ _containerShiftIndex,
+ _currPanDist = _getEmptyPoint(),
+ _startPanOffset = _getEmptyPoint(),
+ _panOffset = _getEmptyPoint(),
+ _upMoveEvents, // drag move, drag end & drag cancel events array
+ _downEvents, // drag start events array
+ _globalEventHandlers,
+ _viewportSize = {},
+ _currZoomLevel,
+ _startZoomLevel,
+ _translatePrefix,
+ _translateSufix,
+ _updateSizeInterval,
+ _itemsNeedUpdate,
+ _currPositionIndex = 0,
+ _offset = {},
+ _slideSize = _getEmptyPoint(), // size of slide area, including spacing
+ _itemHolders,
+ _prevItemIndex,
+ _indexDiff = 0, // difference of indexes since last content update
+ _dragStartEvent,
+ _dragMoveEvent,
+ _dragEndEvent,
+ _dragCancelEvent,
+ _transformKey,
+ _pointerEventEnabled,
+ _isFixedPosition = true,
+ _likelyTouchDevice,
+ _modules = [],
+ _requestAF,
+ _cancelAF,
+ _initalClassName,
+ _initalWindowScrollY,
+ _oldIE,
+ _currentWindowScrollY,
+ _features,
+ _windowVisibleSize = {},
+ _renderMaxResolution = false,
+ _orientationChangeTimeout,
+ // Registers PhotoSWipe module (History, Controller ...)
+ _registerModule = function (name, module) {
+ framework.extend(self, module.publicMethods);
+ _modules.push(name);
+ },
+ _getLoopedId = function (index) {
+ var numSlides = _getNumItems();
+ if (index > numSlides - 1) {
+ return index - numSlides;
+ } else if (index < 0) {
+ return numSlides + index;
+ }
+ return index;
+ },
+ // Micro bind/trigger
+ _listeners = {},
+ _listen = function (name, fn) {
+ if (!_listeners[name]) {
+ _listeners[name] = [];
+ }
+ return _listeners[name].push(fn);
+ },
+ _shout = function (name) {
+ var listeners = _listeners[name];
+
+ if (listeners) {
+ var args = Array.prototype.slice.call(arguments);
+ args.shift();
+
+ for (var i = 0; i < listeners.length; i++) {
+ listeners[i].apply(self, args);
+ }
+ }
+ },
+ _getCurrentTime = function () {
+ return new Date().getTime();
+ },
+ _applyBgOpacity = function (opacity) {
+ _bgOpacity = opacity;
+ self.bg.style.opacity = opacity * _options.bgOpacity;
+ },
+ _applyZoomTransform = function (styleObj, x, y, zoom, item) {
+ if (!_renderMaxResolution || (item && item !== self.currItem)) {
+ zoom = zoom / (item ? item.fitRatio : self.currItem.fitRatio);
+ }
+
+ styleObj[_transformKey] =
+ _translatePrefix +
+ x +
+ 'px, ' +
+ y +
+ 'px' +
+ _translateSufix +
+ ' scale(' +
+ zoom +
+ ')';
+ },
+ _applyCurrentZoomPan = function (allowRenderResolution) {
+ if (_currZoomElementStyle) {
+ if (allowRenderResolution) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
+ if (!_renderMaxResolution) {
+ _setImageSize(self.currItem, false, true);
+ _renderMaxResolution = true;
+ }
+ } else {
+ if (_renderMaxResolution) {
+ _setImageSize(self.currItem);
+ _renderMaxResolution = false;
+ }
+ }
+ }
+
+ _applyZoomTransform(
+ _currZoomElementStyle,
+ _panOffset.x,
+ _panOffset.y,
+ _currZoomLevel
+ );
+ }
+ },
+ _applyZoomPanToItem = function (item) {
+ if (item.container) {
+ if (!item.initialPosition) {
+ item.initialPosition = { x: 0, y: 0 };
+ }
+ _applyZoomTransform(
+ item.container.style,
+ item.initialPosition.x,
+ item.initialPosition.y,
+ item.initialZoomLevel,
+ item
+ );
+ }
+ },
+ _setTranslateX = function (x, elStyle) {
+ elStyle[_transformKey] =
+ _translatePrefix + x + 'px, 0px' + _translateSufix;
+ },
+ _moveMainScroll = function (x, dragging) {
+ if (!_options.loop && dragging) {
+ var newSlideIndexOffset =
+ _currentItemIndex +
+ (_slideSize.x * _currPositionIndex - x) / _slideSize.x,
+ delta = Math.round(x - _mainScrollPos.x);
+
+ if (
+ (newSlideIndexOffset < 0 && delta > 0) ||
+ (newSlideIndexOffset >= _getNumItems() - 1 && delta < 0)
+ ) {
+ x = _mainScrollPos.x + delta * _options.mainScrollEndFriction;
+ }
+ }
+
+ _mainScrollPos.x = x;
+ _setTranslateX(x, _containerStyle);
+ },
+ _calculatePanOffset = function (axis, zoomLevel) {
+ var m = _midZoomPoint[axis] - _offset[axis];
+ return (
+ _startPanOffset[axis] +
+ _currPanDist[axis] +
+ m -
+ m * (zoomLevel / _startZoomLevel)
+ );
+ },
+ _equalizePoints = function (p1, p2) {
+ p1.x = p2.x;
+ p1.y = p2.y;
+ if (p2.id) {
+ p1.id = p2.id;
+ }
+ },
+ _roundPoint = function (p) {
+ p.x = Math.round(p.x);
+ p.y = Math.round(p.y);
+ },
+ _mouseMoveTimeout = null,
+ _onFirstMouseMove = function () {
+ // Wait until mouse move event is fired at least twice during 100ms
+ // We do this, because some mobile browsers trigger it on touchstart
+ if (_mouseMoveTimeout) {
+ framework.unbind(document, 'mousemove', _onFirstMouseMove);
+ framework.addClass(template, 'pswp--has_mouse');
+ _options.mouseUsed = true;
+ _shout('mouseUsed');
+ }
+ _mouseMoveTimeout = setTimeout(function () {
+ _mouseMoveTimeout = null;
+ }, 100);
+ },
+ _bindEvents = function () {
+ framework.bind(document, 'keydown', self);
+
+ if (_features.transform) {
+ // don't bind click event in browsers that don't support transform (mostly IE8)
+ framework.bind(self.scrollWrap, 'click', self);
+ }
+
+ if (!_options.mouseUsed) {
+ framework.bind(document, 'mousemove', _onFirstMouseMove);
+ }
+
+ framework.bind(window, 'resize scroll orientationchange', self);
+
+ _shout('bindEvents');
+ },
+ _unbindEvents = function () {
+ framework.unbind(window, 'resize scroll orientationchange', self);
+ framework.unbind(window, 'scroll', _globalEventHandlers.scroll);
+ framework.unbind(document, 'keydown', self);
+ framework.unbind(document, 'mousemove', _onFirstMouseMove);
+
+ if (_features.transform) {
+ framework.unbind(self.scrollWrap, 'click', self);
+ }
+
+ if (_isDragging) {
+ framework.unbind(window, _upMoveEvents, self);
+ }
+
+ clearTimeout(_orientationChangeTimeout);
+
+ _shout('unbindEvents');
+ },
+ _calculatePanBounds = function (zoomLevel, update) {
+ var bounds = _calculateItemSize(
+ self.currItem,
+ _viewportSize,
+ zoomLevel
+ );
+ if (update) {
+ _currPanBounds = bounds;
+ }
+ return bounds;
+ },
+ _getMinZoomLevel = function (item) {
+ if (!item) {
+ item = self.currItem;
+ }
+ return item.initialZoomLevel;
+ },
+ _getMaxZoomLevel = function (item) {
+ if (!item) {
+ item = self.currItem;
+ }
+ return item.w > 0 ? _options.maxSpreadZoom : 1;
+ },
+ // Return true if offset is out of the bounds
+ _modifyDestPanOffset = function (
+ axis,
+ destPanBounds,
+ destPanOffset,
+ destZoomLevel
+ ) {
+ if (destZoomLevel === self.currItem.initialZoomLevel) {
+ destPanOffset[axis] = self.currItem.initialPosition[axis];
+ return true;
+ } else {
+ destPanOffset[axis] = _calculatePanOffset(axis, destZoomLevel);
+
+ if (destPanOffset[axis] > destPanBounds.min[axis]) {
+ destPanOffset[axis] = destPanBounds.min[axis];
+ return true;
+ } else if (destPanOffset[axis] < destPanBounds.max[axis]) {
+ destPanOffset[axis] = destPanBounds.max[axis];
+ return true;
+ }
+ }
+ return false;
+ },
+ _setupTransforms = function () {
+ if (_transformKey) {
+ // setup 3d transforms
+ var allow3dTransform = _features.perspective && !_likelyTouchDevice;
+ _translatePrefix = 'translate' + (allow3dTransform ? '3d(' : '(');
+ _translateSufix = _features.perspective ? ', 0px)' : ')';
+ return;
+ }
+
+ // Override zoom/pan/move functions in case old browser is used (most likely IE)
+ // (so they use left/top/width/height, instead of CSS transform)
+
+ _transformKey = 'left';
+ framework.addClass(template, 'pswp--ie');
+
+ _setTranslateX = function (x, elStyle) {
+ elStyle.left = x + 'px';
+ };
+ _applyZoomPanToItem = function (item) {
+ var zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
+ s = item.container.style,
+ w = zoomRatio * item.w,
+ h = zoomRatio * item.h;
+
+ s.width = w + 'px';
+ s.height = h + 'px';
+ s.left = item.initialPosition.x + 'px';
+ s.top = item.initialPosition.y + 'px';
+ };
+ _applyCurrentZoomPan = function () {
+ if (_currZoomElementStyle) {
+ var s = _currZoomElementStyle,
+ item = self.currItem,
+ zoomRatio = item.fitRatio > 1 ? 1 : item.fitRatio,
+ w = zoomRatio * item.w,
+ h = zoomRatio * item.h;
+
+ s.width = w + 'px';
+ s.height = h + 'px';
+
+ s.left = _panOffset.x + 'px';
+ s.top = _panOffset.y + 'px';
+ }
+ };
+ },
+ _onKeyDown = function (e) {
+ var keydownAction = '';
+ if (_options.escKey && e.keyCode === 27) {
+ keydownAction = 'close';
+ } else if (_options.arrowKeys) {
+ if (e.keyCode === 37) {
+ keydownAction = 'prev';
+ } else if (e.keyCode === 39) {
+ keydownAction = 'next';
+ }
+ }
+
+ if (keydownAction) {
+ // don't do anything if special key pressed to prevent from overriding default browser actions
+ // e.g. in Chrome on Mac cmd+arrow-left returns to previous page
+ if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {
+ if (e.preventDefault) {
+ e.preventDefault();
+ } else {
+ e.returnValue = false;
+ }
+ self[keydownAction]();
+ }
+ }
+ },
+ _onGlobalClick = function (e) {
+ if (!e) {
+ return;
+ }
+
+ // don't allow click event to pass through when triggering after drag or some other gesture
+ if (
+ _moved ||
+ _zoomStarted ||
+ _mainScrollAnimating ||
+ _verticalDragInitiated
+ ) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ },
+ _updatePageScrollOffset = function () {
+ self.setScrollOffset(0, framework.getScrollY());
+ };
+
+// Micro animation engine
+var _animations = {},
+ _numAnimations = 0,
+ _stopAnimation = function (name) {
+ if (_animations[name]) {
+ if (_animations[name].raf) {
+ _cancelAF(_animations[name].raf);
+ }
+ _numAnimations--;
+ delete _animations[name];
+ }
+ },
+ _registerStartAnimation = function (name) {
+ if (_animations[name]) {
+ _stopAnimation(name);
+ }
+ if (!_animations[name]) {
+ _numAnimations++;
+ _animations[name] = {};
+ }
+ },
+ _stopAllAnimations = function () {
+ for (var prop in _animations) {
+ if (_animations.hasOwnProperty(prop)) {
+ _stopAnimation(prop);
+ }
+ }
+ },
+ _animateProp = function (
+ name,
+ b,
+ endProp,
+ d,
+ easingFn,
+ onUpdate,
+ onComplete
+ ) {
+ var startAnimTime = _getCurrentTime(),
+ t;
+ _registerStartAnimation(name);
+
+ var animloop = function () {
+ if (_animations[name]) {
+ t = _getCurrentTime() - startAnimTime; // time diff
+ //b - beginning (start prop)
+ //d - anim duration
+
+ if (t >= d) {
+ _stopAnimation(name);
+ onUpdate(endProp);
+ if (onComplete) {
+ onComplete();
+ }
+ return;
+ }
+ onUpdate((endProp - b) * easingFn(t / d) + b);
+
+ _animations[name].raf = _requestAF(animloop);
+ }
+ };
+ animloop();
+ };
+
+var publicMethods = {
+ // make a few local variables and functions public
+ shout: _shout,
+ listen: _listen,
+ viewportSize: _viewportSize,
+ options: _options,
+
+ isMainScrollAnimating: function () {
+ return _mainScrollAnimating;
+ },
+ getZoomLevel: function () {
+ return _currZoomLevel;
+ },
+ getCurrentIndex: function () {
+ return _currentItemIndex;
+ },
+ isDragging: function () {
+ return _isDragging;
+ },
+ isZooming: function () {
+ return _isZooming;
+ },
+ setScrollOffset: function (x, y) {
+ _offset.x = x;
+ _currentWindowScrollY = _offset.y = y;
+ _shout('updateScrollOffset', _offset);
+ },
+ applyZoomPan: function (zoomLevel, panX, panY, allowRenderResolution) {
+ _panOffset.x = panX;
+ _panOffset.y = panY;
+ _currZoomLevel = zoomLevel;
+ _applyCurrentZoomPan(allowRenderResolution);
+ },
+
+ init: function () {
+ if (_isOpen || _isDestroying) {
+ return;
+ }
+
+ var i;
+
+ self.framework = framework; // basic functionality
+ self.template = template; // root DOM element of PhotoSwipe
+ self.bg = framework.getChildByClass(template, 'pswp__bg');
+
+ _initalClassName = template.className;
+ _isOpen = true;
+
+ _features = framework.detectFeatures();
+ _requestAF = _features.raf;
+ _cancelAF = _features.caf;
+ _transformKey = _features.transform;
+ _oldIE = _features.oldIE;
+
+ self.scrollWrap = framework.getChildByClass(
+ template,
+ 'pswp__scroll-wrap'
+ );
+ self.container = framework.getChildByClass(
+ self.scrollWrap,
+ 'pswp__container'
+ );
+
+ _containerStyle = self.container.style; // for fast access
+
+ // Objects that hold slides (there are only 3 in DOM)
+ self.itemHolders = _itemHolders = [
+ { el: self.container.children[0], wrap: 0, index: -1 },
+ { el: self.container.children[1], wrap: 0, index: -1 },
+ { el: self.container.children[2], wrap: 0, index: -1 },
+ ];
+
+ // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)
+ _itemHolders[0].el.style.display = _itemHolders[2].el.style.display =
+ 'none';
+
+ _setupTransforms();
+
+ // Setup global events
+ _globalEventHandlers = {
+ resize: self.updateSize,
+
+ // Fixes: iOS 10.3 resize event
+ // does not update scrollWrap.clientWidth instantly after resize
+ // https://github.com/dimsemenov/PhotoSwipe/issues/1315
+ orientationchange: function () {
+ clearTimeout(_orientationChangeTimeout);
+ _orientationChangeTimeout = setTimeout(function () {
+ if (_viewportSize.x !== self.scrollWrap.clientWidth) {
+ self.updateSize();
+ }
+ }, 500);
+ },
+ scroll: _updatePageScrollOffset,
+ keydown: _onKeyDown,
+ click: _onGlobalClick,
+ };
+
+ // disable show/hide effects on old browsers that don't support CSS animations or transforms,
+ // old IOS, Android and Opera mobile. Blackberry seems to work fine, even older models.
+ var oldPhone =
+ _features.isOldIOSPhone ||
+ _features.isOldAndroid ||
+ _features.isMobileOpera;
+ if (!_features.animationName || !_features.transform || oldPhone) {
+ _options.showAnimationDuration = _options.hideAnimationDuration = 0;
+ }
+
+ // init modules
+ for (i = 0; i < _modules.length; i++) {
+ self['init' + _modules[i]]();
+ }
+
+ // init
+ if (UiClass) {
+ var ui = (self.ui = new UiClass(self, framework));
+ ui.init();
+ }
+
+ _shout('firstUpdate');
+ _currentItemIndex = _currentItemIndex || _options.index || 0;
+ // validate index
+ if (
+ isNaN(_currentItemIndex) ||
+ _currentItemIndex < 0 ||
+ _currentItemIndex >= _getNumItems()
+ ) {
+ _currentItemIndex = 0;
+ }
+ self.currItem = _getItemAt(_currentItemIndex);
+
+ if (_features.isOldIOSPhone || _features.isOldAndroid) {
+ _isFixedPosition = false;
+ }
+
+ template.setAttribute('aria-hidden', 'false');
+ if (_options.modal) {
+ if (!_isFixedPosition) {
+ template.style.position = 'absolute';
+ template.style.top = framework.getScrollY() + 'px';
+ } else {
+ template.style.position = 'fixed';
+ }
+ }
+
+ if (_currentWindowScrollY === undefined) {
+ _shout('initialLayout');
+ _currentWindowScrollY = _initalWindowScrollY =
+ framework.getScrollY();
+ }
+
+ // add classes to root element of PhotoSwipe
+ var rootClasses = 'pswp--open ';
+ if (_options.mainClass) {
+ rootClasses += _options.mainClass + ' ';
+ }
+ if (_options.showHideOpacity) {
+ rootClasses += 'pswp--animate_opacity ';
+ }
+ rootClasses += _likelyTouchDevice ? 'pswp--touch' : 'pswp--notouch';
+ rootClasses += _features.animationName ? ' pswp--css_animation' : '';
+ rootClasses += _features.svg ? ' pswp--svg' : '';
+ framework.addClass(template, rootClasses);
+
+ self.updateSize();
+
+ // initial update
+ _containerShiftIndex = -1;
+ _indexDiff = null;
+ for (i = 0; i < NUM_HOLDERS; i++) {
+ _setTranslateX(
+ (i + _containerShiftIndex) * _slideSize.x,
+ _itemHolders[i].el.style
+ );
+ }
+
+ if (!_oldIE) {
+ framework.bind(self.scrollWrap, _downEvents, self); // no dragging for old IE
+ }
+
+ _listen('initialZoomInEnd', function () {
+ self.setContent(_itemHolders[0], _currentItemIndex - 1);
+ self.setContent(_itemHolders[2], _currentItemIndex + 1);
+
+ _itemHolders[0].el.style.display =
+ _itemHolders[2].el.style.display = 'block';
+
+ if (_options.focus) {
+ // focus causes layout,
+ // which causes lag during the animation,
+ // that's why we delay it untill the initial zoom transition ends
+ template.focus();
+ }
+
+ _bindEvents();
+ });
+
+ // set content for center slide (first time)
+ self.setContent(_itemHolders[1], _currentItemIndex);
+
+ self.updateCurrItem();
+
+ _shout('afterInit');
+
+ if (!_isFixedPosition) {
+ // On all versions of iOS lower than 8.0, we check size of viewport every second.
+ //
+ // This is done to detect when Safari top & bottom bars appear,
+ // as this action doesn't trigger any events (like resize).
+ //
+ // On iOS8 they fixed this.
+ //
+ // 10 Nov 2014: iOS 7 usage ~40%. iOS 8 usage 56%.
+
+ _updateSizeInterval = setInterval(function () {
+ if (
+ !_numAnimations &&
+ !_isDragging &&
+ !_isZooming &&
+ _currZoomLevel === self.currItem.initialZoomLevel
+ ) {
+ self.updateSize();
+ }
+ }, 1000);
+ }
+
+ framework.addClass(template, 'pswp--visible');
+ },
+
+ isOpen: function () {
+ return _isOpen;
+ },
+
+ // Close the gallery, then destroy it
+ close: function () {
+ if (!_isOpen) {
+ return;
+ }
+
+ _isOpen = false;
+ _isDestroying = true;
+ _shout('close');
+ _unbindEvents();
+
+ _showOrHide(self.currItem, null, true, self.destroy);
+ },
+
+ // destroys the gallery (unbinds events, cleans up intervals and timeouts to avoid memory leaks)
+ destroy: function () {
+ _shout('destroy');
+
+ if (_showOrHideTimeout) {
+ clearTimeout(_showOrHideTimeout);
+ }
+
+ template.setAttribute('aria-hidden', 'true');
+ template.className = _initalClassName;
+
+ if (_updateSizeInterval) {
+ clearInterval(_updateSizeInterval);
+ }
+
+ framework.unbind(self.scrollWrap, _downEvents, self);
+
+ // we unbind scroll event at the end, as closing animation may depend on it
+ framework.unbind(window, 'scroll', self);
+
+ _stopDragUpdateLoop();
+
+ _stopAllAnimations();
+
+ _listeners = null;
+ },
+
+ /**
+ * Pan image to position
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Boolean} force Will ignore bounds if set to true.
+ */
+ panTo: function (x, y, force) {
+ if (!force && _currPanBounds) {
+ if (x > _currPanBounds.min.x) {
+ x = _currPanBounds.min.x;
+ } else if (x < _currPanBounds.max.x) {
+ x = _currPanBounds.max.x;
+ }
+
+ if (y > _currPanBounds.min.y) {
+ y = _currPanBounds.min.y;
+ } else if (y < _currPanBounds.max.y) {
+ y = _currPanBounds.max.y;
+ }
+ }
+
+ _panOffset.x = x;
+ _panOffset.y = y;
+ _applyCurrentZoomPan();
+ },
+
+ handleEvent: function (e) {
+ e = e || window.event;
+ if (_globalEventHandlers[e.type]) {
+ _globalEventHandlers[e.type](e);
+ }
+ },
+
+ goTo: function (index) {
+ index = _getLoopedId(index);
+
+ var diff = index - _currentItemIndex;
+ _indexDiff = diff;
+
+ _currentItemIndex = index;
+ self.currItem = _getItemAt(_currentItemIndex);
+ _currPositionIndex -= diff;
+
+ _moveMainScroll(_slideSize.x * _currPositionIndex);
+
+ _stopAllAnimations();
+ _mainScrollAnimating = false;
+
+ self.updateCurrItem();
+ },
+ next: function () {
+ self.goTo(_currentItemIndex + 1);
+ },
+ prev: function () {
+ self.goTo(_currentItemIndex - 1);
+ },
+
+ // update current zoom/pan objects
+ updateCurrZoomItem: function (emulateSetContent) {
+ if (emulateSetContent) {
+ _shout('beforeChange', 0);
+ }
+
+ // itemHolder[1] is middle (current) item
+ if (_itemHolders[1].el.children.length) {
+ var zoomElement = _itemHolders[1].el.children[0];
+ if (framework.hasClass(zoomElement, 'pswp__zoom-wrap')) {
+ _currZoomElementStyle = zoomElement.style;
+ } else {
+ _currZoomElementStyle = null;
+ }
+ } else {
+ _currZoomElementStyle = null;
+ }
+
+ _currPanBounds = self.currItem.bounds;
+ _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
+ if (_currPanBounds) {
+ _panOffset.x = _currPanBounds.center.x;
+ _panOffset.y = _currPanBounds.center.y;
+ }
+ if (emulateSetContent) {
+ _shout('afterChange');
+ }
+ },
+
+ invalidateCurrItems: function () {
+ _itemsNeedUpdate = true;
+ for (var i = 0; i < NUM_HOLDERS; i++) {
+ if (_itemHolders[i].item) {
+ _itemHolders[i].item.needsUpdate = true;
+ }
+ }
+ },
+
+ updateCurrItem: function (beforeAnimation) {
+ if (_indexDiff === 0) {
+ return;
+ }
+
+ var diffAbs = Math.abs(_indexDiff),
+ tempHolder;
+
+ if (beforeAnimation && diffAbs < 2) {
+ return;
+ }
+
+ self.currItem = _getItemAt(_currentItemIndex);
+ _renderMaxResolution = false;
+
+ _shout('beforeChange', _indexDiff);
+
+ if (diffAbs >= NUM_HOLDERS) {
+ _containerShiftIndex +=
+ _indexDiff + (_indexDiff > 0 ? -NUM_HOLDERS : NUM_HOLDERS);
+ diffAbs = NUM_HOLDERS;
+ }
+ for (var i = 0; i < diffAbs; i++) {
+ if (_indexDiff > 0) {
+ tempHolder = _itemHolders.shift();
+ _itemHolders[NUM_HOLDERS - 1] = tempHolder; // move first to last
+
+ _containerShiftIndex++;
+ _setTranslateX(
+ (_containerShiftIndex + 2) * _slideSize.x,
+ tempHolder.el.style
+ );
+ self.setContent(
+ tempHolder,
+ _currentItemIndex - diffAbs + i + 1 + 1
+ );
+ } else {
+ tempHolder = _itemHolders.pop();
+ _itemHolders.unshift(tempHolder); // move last to first
+
+ _containerShiftIndex--;
+ _setTranslateX(
+ _containerShiftIndex * _slideSize.x,
+ tempHolder.el.style
+ );
+ self.setContent(
+ tempHolder,
+ _currentItemIndex + diffAbs - i - 1 - 1
+ );
+ }
+ }
+
+ // reset zoom/pan on previous item
+ if (_currZoomElementStyle && Math.abs(_indexDiff) === 1) {
+ var prevItem = _getItemAt(_prevItemIndex);
+ if (prevItem.initialZoomLevel !== _currZoomLevel) {
+ _calculateItemSize(prevItem, _viewportSize);
+ _setImageSize(prevItem);
+ _applyZoomPanToItem(prevItem);
+ }
+ }
+
+ // reset diff after update
+ _indexDiff = 0;
+
+ self.updateCurrZoomItem();
+
+ _prevItemIndex = _currentItemIndex;
+
+ _shout('afterChange');
+ },
+
+ updateSize: function (force) {
+ if (!_isFixedPosition && _options.modal) {
+ var windowScrollY = framework.getScrollY();
+ if (_currentWindowScrollY !== windowScrollY) {
+ template.style.top = windowScrollY + 'px';
+ _currentWindowScrollY = windowScrollY;
+ }
+ if (
+ !force &&
+ _windowVisibleSize.x === window.innerWidth &&
+ _windowVisibleSize.y === window.innerHeight
+ ) {
+ return;
+ }
+ _windowVisibleSize.x = window.innerWidth;
+ _windowVisibleSize.y = window.innerHeight;
+
+ //template.style.width = _windowVisibleSize.x + 'px';
+ template.style.height = _windowVisibleSize.y + 'px';
+ }
+
+ _viewportSize.x = self.scrollWrap.clientWidth;
+ _viewportSize.y = self.scrollWrap.clientHeight;
+
+ _updatePageScrollOffset();
+
+ _slideSize.x =
+ _viewportSize.x + Math.round(_viewportSize.x * _options.spacing);
+ _slideSize.y = _viewportSize.y;
+
+ _moveMainScroll(_slideSize.x * _currPositionIndex);
+
+ _shout('beforeResize'); // even may be used for example to switch image sources
+
+ // don't re-calculate size on inital size update
+ if (_containerShiftIndex !== undefined) {
+ var holder, item, hIndex;
+
+ for (var i = 0; i < NUM_HOLDERS; i++) {
+ holder = _itemHolders[i];
+ _setTranslateX(
+ (i + _containerShiftIndex) * _slideSize.x,
+ holder.el.style
+ );
+
+ hIndex = _currentItemIndex + i - 1;
+
+ if (_options.loop && _getNumItems() > 2) {
+ hIndex = _getLoopedId(hIndex);
+ }
+
+ // update zoom level on items and refresh source (if needsUpdate)
+ item = _getItemAt(hIndex);
+
+ // re-render gallery item if `needsUpdate`,
+ // or doesn't have `bounds` (entirely new slide object)
+ if (
+ item &&
+ (_itemsNeedUpdate || item.needsUpdate || !item.bounds)
+ ) {
+ self.cleanSlide(item);
+
+ self.setContent(holder, hIndex);
+
+ // if "center" slide
+ if (i === 1) {
+ self.currItem = item;
+ self.updateCurrZoomItem(true);
+ }
+
+ item.needsUpdate = false;
+ } else if (holder.index === -1 && hIndex >= 0) {
+ // add content first time
+ self.setContent(holder, hIndex);
+ }
+ if (item && item.container) {
+ _calculateItemSize(item, _viewportSize);
+ _setImageSize(item);
+ _applyZoomPanToItem(item);
+ }
+ }
+ _itemsNeedUpdate = false;
+ }
+
+ _startZoomLevel = _currZoomLevel = self.currItem.initialZoomLevel;
+ _currPanBounds = self.currItem.bounds;
+
+ if (_currPanBounds) {
+ _panOffset.x = _currPanBounds.center.x;
+ _panOffset.y = _currPanBounds.center.y;
+ _applyCurrentZoomPan(true);
+ }
+
+ _shout('resize');
+ },
+
+ // Zoom current item to
+ zoomTo: function (destZoomLevel, centerPoint, speed, easingFn, updateFn) {
+ /*
+ if(destZoomLevel === 'fit') {
+ destZoomLevel = self.currItem.fitRatio;
+ } else if(destZoomLevel === 'fill') {
+ destZoomLevel = self.currItem.fillRatio;
+ }
+ */
+
+ if (centerPoint && _panOffset) {
+ _startZoomLevel = _currZoomLevel;
+ _midZoomPoint.x = Math.abs(centerPoint.x) - _panOffset.x;
+ _midZoomPoint.y = Math.abs(centerPoint.y) - _panOffset.y;
+ _equalizePoints(_startPanOffset, _panOffset);
+ }
+
+ var destPanBounds = _calculatePanBounds(destZoomLevel, false),
+ destPanOffset = {};
+
+ _modifyDestPanOffset('x', destPanBounds, destPanOffset, destZoomLevel);
+ _modifyDestPanOffset('y', destPanBounds, destPanOffset, destZoomLevel);
+
+ var initialZoomLevel = _currZoomLevel;
+ var initialPanOffset = {
+ x: _panOffset.x,
+ y: _panOffset.y,
+ };
+
+ _roundPoint(destPanOffset);
+
+ var onUpdate = function (now) {
+ if (now === 1) {
+ _currZoomLevel = destZoomLevel;
+ _panOffset.x = destPanOffset.x;
+ _panOffset.y = destPanOffset.y;
+ } else {
+ _currZoomLevel =
+ (destZoomLevel - initialZoomLevel) * now + initialZoomLevel;
+ _panOffset.x =
+ (destPanOffset.x - initialPanOffset.x) * now +
+ initialPanOffset.x;
+ _panOffset.y =
+ (destPanOffset.y - initialPanOffset.y) * now +
+ initialPanOffset.y;
+ }
+
+ if (updateFn) {
+ updateFn(now);
+ }
+
+ _applyCurrentZoomPan(now === 1);
+ };
+
+ if (speed) {
+ _animateProp(
+ 'customZoomTo',
+ 0,
+ 1,
+ speed,
+ easingFn || framework.easing.sine.inOut,
+ onUpdate
+ );
+ } else {
+ onUpdate(1);
+ }
+ },
+};
diff --git a/apps/photos/thirdparty/photoswipe/src/js/desktop-zoom.js b/apps/photos/thirdparty/photoswipe/src/js/desktop-zoom.js
new file mode 100644
index 000000000..39128cd84
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/desktop-zoom.js
@@ -0,0 +1,179 @@
+/**
+ *
+ * desktop-zoom.js:
+ *
+ * - Binds mousewheel event for paning zoomed image.
+ * - Manages "dragging", "zoomed-in", "zoom-out" classes.
+ * (which are used for cursors and zoom icon)
+ * - Adds toggleDesktopZoom function.
+ *
+ */
+
+var _wheelDelta;
+
+_registerModule('DesktopZoom', {
+ publicMethods: {
+ initDesktopZoom: function () {
+ if (_oldIE) {
+ // no zoom for old IE (<=8)
+ return;
+ }
+
+ if (_likelyTouchDevice) {
+ // if detected hardware touch support, we wait until mouse is used,
+ // and only then apply desktop-zoom features
+ _listen('mouseUsed', function () {
+ self.setupDesktopZoom();
+ });
+ } else {
+ self.setupDesktopZoom(true);
+ }
+ },
+
+ setupDesktopZoom: function (onInit) {
+ _wheelDelta = {};
+
+ var events = 'wheel mousewheel DOMMouseScroll';
+
+ _listen('bindEvents', function () {
+ framework.bind(template, events, self.handleMouseWheel);
+ });
+
+ _listen('unbindEvents', function () {
+ if (_wheelDelta) {
+ framework.unbind(template, events, self.handleMouseWheel);
+ }
+ });
+
+ self.mouseZoomedIn = false;
+
+ var hasDraggingClass,
+ updateZoomable = function () {
+ if (self.mouseZoomedIn) {
+ framework.removeClass(template, 'pswp--zoomed-in');
+ self.mouseZoomedIn = false;
+ }
+ if (_currZoomLevel < 1) {
+ framework.addClass(template, 'pswp--zoom-allowed');
+ } else {
+ framework.removeClass(template, 'pswp--zoom-allowed');
+ }
+ removeDraggingClass();
+ },
+ removeDraggingClass = function () {
+ if (hasDraggingClass) {
+ framework.removeClass(template, 'pswp--dragging');
+ hasDraggingClass = false;
+ }
+ };
+
+ _listen('resize', updateZoomable);
+ _listen('afterChange', updateZoomable);
+ _listen('pointerDown', function () {
+ if (self.mouseZoomedIn) {
+ hasDraggingClass = true;
+ framework.addClass(template, 'pswp--dragging');
+ }
+ });
+ _listen('pointerUp', removeDraggingClass);
+
+ if (!onInit) {
+ updateZoomable();
+ }
+ },
+
+ handleMouseWheel: function (e) {
+ if (_currZoomLevel <= self.currItem.fitRatio) {
+ if (_options.modal) {
+ if (
+ !_options.closeOnScroll ||
+ _numAnimations ||
+ _isDragging
+ ) {
+ e.preventDefault();
+ } else if (_transformKey && Math.abs(e.deltaY) > 2) {
+ // close PhotoSwipe
+ // if browser supports transforms & scroll changed enough
+ _closedByScroll = true;
+ self.close();
+ }
+ }
+ return true;
+ }
+
+ // allow just one event to fire
+ e.stopPropagation();
+
+ // https://developer.mozilla.org/en-US/docs/Web/Events/wheel
+ _wheelDelta.x = 0;
+
+ if ('deltaX' in e) {
+ if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {
+ // 18 - average line height
+ _wheelDelta.x = e.deltaX * 18;
+ _wheelDelta.y = e.deltaY * 18;
+ } else {
+ _wheelDelta.x = e.deltaX;
+ _wheelDelta.y = e.deltaY;
+ }
+ } else if ('wheelDelta' in e) {
+ if (e.wheelDeltaX) {
+ _wheelDelta.x = -0.16 * e.wheelDeltaX;
+ }
+ if (e.wheelDeltaY) {
+ _wheelDelta.y = -0.16 * e.wheelDeltaY;
+ } else {
+ _wheelDelta.y = -0.16 * e.wheelDelta;
+ }
+ } else if ('detail' in e) {
+ _wheelDelta.y = e.detail;
+ } else {
+ return;
+ }
+
+ _calculatePanBounds(_currZoomLevel, true);
+
+ var newPanX = _panOffset.x - _wheelDelta.x,
+ newPanY = _panOffset.y - _wheelDelta.y;
+
+ // only prevent scrolling in nonmodal mode when not at edges
+ if (
+ _options.modal ||
+ (newPanX <= _currPanBounds.min.x &&
+ newPanX >= _currPanBounds.max.x &&
+ newPanY <= _currPanBounds.min.y &&
+ newPanY >= _currPanBounds.max.y)
+ ) {
+ e.preventDefault();
+ }
+
+ // TODO: use rAF instead of mousewheel?
+ self.panTo(newPanX, newPanY);
+ },
+
+ toggleDesktopZoom: function (centerPoint) {
+ centerPoint = centerPoint || {
+ x: _viewportSize.x / 2 + _offset.x,
+ y: _viewportSize.y / 2 + _offset.y,
+ };
+
+ var doubleTapZoomLevel = _options.getDoubleTapZoom(
+ true,
+ self.currItem
+ );
+ var zoomOut = _currZoomLevel === doubleTapZoomLevel;
+
+ self.mouseZoomedIn = !zoomOut;
+
+ self.zoomTo(
+ zoomOut ? self.currItem.initialZoomLevel : doubleTapZoomLevel,
+ centerPoint,
+ 333
+ );
+ framework[(!zoomOut ? 'add' : 'remove') + 'Class'](
+ template,
+ 'pswp--zoomed-in'
+ );
+ },
+ },
+});
diff --git a/apps/photos/thirdparty/photoswipe/src/js/framework-bridge.js b/apps/photos/thirdparty/photoswipe/src/js/framework-bridge.js
new file mode 100644
index 000000000..974e5e9d4
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/framework-bridge.js
@@ -0,0 +1,293 @@
+/**
+ *
+ * Set of generic functions used by gallery.
+ *
+ * You're free to modify anything here as long as functionality is kept.
+ *
+ */
+var framework = {
+ features: null,
+ bind: function (target, type, listener, unbind) {
+ var methodName = (unbind ? 'remove' : 'add') + 'EventListener';
+ type = type.split(' ');
+ for (var i = 0; i < type.length; i++) {
+ if (type[i]) {
+ target[methodName](type[i], listener, false);
+ }
+ }
+ },
+ isArray: function (obj) {
+ return obj instanceof Array;
+ },
+ createEl: function (classes, tag) {
+ var el = document.createElement(tag || 'div');
+ if (classes) {
+ el.className = classes;
+ }
+ return el;
+ },
+ getScrollY: function () {
+ var yOffset = window.pageYOffset;
+ return yOffset !== undefined
+ ? yOffset
+ : document.documentElement.scrollTop;
+ },
+ unbind: function (target, type, listener) {
+ framework.bind(target, type, listener, true);
+ },
+ removeClass: function (el, className) {
+ var reg = new RegExp('(\\s|^)' + className + '(\\s|$)');
+ el.className = el.className
+ .replace(reg, ' ')
+ .replace(/^\s\s*/, '')
+ .replace(/\s\s*$/, '');
+ },
+ addClass: function (el, className) {
+ if (!framework.hasClass(el, className)) {
+ el.className += (el.className ? ' ' : '') + className;
+ }
+ },
+ hasClass: function (el, className) {
+ return (
+ el.className &&
+ new RegExp('(^|\\s)' + className + '(\\s|$)').test(el.className)
+ );
+ },
+ getChildByClass: function (parentEl, childClassName) {
+ var node = parentEl.firstChild;
+ while (node) {
+ if (framework.hasClass(node, childClassName)) {
+ return node;
+ }
+ node = node.nextSibling;
+ }
+ },
+ arraySearch: function (array, value, key) {
+ var i = array.length;
+ while (i--) {
+ if (array[i][key] === value) {
+ return i;
+ }
+ }
+ return -1;
+ },
+ extend: function (o1, o2, preventOverwrite) {
+ for (var prop in o2) {
+ if (o2.hasOwnProperty(prop)) {
+ if (preventOverwrite && o1.hasOwnProperty(prop)) {
+ continue;
+ }
+ o1[prop] = o2[prop];
+ }
+ }
+ },
+ easing: {
+ sine: {
+ out: function (k) {
+ return Math.sin(k * (Math.PI / 2));
+ },
+ inOut: function (k) {
+ return -(Math.cos(Math.PI * k) - 1) / 2;
+ },
+ },
+ cubic: {
+ out: function (k) {
+ return --k * k * k + 1;
+ },
+ },
+ /*
+ elastic: {
+ out: function ( k ) {
+
+ var s, a = 0.1, p = 0.4;
+ if ( k === 0 ) return 0;
+ if ( k === 1 ) return 1;
+ if ( !a || a < 1 ) { a = 1; s = p / 4; }
+ else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );
+ return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );
+
+ },
+ },
+ back: {
+ out: function ( k ) {
+ var s = 1.70158;
+ return --k * k * ( ( s + 1 ) * k + s ) + 1;
+ }
+ }
+ */
+ },
+
+ /**
+ *
+ * @return {object}
+ *
+ * {
+ * raf : request animation frame function
+ * caf : cancel animation frame function
+ * transfrom : transform property key (with vendor), or null if not supported
+ * oldIE : IE8 or below
+ * }
+ *
+ */
+ detectFeatures: function () {
+ if (framework.features) {
+ return framework.features;
+ }
+ var helperEl = framework.createEl(),
+ helperStyle = helperEl.style,
+ vendor = '',
+ features = {};
+
+ // IE8 and below
+ features.oldIE = document.all && !document.addEventListener;
+
+ features.touch = 'ontouchstart' in window;
+
+ if (window.requestAnimationFrame) {
+ features.raf = window.requestAnimationFrame;
+ features.caf = window.cancelAnimationFrame;
+ }
+
+ features.pointerEvent =
+ !!window.PointerEvent || navigator.msPointerEnabled;
+
+ // fix false-positive detection of old Android in new IE
+ // (IE11 ua string contains "Android 4.0")
+
+ if (!features.pointerEvent) {
+ var ua = navigator.userAgent;
+
+ // Detect if device is iPhone or iPod and if it's older than iOS 8
+ // http://stackoverflow.com/a/14223920
+ //
+ // This detection is made because of buggy top/bottom toolbars
+ // that don't trigger window.resize event.
+ // For more info refer to _isFixedPosition variable in core.js
+
+ if (/iP(hone|od)/.test(navigator.platform)) {
+ var v = navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);
+ if (v && v.length > 0) {
+ v = parseInt(v[1], 10);
+ if (v >= 1 && v < 8) {
+ features.isOldIOSPhone = true;
+ }
+ }
+ }
+
+ // Detect old Android (before KitKat)
+ // due to bugs related to position:fixed
+ // http://stackoverflow.com/questions/7184573/pick-up-the-android-version-in-the-browser-by-javascript
+
+ var match = ua.match(/Android\s([0-9\.]*)/);
+ var androidversion = match ? match[1] : 0;
+ androidversion = parseFloat(androidversion);
+ if (androidversion >= 1) {
+ if (androidversion < 4.4) {
+ features.isOldAndroid = true; // for fixed position bug & performance
+ }
+ features.androidVersion = androidversion; // for touchend bug
+ }
+ features.isMobileOpera = /opera mini|opera mobi/i.test(ua);
+
+ // p.s. yes, yes, UA sniffing is bad, propose your solution for above bugs.
+ }
+
+ var styleChecks = ['transform', 'perspective', 'animationName'],
+ vendors = ['', 'webkit', 'Moz', 'ms', 'O'],
+ styleCheckItem,
+ styleName;
+
+ for (var i = 0; i < 4; i++) {
+ vendor = vendors[i];
+
+ for (var a = 0; a < 3; a++) {
+ styleCheckItem = styleChecks[a];
+
+ // uppercase first letter of property name, if vendor is present
+ styleName =
+ vendor +
+ (vendor
+ ? styleCheckItem.charAt(0).toUpperCase() +
+ styleCheckItem.slice(1)
+ : styleCheckItem);
+
+ if (!features[styleCheckItem] && styleName in helperStyle) {
+ features[styleCheckItem] = styleName;
+ }
+ }
+
+ if (vendor && !features.raf) {
+ vendor = vendor.toLowerCase();
+ features.raf = window[vendor + 'RequestAnimationFrame'];
+ if (features.raf) {
+ features.caf =
+ window[vendor + 'CancelAnimationFrame'] ||
+ window[vendor + 'CancelRequestAnimationFrame'];
+ }
+ }
+ }
+
+ if (!features.raf) {
+ var lastTime = 0;
+ features.raf = function (fn) {
+ var currTime = new Date().getTime();
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
+ var id = window.setTimeout(function () {
+ fn(currTime + timeToCall);
+ }, timeToCall);
+ lastTime = currTime + timeToCall;
+ return id;
+ };
+ features.caf = function (id) {
+ clearTimeout(id);
+ };
+ }
+
+ // Detect SVG support
+ features.svg =
+ !!document.createElementNS &&
+ !!document.createElementNS('http://www.w3.org/2000/svg', 'svg')
+ .createSVGRect;
+
+ framework.features = features;
+
+ return features;
+ },
+};
+
+framework.detectFeatures();
+
+// Override addEventListener for old versions of IE
+if (framework.features.oldIE) {
+ framework.bind = function (target, type, listener, unbind) {
+ type = type.split(' ');
+
+ var methodName = (unbind ? 'detach' : 'attach') + 'Event',
+ evName,
+ _handleEv = function () {
+ listener.handleEvent.call(listener);
+ };
+
+ for (var i = 0; i < type.length; i++) {
+ evName = type[i];
+ if (evName) {
+ if (typeof listener === 'object' && listener.handleEvent) {
+ if (!unbind) {
+ listener['oldIE' + evName] = _handleEv;
+ } else {
+ if (!listener['oldIE' + evName]) {
+ return false;
+ }
+ }
+
+ target[methodName](
+ 'on' + evName,
+ listener['oldIE' + evName]
+ );
+ } else {
+ target[methodName]('on' + evName, listener);
+ }
+ }
+ }
+ };
+}
diff --git a/apps/photos/thirdparty/photoswipe/src/js/gestures.js b/apps/photos/thirdparty/photoswipe/src/js/gestures.js
new file mode 100644
index 000000000..44b92cb8b
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/gestures.js
@@ -0,0 +1,1213 @@
+/**
+ * Mouse/touch/pointer event handlers.
+ *
+ * separated from @core.js for readability
+ */
+
+var MIN_SWIPE_DISTANCE = 30,
+ DIRECTION_CHECK_OFFSET = 10; // amount of pixels to drag to determine direction of swipe
+
+var _gestureStartTime,
+ _gestureCheckSpeedTime,
+ // pool of objects that are used during dragging of zooming
+ p = {}, // first point
+ p2 = {}, // second point (for zoom gesture)
+ delta = {},
+ _currPoint = {},
+ _startPoint = {},
+ _currPointers = [],
+ _startMainScrollPos = {},
+ _releaseAnimData,
+ _posPoints = [], // array of points during dragging, used to determine type of gesture
+ _tempPoint = {},
+ _isZoomingIn,
+ _verticalDragInitiated,
+ _oldAndroidTouchEndTimeout,
+ _currZoomedItemIndex = 0,
+ _centerPoint = _getEmptyPoint(),
+ _lastReleaseTime = 0,
+ _isDragging, // at least one pointer is down
+ _isMultitouch, // at least two _pointers are down
+ _zoomStarted, // zoom level changed during zoom gesture
+ _moved,
+ _dragAnimFrame,
+ _mainScrollShifted,
+ _currentPoints, // array of current touch points
+ _isZooming,
+ _currPointsDistance,
+ _startPointsDistance,
+ _currPanBounds,
+ _mainScrollPos = _getEmptyPoint(),
+ _currZoomElementStyle,
+ _mainScrollAnimating, // true, if animation after swipe gesture is running
+ _midZoomPoint = _getEmptyPoint(),
+ _currCenterPoint = _getEmptyPoint(),
+ _direction,
+ _isFirstMove,
+ _opacityChanged,
+ _bgOpacity,
+ _wasOverInitialZoom,
+ _isEqualPoints = function (p1, p2) {
+ return p1.x === p2.x && p1.y === p2.y;
+ },
+ _isNearbyPoints = function (touch0, touch1) {
+ return (
+ Math.abs(touch0.x - touch1.x) < DOUBLE_TAP_RADIUS &&
+ Math.abs(touch0.y - touch1.y) < DOUBLE_TAP_RADIUS
+ );
+ },
+ _calculatePointsDistance = function (p1, p2) {
+ _tempPoint.x = Math.abs(p1.x - p2.x);
+ _tempPoint.y = Math.abs(p1.y - p2.y);
+ return Math.sqrt(
+ _tempPoint.x * _tempPoint.x + _tempPoint.y * _tempPoint.y
+ );
+ },
+ _stopDragUpdateLoop = function () {
+ if (_dragAnimFrame) {
+ _cancelAF(_dragAnimFrame);
+ _dragAnimFrame = null;
+ }
+ },
+ _dragUpdateLoop = function () {
+ if (_isDragging) {
+ _dragAnimFrame = _requestAF(_dragUpdateLoop);
+ _renderMovement();
+ }
+ },
+ _canPan = function () {
+ return !(
+ _options.scaleMode === 'fit' &&
+ _currZoomLevel === self.currItem.initialZoomLevel
+ );
+ },
+ // find the closest parent DOM element
+ _closestElement = function (el, fn) {
+ if (!el || el === document) {
+ return false;
+ }
+
+ // don't search elements above pswp__scroll-wrap
+ if (
+ el.getAttribute('class') &&
+ el.getAttribute('class').indexOf('pswp__scroll-wrap') > -1
+ ) {
+ return false;
+ }
+
+ if (fn(el)) {
+ return el;
+ }
+
+ return _closestElement(el.parentNode, fn);
+ },
+ _preventObj = {},
+ _preventDefaultEventBehaviour = function (e, isDown) {
+ _preventObj.prevent = !_closestElement(
+ e.target,
+ _options.isClickableElement
+ );
+
+ _shout('preventDragEvent', e, isDown, _preventObj);
+ return _preventObj.prevent;
+ },
+ _convertTouchToPoint = function (touch, p) {
+ p.x = touch.pageX;
+ p.y = touch.pageY;
+ p.id = touch.identifier;
+ return p;
+ },
+ _findCenterOfPoints = function (p1, p2, pCenter) {
+ pCenter.x = (p1.x + p2.x) * 0.5;
+ pCenter.y = (p1.y + p2.y) * 0.5;
+ },
+ _pushPosPoint = function (time, x, y) {
+ if (time - _gestureCheckSpeedTime > 50) {
+ var o = _posPoints.length > 2 ? _posPoints.shift() : {};
+ o.x = x;
+ o.y = y;
+ _posPoints.push(o);
+ _gestureCheckSpeedTime = time;
+ }
+ },
+ _calculateVerticalDragOpacityRatio = function () {
+ var yOffset = _panOffset.y - self.currItem.initialPosition.y; // difference between initial and current position
+ return 1 - Math.abs(yOffset / (_viewportSize.y / 2));
+ },
+ // points pool, reused during touch events
+ _ePoint1 = {},
+ _ePoint2 = {},
+ _tempPointsArr = [],
+ _tempCounter,
+ _getTouchPoints = function (e) {
+ // clean up previous points, without recreating array
+ while (_tempPointsArr.length > 0) {
+ _tempPointsArr.pop();
+ }
+
+ if (!_pointerEventEnabled) {
+ if (e.type.indexOf('touch') > -1) {
+ if (e.touches && e.touches.length > 0) {
+ _tempPointsArr[0] = _convertTouchToPoint(
+ e.touches[0],
+ _ePoint1
+ );
+ if (e.touches.length > 1) {
+ _tempPointsArr[1] = _convertTouchToPoint(
+ e.touches[1],
+ _ePoint2
+ );
+ }
+ }
+ } else {
+ _ePoint1.x = e.pageX;
+ _ePoint1.y = e.pageY;
+ _ePoint1.id = '';
+ _tempPointsArr[0] = _ePoint1; //_ePoint1;
+ }
+ } else {
+ _tempCounter = 0;
+ // we can use forEach, as pointer events are supported only in modern browsers
+ _currPointers.forEach(function (p) {
+ if (_tempCounter === 0) {
+ _tempPointsArr[0] = p;
+ } else if (_tempCounter === 1) {
+ _tempPointsArr[1] = p;
+ }
+ _tempCounter++;
+ });
+ }
+ return _tempPointsArr;
+ },
+ _panOrMoveMainScroll = function (axis, delta) {
+ var panFriction,
+ overDiff = 0,
+ newOffset = _panOffset[axis] + delta[axis],
+ startOverDiff,
+ dir = delta[axis] > 0,
+ newMainScrollPosition = _mainScrollPos.x + delta.x,
+ mainScrollDiff = _mainScrollPos.x - _startMainScrollPos.x,
+ newPanPos,
+ newMainScrollPos;
+
+ // calculate fdistance over the bounds and friction
+ if (
+ newOffset > _currPanBounds.min[axis] ||
+ newOffset < _currPanBounds.max[axis]
+ ) {
+ panFriction = _options.panEndFriction;
+ // Linear increasing of friction, so at 1/4 of viewport it's at max value.
+ // Looks not as nice as was expected. Left for history.
+ // panFriction = (1 - (_panOffset[axis] + delta[axis] + panBounds.min[axis]) / (_viewportSize[axis] / 4) );
+ } else {
+ panFriction = 1;
+ }
+
+ newOffset = _panOffset[axis] + delta[axis] * panFriction;
+
+ // move main scroll or start panning
+ if (
+ _options.allowPanToNext ||
+ _currZoomLevel === self.currItem.initialZoomLevel
+ ) {
+ if (!_currZoomElementStyle) {
+ newMainScrollPos = newMainScrollPosition;
+ } else if (_direction === 'h' && axis === 'x' && !_zoomStarted) {
+ if (dir) {
+ if (newOffset > _currPanBounds.min[axis]) {
+ panFriction = _options.panEndFriction;
+ overDiff = _currPanBounds.min[axis] - newOffset;
+ startOverDiff =
+ _currPanBounds.min[axis] - _startPanOffset[axis];
+ }
+
+ // drag right
+ if (
+ (startOverDiff <= 0 || mainScrollDiff < 0) &&
+ _getNumItems() > 1
+ ) {
+ newMainScrollPos = newMainScrollPosition;
+ if (
+ mainScrollDiff < 0 &&
+ newMainScrollPosition > _startMainScrollPos.x
+ ) {
+ newMainScrollPos = _startMainScrollPos.x;
+ }
+ } else {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ newPanPos = newOffset;
+ }
+ }
+ } else {
+ if (newOffset < _currPanBounds.max[axis]) {
+ panFriction = _options.panEndFriction;
+ overDiff = newOffset - _currPanBounds.max[axis];
+ startOverDiff =
+ _startPanOffset[axis] - _currPanBounds.max[axis];
+ }
+
+ if (
+ (startOverDiff <= 0 || mainScrollDiff > 0) &&
+ _getNumItems() > 1
+ ) {
+ newMainScrollPos = newMainScrollPosition;
+
+ if (
+ mainScrollDiff > 0 &&
+ newMainScrollPosition < _startMainScrollPos.x
+ ) {
+ newMainScrollPos = _startMainScrollPos.x;
+ }
+ } else {
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ newPanPos = newOffset;
+ }
+ }
+ }
+
+ //
+ }
+
+ if (axis === 'x') {
+ if (newMainScrollPos !== undefined) {
+ _moveMainScroll(newMainScrollPos, true);
+ if (newMainScrollPos === _startMainScrollPos.x) {
+ _mainScrollShifted = false;
+ } else {
+ _mainScrollShifted = true;
+ }
+ }
+
+ if (_currPanBounds.min.x !== _currPanBounds.max.x) {
+ if (newPanPos !== undefined) {
+ _panOffset.x = newPanPos;
+ } else if (!_mainScrollShifted) {
+ _panOffset.x += delta.x * panFriction;
+ }
+ }
+
+ return newMainScrollPos !== undefined;
+ }
+ }
+
+ if (!_mainScrollAnimating) {
+ if (!_mainScrollShifted) {
+ if (_currZoomLevel > self.currItem.fitRatio) {
+ _panOffset[axis] += delta[axis] * panFriction;
+ }
+ }
+ }
+ },
+ // Pointerdown/touchstart/mousedown handler
+ _onDragStart = function (e) {
+ // Allow dragging only via left mouse button.
+ // As this handler is not added in IE8 - we ignore e.which
+ //
+ // http://www.quirksmode.org/js/events_properties.html
+ // https://developer.mozilla.org/en-US/docs/Web/API/event.button
+ if (e.type === 'mousedown' && e.button > 0) {
+ return;
+ }
+
+ if (_initialZoomRunning) {
+ e.preventDefault();
+ return;
+ }
+
+ if (_oldAndroidTouchEndTimeout && e.type === 'mousedown') {
+ return;
+ }
+
+ if (_preventDefaultEventBehaviour(e, true)) {
+ e.preventDefault();
+ }
+
+ _shout('pointerDown');
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+ if (pointerIndex < 0) {
+ pointerIndex = _currPointers.length;
+ }
+ _currPointers[pointerIndex] = {
+ x: e.pageX,
+ y: e.pageY,
+ id: e.pointerId,
+ };
+ }
+
+ var startPointsList = _getTouchPoints(e),
+ numPoints = startPointsList.length;
+
+ _currentPoints = null;
+
+ _stopAllAnimations();
+
+ // init drag
+ if (!_isDragging || numPoints === 1) {
+ _isDragging = _isFirstMove = true;
+ framework.bind(window, _upMoveEvents, self);
+
+ _isZoomingIn =
+ _wasOverInitialZoom =
+ _opacityChanged =
+ _verticalDragInitiated =
+ _mainScrollShifted =
+ _moved =
+ _isMultitouch =
+ _zoomStarted =
+ false;
+
+ _direction = null;
+
+ _shout('firstTouchStart', startPointsList);
+
+ _equalizePoints(_startPanOffset, _panOffset);
+
+ _currPanDist.x = _currPanDist.y = 0;
+ _equalizePoints(_currPoint, startPointsList[0]);
+ _equalizePoints(_startPoint, _currPoint);
+
+ //_equalizePoints(_startMainScrollPos, _mainScrollPos);
+ _startMainScrollPos.x = _slideSize.x * _currPositionIndex;
+
+ _posPoints = [
+ {
+ x: _currPoint.x,
+ y: _currPoint.y,
+ },
+ ];
+
+ _gestureCheckSpeedTime = _gestureStartTime = _getCurrentTime();
+
+ //_mainScrollAnimationEnd(true);
+ _calculatePanBounds(_currZoomLevel, true);
+
+ // Start rendering
+ _stopDragUpdateLoop();
+ _dragUpdateLoop();
+ }
+
+ // init zoom
+ if (
+ !_isZooming &&
+ numPoints > 1 &&
+ !_mainScrollAnimating &&
+ !_mainScrollShifted
+ ) {
+ _startZoomLevel = _currZoomLevel;
+ _zoomStarted = false; // true if zoom changed at least once
+
+ _isZooming = _isMultitouch = true;
+ _currPanDist.y = _currPanDist.x = 0;
+
+ _equalizePoints(_startPanOffset, _panOffset);
+
+ _equalizePoints(p, startPointsList[0]);
+ _equalizePoints(p2, startPointsList[1]);
+
+ _findCenterOfPoints(p, p2, _currCenterPoint);
+
+ _midZoomPoint.x = Math.abs(_currCenterPoint.x) - _panOffset.x;
+ _midZoomPoint.y = Math.abs(_currCenterPoint.y) - _panOffset.y;
+ _currPointsDistance = _startPointsDistance =
+ _calculatePointsDistance(p, p2);
+ }
+ },
+ // Pointermove/touchmove/mousemove handler
+ _onDragMove = function (e) {
+ e.preventDefault();
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+ if (pointerIndex > -1) {
+ var p = _currPointers[pointerIndex];
+ p.x = e.pageX;
+ p.y = e.pageY;
+ }
+ }
+
+ if (_isDragging) {
+ var touchesList = _getTouchPoints(e);
+ if (!_direction && !_moved && !_isZooming) {
+ if (_mainScrollPos.x !== _slideSize.x * _currPositionIndex) {
+ // if main scroll position is shifted – direction is always horizontal
+ _direction = 'h';
+ } else {
+ var diff =
+ Math.abs(touchesList[0].x - _currPoint.x) -
+ Math.abs(touchesList[0].y - _currPoint.y);
+ // check the direction of movement
+ if (Math.abs(diff) >= DIRECTION_CHECK_OFFSET) {
+ _direction = diff > 0 ? 'h' : 'v';
+ _currentPoints = touchesList;
+ }
+ }
+ } else {
+ _currentPoints = touchesList;
+ }
+ }
+ },
+ //
+ _renderMovement = function () {
+ if (!_currentPoints) {
+ return;
+ }
+
+ var numPoints = _currentPoints.length;
+
+ if (numPoints === 0) {
+ return;
+ }
+
+ _equalizePoints(p, _currentPoints[0]);
+
+ delta.x = p.x - _currPoint.x;
+ delta.y = p.y - _currPoint.y;
+
+ if (_isZooming && numPoints > 1) {
+ // Handle behaviour for more than 1 point
+
+ _currPoint.x = p.x;
+ _currPoint.y = p.y;
+
+ // check if one of two points changed
+ if (!delta.x && !delta.y && _isEqualPoints(_currentPoints[1], p2)) {
+ return;
+ }
+
+ _equalizePoints(p2, _currentPoints[1]);
+
+ if (!_zoomStarted) {
+ _zoomStarted = true;
+ _shout('zoomGestureStarted');
+ }
+
+ // Distance between two points
+ var pointsDistance = _calculatePointsDistance(p, p2);
+
+ var zoomLevel = _calculateZoomLevel(pointsDistance);
+
+ // slightly over the of initial zoom level
+ if (
+ zoomLevel >
+ self.currItem.initialZoomLevel +
+ self.currItem.initialZoomLevel / 15
+ ) {
+ _wasOverInitialZoom = true;
+ }
+
+ // Apply the friction if zoom level is out of the bounds
+ var zoomFriction = 1,
+ minZoomLevel = _getMinZoomLevel(),
+ maxZoomLevel = _getMaxZoomLevel();
+
+ if (zoomLevel < minZoomLevel) {
+ if (
+ _options.pinchToClose &&
+ !_wasOverInitialZoom &&
+ _startZoomLevel <= self.currItem.initialZoomLevel
+ ) {
+ // fade out background if zooming out
+ var minusDiff = minZoomLevel - zoomLevel;
+ var percent = 1 - minusDiff / (minZoomLevel / 1.2);
+
+ _applyBgOpacity(percent);
+ _shout('onPinchClose', percent);
+ _opacityChanged = true;
+ } else {
+ zoomFriction = (minZoomLevel - zoomLevel) / minZoomLevel;
+ if (zoomFriction > 1) {
+ zoomFriction = 1;
+ }
+ zoomLevel =
+ minZoomLevel - zoomFriction * (minZoomLevel / 3);
+ }
+ } else if (zoomLevel > maxZoomLevel) {
+ // 1.5 - extra zoom level above the max. E.g. if max is x6, real max 6 + 1.5 = 7.5
+ zoomFriction = (zoomLevel - maxZoomLevel) / (minZoomLevel * 6);
+ if (zoomFriction > 1) {
+ zoomFriction = 1;
+ }
+ zoomLevel = maxZoomLevel + zoomFriction * minZoomLevel;
+ }
+
+ if (zoomFriction < 0) {
+ zoomFriction = 0;
+ }
+
+ // distance between touch points after friction is applied
+ _currPointsDistance = pointsDistance;
+
+ // _centerPoint - The point in the middle of two pointers
+ _findCenterOfPoints(p, p2, _centerPoint);
+
+ // paning with two pointers pressed
+ _currPanDist.x += _centerPoint.x - _currCenterPoint.x;
+ _currPanDist.y += _centerPoint.y - _currCenterPoint.y;
+ _equalizePoints(_currCenterPoint, _centerPoint);
+
+ _panOffset.x = _calculatePanOffset('x', zoomLevel);
+ _panOffset.y = _calculatePanOffset('y', zoomLevel);
+
+ _isZoomingIn = zoomLevel > _currZoomLevel;
+ _currZoomLevel = zoomLevel;
+ _applyCurrentZoomPan();
+ } else {
+ // handle behaviour for one point (dragging or panning)
+
+ if (!_direction) {
+ return;
+ }
+
+ if (_isFirstMove) {
+ _isFirstMove = false;
+
+ // subtract drag distance that was used during the detection direction
+
+ if (Math.abs(delta.x) >= DIRECTION_CHECK_OFFSET) {
+ delta.x -= _currentPoints[0].x - _startPoint.x;
+ }
+
+ if (Math.abs(delta.y) >= DIRECTION_CHECK_OFFSET) {
+ delta.y -= _currentPoints[0].y - _startPoint.y;
+ }
+ }
+
+ _currPoint.x = p.x;
+ _currPoint.y = p.y;
+
+ // do nothing if pointers position hasn't changed
+ if (delta.x === 0 && delta.y === 0) {
+ return;
+ }
+
+ if (_direction === 'v' && _options.closeOnVerticalDrag) {
+ if (!_canPan()) {
+ _currPanDist.y += delta.y;
+ _panOffset.y += delta.y;
+
+ var opacityRatio = _calculateVerticalDragOpacityRatio();
+
+ _verticalDragInitiated = true;
+ _shout('onVerticalDrag', opacityRatio);
+
+ _applyBgOpacity(opacityRatio);
+ _applyCurrentZoomPan();
+ return;
+ }
+ }
+
+ _pushPosPoint(_getCurrentTime(), p.x, p.y);
+
+ _moved = true;
+ _currPanBounds = self.currItem.bounds;
+
+ var mainScrollChanged = _panOrMoveMainScroll('x', delta);
+ if (!mainScrollChanged) {
+ _panOrMoveMainScroll('y', delta);
+
+ _roundPoint(_panOffset);
+ _applyCurrentZoomPan();
+ }
+ }
+ },
+ // Pointerup/pointercancel/touchend/touchcancel/mouseup event handler
+ _onDragRelease = function (e) {
+ if (_features.isOldAndroid) {
+ if (_oldAndroidTouchEndTimeout && e.type === 'mouseup') {
+ return;
+ }
+
+ // on Android (v4.1, 4.2, 4.3 & possibly older)
+ // ghost mousedown/up event isn't preventable via e.preventDefault,
+ // which causes fake mousedown event
+ // so we block mousedown/up for 600ms
+ if (e.type.indexOf('touch') > -1) {
+ clearTimeout(_oldAndroidTouchEndTimeout);
+ _oldAndroidTouchEndTimeout = setTimeout(function () {
+ _oldAndroidTouchEndTimeout = 0;
+ }, 600);
+ }
+ }
+
+ _shout('pointerUp');
+
+ if (_preventDefaultEventBehaviour(e, false)) {
+ e.preventDefault();
+ }
+
+ var releasePoint;
+
+ if (_pointerEventEnabled) {
+ var pointerIndex = framework.arraySearch(
+ _currPointers,
+ e.pointerId,
+ 'id'
+ );
+
+ if (pointerIndex > -1) {
+ releasePoint = _currPointers.splice(pointerIndex, 1)[0];
+
+ if (navigator.msPointerEnabled) {
+ var MSPOINTER_TYPES = {
+ 4: 'mouse', // event.MSPOINTER_TYPE_MOUSE
+ 2: 'touch', // event.MSPOINTER_TYPE_TOUCH
+ 3: 'pen', // event.MSPOINTER_TYPE_PEN
+ };
+ releasePoint.type = MSPOINTER_TYPES[e.pointerType];
+
+ if (!releasePoint.type) {
+ releasePoint.type = e.pointerType || 'mouse';
+ }
+ } else {
+ releasePoint.type = e.pointerType || 'mouse';
+ }
+ }
+ }
+
+ var touchList = _getTouchPoints(e),
+ gestureType,
+ numPoints = touchList.length;
+
+ if (e.type === 'mouseup') {
+ numPoints = 0;
+ }
+
+ // Do nothing if there were 3 touch points or more
+ if (numPoints === 2) {
+ _currentPoints = null;
+ return true;
+ }
+
+ // if second pointer released
+ if (numPoints === 1) {
+ _equalizePoints(_startPoint, touchList[0]);
+ }
+
+ // pointer hasn't moved, send "tap release" point
+ if (numPoints === 0 && !_direction && !_mainScrollAnimating) {
+ if (!releasePoint) {
+ if (e.type === 'mouseup') {
+ releasePoint = { x: e.pageX, y: e.pageY, type: 'mouse' };
+ } else if (e.changedTouches && e.changedTouches[0]) {
+ releasePoint = {
+ x: e.changedTouches[0].pageX,
+ y: e.changedTouches[0].pageY,
+ type: 'touch',
+ };
+ }
+ }
+
+ _shout('touchRelease', e, releasePoint);
+ }
+
+ // Difference in time between releasing of two last touch points (zoom gesture)
+ var releaseTimeDiff = -1;
+
+ // Gesture completed, no pointers left
+ if (numPoints === 0) {
+ _isDragging = false;
+ framework.unbind(window, _upMoveEvents, self);
+
+ _stopDragUpdateLoop();
+
+ if (_isZooming) {
+ // Two points released at the same time
+ releaseTimeDiff = 0;
+ } else if (_lastReleaseTime !== -1) {
+ releaseTimeDiff = _getCurrentTime() - _lastReleaseTime;
+ }
+ }
+ _lastReleaseTime = numPoints === 1 ? _getCurrentTime() : -1;
+
+ if (releaseTimeDiff !== -1 && releaseTimeDiff < 150) {
+ gestureType = 'zoom';
+ } else {
+ gestureType = 'swipe';
+ }
+
+ if (_isZooming && numPoints < 2) {
+ _isZooming = false;
+
+ // Only second point released
+ if (numPoints === 1) {
+ gestureType = 'zoomPointerUp';
+ }
+ _shout('zoomGestureEnded');
+ }
+
+ _currentPoints = null;
+ if (
+ !_moved &&
+ !_zoomStarted &&
+ !_mainScrollAnimating &&
+ !_verticalDragInitiated
+ ) {
+ // nothing to animate
+ return;
+ }
+
+ _stopAllAnimations();
+
+ if (!_releaseAnimData) {
+ _releaseAnimData = _initDragReleaseAnimationData();
+ }
+
+ _releaseAnimData.calculateSwipeSpeed('x');
+
+ if (_verticalDragInitiated) {
+ var opacityRatio = _calculateVerticalDragOpacityRatio();
+
+ if (opacityRatio < _options.verticalDragRange) {
+ self.close();
+ } else {
+ var initalPanY = _panOffset.y,
+ initialBgOpacity = _bgOpacity;
+
+ _animateProp(
+ 'verticalDrag',
+ 0,
+ 1,
+ 300,
+ framework.easing.cubic.out,
+ function (now) {
+ _panOffset.y =
+ (self.currItem.initialPosition.y - initalPanY) *
+ now +
+ initalPanY;
+
+ _applyBgOpacity(
+ (1 - initialBgOpacity) * now + initialBgOpacity
+ );
+ _applyCurrentZoomPan();
+ }
+ );
+
+ _shout('onVerticalDrag', 1);
+ }
+
+ return;
+ }
+
+ // main scroll
+ if ((_mainScrollShifted || _mainScrollAnimating) && numPoints === 0) {
+ var itemChanged = _finishSwipeMainScrollGesture(
+ gestureType,
+ _releaseAnimData
+ );
+ if (itemChanged) {
+ return;
+ }
+ gestureType = 'zoomPointerUp';
+ }
+
+ // prevent zoom/pan animation when main scroll animation runs
+ if (_mainScrollAnimating) {
+ return;
+ }
+
+ // Complete simple zoom gesture (reset zoom level if it's out of the bounds)
+ if (gestureType !== 'swipe') {
+ _completeZoomGesture();
+ return;
+ }
+
+ // Complete pan gesture if main scroll is not shifted, and it's possible to pan current image
+ if (!_mainScrollShifted && _currZoomLevel > self.currItem.fitRatio) {
+ _completePanGesture(_releaseAnimData);
+ }
+ },
+ // Returns object with data about gesture
+ // It's created only once and then reused
+ _initDragReleaseAnimationData = function () {
+ // temp local vars
+ var lastFlickDuration, tempReleasePos;
+
+ // s = this
+ var s = {
+ lastFlickOffset: {},
+ lastFlickDist: {},
+ lastFlickSpeed: {},
+ slowDownRatio: {},
+ slowDownRatioReverse: {},
+ speedDecelerationRatio: {},
+ speedDecelerationRatioAbs: {},
+ distanceOffset: {},
+ backAnimDestination: {},
+ backAnimStarted: {},
+ calculateSwipeSpeed: function (axis) {
+ if (_posPoints.length > 1) {
+ lastFlickDuration =
+ _getCurrentTime() - _gestureCheckSpeedTime + 50;
+ tempReleasePos = _posPoints[_posPoints.length - 2][axis];
+ } else {
+ lastFlickDuration = _getCurrentTime() - _gestureStartTime; // total gesture duration
+ tempReleasePos = _startPoint[axis];
+ }
+ s.lastFlickOffset[axis] = _currPoint[axis] - tempReleasePos;
+ s.lastFlickDist[axis] = Math.abs(s.lastFlickOffset[axis]);
+ if (s.lastFlickDist[axis] > 20) {
+ s.lastFlickSpeed[axis] =
+ s.lastFlickOffset[axis] / lastFlickDuration;
+ } else {
+ s.lastFlickSpeed[axis] = 0;
+ }
+ if (Math.abs(s.lastFlickSpeed[axis]) < 0.1) {
+ s.lastFlickSpeed[axis] = 0;
+ }
+
+ s.slowDownRatio[axis] = 0.95;
+ s.slowDownRatioReverse[axis] = 1 - s.slowDownRatio[axis];
+ s.speedDecelerationRatio[axis] = 1;
+ },
+
+ calculateOverBoundsAnimOffset: function (axis, speed) {
+ if (!s.backAnimStarted[axis]) {
+ if (_panOffset[axis] > _currPanBounds.min[axis]) {
+ s.backAnimDestination[axis] = _currPanBounds.min[axis];
+ } else if (_panOffset[axis] < _currPanBounds.max[axis]) {
+ s.backAnimDestination[axis] = _currPanBounds.max[axis];
+ }
+
+ if (s.backAnimDestination[axis] !== undefined) {
+ s.slowDownRatio[axis] = 0.7;
+ s.slowDownRatioReverse[axis] =
+ 1 - s.slowDownRatio[axis];
+ if (s.speedDecelerationRatioAbs[axis] < 0.05) {
+ s.lastFlickSpeed[axis] = 0;
+ s.backAnimStarted[axis] = true;
+
+ _animateProp(
+ 'bounceZoomPan' + axis,
+ _panOffset[axis],
+ s.backAnimDestination[axis],
+ speed || 300,
+ framework.easing.sine.out,
+ function (pos) {
+ _panOffset[axis] = pos;
+ _applyCurrentZoomPan();
+ }
+ );
+ }
+ }
+ }
+ },
+
+ // Reduces the speed by slowDownRatio (per 10ms)
+ calculateAnimOffset: function (axis) {
+ if (!s.backAnimStarted[axis]) {
+ s.speedDecelerationRatio[axis] =
+ s.speedDecelerationRatio[axis] *
+ (s.slowDownRatio[axis] +
+ s.slowDownRatioReverse[axis] -
+ (s.slowDownRatioReverse[axis] * s.timeDiff) / 10);
+
+ s.speedDecelerationRatioAbs[axis] = Math.abs(
+ s.lastFlickSpeed[axis] * s.speedDecelerationRatio[axis]
+ );
+ s.distanceOffset[axis] =
+ s.lastFlickSpeed[axis] *
+ s.speedDecelerationRatio[axis] *
+ s.timeDiff;
+ _panOffset[axis] += s.distanceOffset[axis];
+ }
+ },
+
+ panAnimLoop: function () {
+ if (_animations.zoomPan) {
+ _animations.zoomPan.raf = _requestAF(s.panAnimLoop);
+
+ s.now = _getCurrentTime();
+ s.timeDiff = s.now - s.lastNow;
+ s.lastNow = s.now;
+
+ s.calculateAnimOffset('x');
+ s.calculateAnimOffset('y');
+
+ _applyCurrentZoomPan();
+
+ s.calculateOverBoundsAnimOffset('x');
+ s.calculateOverBoundsAnimOffset('y');
+
+ if (
+ s.speedDecelerationRatioAbs.x < 0.05 &&
+ s.speedDecelerationRatioAbs.y < 0.05
+ ) {
+ // round pan position
+ _panOffset.x = Math.round(_panOffset.x);
+ _panOffset.y = Math.round(_panOffset.y);
+ _applyCurrentZoomPan();
+
+ _stopAnimation('zoomPan');
+ return;
+ }
+ }
+ },
+ };
+ return s;
+ },
+ _completePanGesture = function (animData) {
+ // calculate swipe speed for Y axis (paanning)
+ animData.calculateSwipeSpeed('y');
+
+ _currPanBounds = self.currItem.bounds;
+
+ animData.backAnimDestination = {};
+ animData.backAnimStarted = {};
+
+ // Avoid acceleration animation if speed is too low
+ if (
+ Math.abs(animData.lastFlickSpeed.x) <= 0.05 &&
+ Math.abs(animData.lastFlickSpeed.y) <= 0.05
+ ) {
+ animData.speedDecelerationRatioAbs.x =
+ animData.speedDecelerationRatioAbs.y = 0;
+
+ // Run pan drag release animation. E.g. if you drag image and release finger without momentum.
+ animData.calculateOverBoundsAnimOffset('x');
+ animData.calculateOverBoundsAnimOffset('y');
+ return true;
+ }
+
+ // Animation loop that controls the acceleration after pan gesture ends
+ _registerStartAnimation('zoomPan');
+ animData.lastNow = _getCurrentTime();
+ animData.panAnimLoop();
+ },
+ _finishSwipeMainScrollGesture = function (gestureType, _releaseAnimData) {
+ var itemChanged;
+ if (!_mainScrollAnimating) {
+ _currZoomedItemIndex = _currentItemIndex;
+ }
+
+ var itemsDiff;
+
+ if (gestureType === 'swipe') {
+ var totalShiftDist = _currPoint.x - _startPoint.x,
+ isFastLastFlick = _releaseAnimData.lastFlickDist.x < 10;
+
+ // if container is shifted for more than MIN_SWIPE_DISTANCE,
+ // and last flick gesture was in right direction
+ if (
+ totalShiftDist > MIN_SWIPE_DISTANCE &&
+ (isFastLastFlick || _releaseAnimData.lastFlickOffset.x > 20)
+ ) {
+ // go to prev item
+ itemsDiff = -1;
+ } else if (
+ totalShiftDist < -MIN_SWIPE_DISTANCE &&
+ (isFastLastFlick || _releaseAnimData.lastFlickOffset.x < -20)
+ ) {
+ // go to next item
+ itemsDiff = 1;
+ }
+ }
+
+ var nextCircle;
+
+ if (itemsDiff) {
+ _currentItemIndex += itemsDiff;
+
+ if (_currentItemIndex < 0) {
+ _currentItemIndex = _options.loop ? _getNumItems() - 1 : 0;
+ nextCircle = true;
+ } else if (_currentItemIndex >= _getNumItems()) {
+ _currentItemIndex = _options.loop ? 0 : _getNumItems() - 1;
+ nextCircle = true;
+ }
+
+ if (!nextCircle || _options.loop) {
+ _indexDiff += itemsDiff;
+ _currPositionIndex -= itemsDiff;
+ itemChanged = true;
+ }
+ }
+
+ var animateToX = _slideSize.x * _currPositionIndex;
+ var animateToDist = Math.abs(animateToX - _mainScrollPos.x);
+ var finishAnimDuration;
+
+ if (
+ !itemChanged &&
+ animateToX > _mainScrollPos.x !==
+ _releaseAnimData.lastFlickSpeed.x > 0
+ ) {
+ // "return to current" duration, e.g. when dragging from slide 0 to -1
+ finishAnimDuration = 333;
+ } else {
+ finishAnimDuration =
+ Math.abs(_releaseAnimData.lastFlickSpeed.x) > 0
+ ? animateToDist /
+ Math.abs(_releaseAnimData.lastFlickSpeed.x)
+ : 333;
+
+ finishAnimDuration = Math.min(finishAnimDuration, 400);
+ finishAnimDuration = Math.max(finishAnimDuration, 250);
+ }
+
+ if (_currZoomedItemIndex === _currentItemIndex) {
+ itemChanged = false;
+ }
+
+ _mainScrollAnimating = true;
+
+ _shout('mainScrollAnimStart');
+
+ _animateProp(
+ 'mainScroll',
+ _mainScrollPos.x,
+ animateToX,
+ finishAnimDuration,
+ framework.easing.cubic.out,
+ _moveMainScroll,
+ function () {
+ _stopAllAnimations();
+ _mainScrollAnimating = false;
+ _currZoomedItemIndex = -1;
+
+ if (itemChanged || _currZoomedItemIndex !== _currentItemIndex) {
+ self.updateCurrItem();
+ }
+
+ _shout('mainScrollAnimComplete');
+ }
+ );
+
+ if (itemChanged) {
+ self.updateCurrItem(true);
+ }
+
+ return itemChanged;
+ },
+ _calculateZoomLevel = function (touchesDistance) {
+ return (1 / _startPointsDistance) * touchesDistance * _startZoomLevel;
+ },
+ // Resets zoom if it's out of bounds
+ _completeZoomGesture = function () {
+ var destZoomLevel = _currZoomLevel,
+ minZoomLevel = _getMinZoomLevel(),
+ maxZoomLevel = _getMaxZoomLevel();
+
+ if (_currZoomLevel < minZoomLevel) {
+ destZoomLevel = minZoomLevel;
+ } else if (_currZoomLevel > maxZoomLevel) {
+ destZoomLevel = maxZoomLevel;
+ }
+
+ var destOpacity = 1,
+ onUpdate,
+ initialOpacity = _bgOpacity;
+
+ if (
+ _opacityChanged &&
+ !_isZoomingIn &&
+ !_wasOverInitialZoom &&
+ _currZoomLevel < minZoomLevel
+ ) {
+ //_closedByScroll = true;
+ self.close();
+ return true;
+ }
+
+ if (_opacityChanged) {
+ onUpdate = function (now) {
+ _applyBgOpacity(
+ (destOpacity - initialOpacity) * now + initialOpacity
+ );
+ };
+ }
+
+ self.zoomTo(
+ destZoomLevel,
+ 0,
+ 200,
+ framework.easing.cubic.out,
+ onUpdate
+ );
+ return true;
+ };
+
+_registerModule('Gestures', {
+ publicMethods: {
+ initGestures: function () {
+ // helper function that builds touch/pointer/mouse events
+ var addEventNames = function (pref, down, move, up, cancel) {
+ _dragStartEvent = pref + down;
+ _dragMoveEvent = pref + move;
+ _dragEndEvent = pref + up;
+ if (cancel) {
+ _dragCancelEvent = pref + cancel;
+ } else {
+ _dragCancelEvent = '';
+ }
+ };
+
+ _pointerEventEnabled = _features.pointerEvent;
+ if (_pointerEventEnabled && _features.touch) {
+ // we don't need touch events, if browser supports pointer events
+ _features.touch = false;
+ }
+
+ if (_pointerEventEnabled) {
+ if (navigator.msPointerEnabled) {
+ // IE10 pointer events are case-sensitive
+ addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
+ } else {
+ addEventNames('pointer', 'down', 'move', 'up', 'cancel');
+ }
+ } else if (_features.touch) {
+ addEventNames('touch', 'start', 'move', 'end', 'cancel');
+ _likelyTouchDevice = true;
+ } else {
+ addEventNames('mouse', 'down', 'move', 'up');
+ }
+
+ _upMoveEvents =
+ _dragMoveEvent + ' ' + _dragEndEvent + ' ' + _dragCancelEvent;
+ _downEvents = _dragStartEvent;
+
+ if (_pointerEventEnabled && !_likelyTouchDevice) {
+ _likelyTouchDevice =
+ navigator.maxTouchPoints > 1 ||
+ navigator.msMaxTouchPoints > 1;
+ }
+ // make variable public
+ self.likelyTouchDevice = _likelyTouchDevice;
+
+ _globalEventHandlers[_dragStartEvent] = _onDragStart;
+ _globalEventHandlers[_dragMoveEvent] = _onDragMove;
+ _globalEventHandlers[_dragEndEvent] = _onDragRelease; // the Kraken
+
+ if (_dragCancelEvent) {
+ _globalEventHandlers[_dragCancelEvent] =
+ _globalEventHandlers[_dragEndEvent];
+ }
+
+ // Bind mouse events on device with detected hardware touch support, in case it supports multiple types of input.
+ if (_features.touch) {
+ _downEvents += ' mousedown';
+ _upMoveEvents += ' mousemove mouseup';
+ _globalEventHandlers.mousedown =
+ _globalEventHandlers[_dragStartEvent];
+ _globalEventHandlers.mousemove =
+ _globalEventHandlers[_dragMoveEvent];
+ _globalEventHandlers.mouseup =
+ _globalEventHandlers[_dragEndEvent];
+ }
+
+ if (!_likelyTouchDevice) {
+ // don't allow pan to next slide from zoomed state on Desktop
+ _options.allowPanToNext = false;
+ }
+ },
+ },
+});
diff --git a/apps/photos/thirdparty/photoswipe/src/js/history.js b/apps/photos/thirdparty/photoswipe/src/js/history.js
new file mode 100644
index 000000000..122533c5c
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/history.js
@@ -0,0 +1,260 @@
+/**
+ *
+ * history.js:
+ *
+ * - Back button to close gallery.
+ *
+ * - Unique URL for each slide: example.com/&pid=1&gid=3
+ * (where PID is picture index, and GID and gallery index)
+ *
+ * - Switch URL when slides change.
+ *
+ */
+
+var _historyDefaultOptions = {
+ history: true,
+ galleryUID: 1,
+};
+
+var _historyUpdateTimeout,
+ _hashChangeTimeout,
+ _hashAnimCheckTimeout,
+ _hashChangedByScript,
+ _hashChangedByHistory,
+ _hashReseted,
+ _initialHash,
+ _historyChanged,
+ _closedFromURL,
+ _urlChangedOnce,
+ _windowLoc,
+ _supportsPushState,
+ _getHash = function () {
+ return _windowLoc.hash.substring(1);
+ },
+ _cleanHistoryTimeouts = function () {
+ if (_historyUpdateTimeout) {
+ clearTimeout(_historyUpdateTimeout);
+ }
+
+ if (_hashAnimCheckTimeout) {
+ clearTimeout(_hashAnimCheckTimeout);
+ }
+ },
+ // pid - Picture index
+ // gid - Gallery index
+ _parseItemIndexFromURL = function () {
+ var hash = _getHash(),
+ params = {};
+
+ if (hash.length < 5) {
+ // pid=1
+ return params;
+ }
+
+ var i,
+ vars = hash.split('&');
+ for (i = 0; i < vars.length; i++) {
+ if (!vars[i]) {
+ continue;
+ }
+ var pair = vars[i].split('=');
+ if (pair.length < 2) {
+ continue;
+ }
+ params[pair[0]] = pair[1];
+ }
+ if (_options.galleryPIDs) {
+ // detect custom pid in hash and search for it among the items collection
+ var searchfor = params.pid;
+ params.pid = 0; // if custom pid cannot be found, fallback to the first item
+ for (i = 0; i < _items.length; i++) {
+ if (_items[i].pid === searchfor) {
+ params.pid = i;
+ break;
+ }
+ }
+ } else {
+ params.pid = parseInt(params.pid, 10) - 1;
+ }
+ if (params.pid < 0) {
+ params.pid = 0;
+ }
+ return params;
+ },
+ _updateHash = function () {
+ if (_hashAnimCheckTimeout) {
+ clearTimeout(_hashAnimCheckTimeout);
+ }
+
+ if (_numAnimations || _isDragging) {
+ // changing browser URL forces layout/paint in some browsers, which causes noticable lag during animation
+ // that's why we update hash only when no animations running
+ _hashAnimCheckTimeout = setTimeout(_updateHash, 500);
+ return;
+ }
+
+ if (_hashChangedByScript) {
+ clearTimeout(_hashChangeTimeout);
+ } else {
+ _hashChangedByScript = true;
+ }
+
+ var pid = _currentItemIndex + 1;
+ var item = _getItemAt(_currentItemIndex);
+ if (item.hasOwnProperty('pid')) {
+ // carry forward any custom pid assigned to the item
+ pid = item.pid;
+ }
+ var newHash =
+ _initialHash +
+ '&' +
+ 'gid=' +
+ _options.galleryUID +
+ '&' +
+ 'pid=' +
+ pid;
+
+ if (!_historyChanged) {
+ if (_windowLoc.hash.indexOf(newHash) === -1) {
+ _urlChangedOnce = true;
+ }
+ // first time - add new hisory record, then just replace
+ }
+
+ var newURL = _windowLoc.href.split('#')[0] + '#' + newHash;
+
+ if (_supportsPushState) {
+ if ('#' + newHash !== window.location.hash) {
+ history[_historyChanged ? 'replaceState' : 'pushState'](
+ '',
+ document.title,
+ newURL
+ );
+ }
+ } else {
+ if (_historyChanged) {
+ _windowLoc.replace(newURL);
+ } else {
+ _windowLoc.hash = newHash;
+ }
+ }
+
+ _historyChanged = true;
+ _hashChangeTimeout = setTimeout(function () {
+ _hashChangedByScript = false;
+ }, 60);
+ };
+
+_registerModule('History', {
+ publicMethods: {
+ initHistory: function () {
+ framework.extend(_options, _historyDefaultOptions, true);
+
+ if (!_options.history) {
+ return;
+ }
+
+ _windowLoc = window.location;
+ _urlChangedOnce = false;
+ _closedFromURL = false;
+ _historyChanged = false;
+ _initialHash = _getHash();
+ _supportsPushState = 'pushState' in history;
+
+ if (_initialHash.indexOf('gid=') > -1) {
+ _initialHash = _initialHash.split('&gid=')[0];
+ _initialHash = _initialHash.split('?gid=')[0];
+ }
+
+ _listen('afterChange', self.updateURL);
+ _listen('unbindEvents', function () {
+ framework.unbind(window, 'hashchange', self.onHashChange);
+ });
+
+ var returnToOriginal = function () {
+ _hashReseted = true;
+ if (!_closedFromURL) {
+ if (_urlChangedOnce) {
+ history.back();
+ } else {
+ if (_initialHash) {
+ _windowLoc.hash = _initialHash;
+ } else {
+ if (_supportsPushState) {
+ // remove hash from url without refreshing it or scrolling to top
+ history.pushState(
+ '',
+ document.title,
+ _windowLoc.pathname + _windowLoc.search
+ );
+ } else {
+ _windowLoc.hash = '';
+ }
+ }
+ }
+ }
+
+ _cleanHistoryTimeouts();
+ };
+
+ _listen('unbindEvents', function () {
+ if (_closedByScroll) {
+ // if PhotoSwipe is closed by scroll, we go "back" before the closing animation starts
+ // this is done to keep the scroll position
+ returnToOriginal();
+ }
+ });
+ _listen('destroy', function () {
+ if (!_hashReseted) {
+ returnToOriginal();
+ }
+ });
+ _listen('firstUpdate', function () {
+ _currentItemIndex = _parseItemIndexFromURL().pid;
+ });
+
+ var index = _initialHash.indexOf('pid=');
+ if (index > -1) {
+ _initialHash = _initialHash.substring(0, index);
+ if (_initialHash.slice(-1) === '&') {
+ _initialHash = _initialHash.slice(0, -1);
+ }
+ }
+
+ setTimeout(function () {
+ if (_isOpen) {
+ // hasn't destroyed yet
+ framework.bind(window, 'hashchange', self.onHashChange);
+ }
+ }, 40);
+ },
+ onHashChange: function () {
+ if (_getHash() === _initialHash) {
+ _closedFromURL = true;
+ self.close();
+ return;
+ }
+ if (!_hashChangedByScript) {
+ _hashChangedByHistory = true;
+ self.goTo(_parseItemIndexFromURL().pid);
+ _hashChangedByHistory = false;
+ }
+ },
+ updateURL: function () {
+ // Delay the update of URL, to avoid lag during transition,
+ // and to not to trigger actions like "refresh page sound" or "blinking favicon" to often
+
+ _cleanHistoryTimeouts();
+
+ if (_hashChangedByHistory) {
+ return;
+ }
+
+ if (!_historyChanged) {
+ _updateHash(); // first time
+ } else {
+ _historyUpdateTimeout = setTimeout(_updateHash, 800);
+ }
+ },
+ },
+});
diff --git a/apps/photos/thirdparty/photoswipe/src/js/items-controller.js b/apps/photos/thirdparty/photoswipe/src/js/items-controller.js
new file mode 100644
index 000000000..5fec7aec2
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/items-controller.js
@@ -0,0 +1,534 @@
+/**
+ *
+ * Controller manages gallery items, their dimensions, and their content.
+ *
+ */
+
+var _items,
+ _tempPanAreaSize = {},
+ _imagesToAppendPool = [],
+ _initialContentSet,
+ _initialZoomRunning,
+ _controllerDefaultOptions = {
+ index: 0,
+ errorMsg:
+ '',
+ forceProgressiveLoading: false, // TODO
+ preload: [1, 1],
+ getNumItemsFn: function () {
+ return _items.length;
+ },
+ };
+
+var _getItemAt,
+ _getNumItems,
+ _initialIsLoop,
+ _getZeroBounds = function () {
+ return {
+ center: { x: 0, y: 0 },
+ max: { x: 0, y: 0 },
+ min: { x: 0, y: 0 },
+ };
+ },
+ _calculateSingleItemPanBounds = function (
+ item,
+ realPanElementW,
+ realPanElementH
+ ) {
+ var bounds = item.bounds;
+
+ // position of element when it's centered
+ bounds.center.x = Math.round(
+ (_tempPanAreaSize.x - realPanElementW) / 2
+ );
+ bounds.center.y =
+ Math.round((_tempPanAreaSize.y - realPanElementH) / 2) +
+ item.vGap.top;
+
+ // maximum pan position
+ bounds.max.x =
+ realPanElementW > _tempPanAreaSize.x
+ ? Math.round(_tempPanAreaSize.x - realPanElementW)
+ : bounds.center.x;
+
+ bounds.max.y =
+ realPanElementH > _tempPanAreaSize.y
+ ? Math.round(_tempPanAreaSize.y - realPanElementH) +
+ item.vGap.top
+ : bounds.center.y;
+
+ // minimum pan position
+ bounds.min.x =
+ realPanElementW > _tempPanAreaSize.x ? 0 : bounds.center.x;
+ bounds.min.y =
+ realPanElementH > _tempPanAreaSize.y
+ ? item.vGap.top
+ : bounds.center.y;
+ },
+ _calculateItemSize = function (item, viewportSize, zoomLevel) {
+ if (item.src && !item.loadError) {
+ var isInitial = !zoomLevel;
+
+ if (isInitial) {
+ if (!item.vGap) {
+ item.vGap = { top: 0, bottom: 0 };
+ }
+ // allows overriding vertical margin for individual items
+ _shout('parseVerticalMargin', item);
+ }
+
+ _tempPanAreaSize.x = viewportSize.x;
+ _tempPanAreaSize.y =
+ viewportSize.y - item.vGap.top - item.vGap.bottom;
+
+ if (isInitial) {
+ var hRatio = _tempPanAreaSize.x / item.w;
+ var vRatio = _tempPanAreaSize.y / item.h;
+
+ item.fitRatio = hRatio < vRatio ? hRatio : vRatio;
+ //item.fillRatio = hRatio > vRatio ? hRatio : vRatio;
+
+ var scaleMode = _options.scaleMode;
+
+ if (scaleMode === 'orig') {
+ zoomLevel = 1;
+ } else if (scaleMode === 'fit') {
+ zoomLevel = item.fitRatio;
+ }
+
+ if (zoomLevel > 1) {
+ zoomLevel = 1;
+ }
+
+ item.initialZoomLevel = zoomLevel;
+
+ if (!item.bounds) {
+ // reuse bounds object
+ item.bounds = _getZeroBounds();
+ }
+ }
+
+ if (!zoomLevel) {
+ return;
+ }
+
+ _calculateSingleItemPanBounds(
+ item,
+ item.w * zoomLevel,
+ item.h * zoomLevel
+ );
+
+ if (isInitial && zoomLevel === item.initialZoomLevel) {
+ item.initialPosition = item.bounds.center;
+ }
+
+ return item.bounds;
+ } else {
+ item.w = item.h = 0;
+ item.initialZoomLevel = item.fitRatio = 1;
+ item.bounds = _getZeroBounds();
+ item.initialPosition = item.bounds.center;
+
+ // if it's not image, we return zero bounds (content is not zoomable)
+ return item.bounds;
+ }
+ },
+ _appendImage = function (
+ index,
+ item,
+ baseDiv,
+ img,
+ preventAnimation,
+ keepPlaceholder
+ ) {
+ if (item.loadError) {
+ return;
+ }
+
+ if (img) {
+ item.imageAppended = true;
+ _setImageSize(
+ item,
+ img,
+ item === self.currItem && _renderMaxResolution
+ );
+
+ baseDiv.appendChild(img);
+
+ if (keepPlaceholder) {
+ setTimeout(function () {
+ if (item && item.loaded && item.placeholder) {
+ item.placeholder.style.display = 'none';
+ item.placeholder = null;
+ }
+ }, 500);
+ }
+ }
+ },
+ _preloadImage = function (item) {
+ item.loading = true;
+ item.loaded = false;
+ var img = (item.img = framework.createEl('pswp__img', 'img'));
+ img.oncontextmenu=(e)=>e.preventDefault();
+ var onComplete = function () {
+ item.loading = false;
+ item.loaded = true;
+
+ if (item.loadComplete) {
+ item.loadComplete(item);
+ } else {
+ item.img = null; // no need to store image object
+ }
+ img.onload = img.onerror = null;
+ img = null;
+ };
+ img.onload = onComplete;
+ img.onerror = function () {
+ item.loadError = true;
+ onComplete();
+ };
+
+ img.src = item.src; // + '?a=' + Math.random();
+
+ return img;
+ },
+ _checkForError = function (item, cleanUp) {
+ if (item.src && item.loadError && item.container) {
+ if (cleanUp) {
+ item.container.innerHTML = '';
+ }
+
+ item.container.innerHTML = _options.errorMsg.replace(
+ '%url%',
+ item.src
+ );
+ return true;
+ }
+ },
+ _setImageSize = function (item, img, maxRes) {
+ if (!item.src || !item.container) {
+ return;
+ }
+
+ if (!img) {
+ img = item.container.lastChild;
+ }
+
+ var w = maxRes ? item.w : Math.round(item.w * item.fitRatio),
+ h = maxRes ? item.h : Math.round(item.h * item.fitRatio);
+
+ if (item.placeholder && !item.loaded) {
+ item.placeholder.style.width = w + 'px';
+ item.placeholder.style.height = h + 'px';
+ }
+
+ img.style.width = w + 'px';
+ img.style.height = h + 'px';
+ },
+ _appendImagesPool = function () {
+ if (_imagesToAppendPool.length) {
+ var poolItem;
+
+ for (var i = 0; i < _imagesToAppendPool.length; i++) {
+ poolItem = _imagesToAppendPool[i];
+ if (poolItem.holder.index === poolItem.index) {
+ _appendImage(
+ poolItem.index,
+ poolItem.item,
+ poolItem.baseDiv,
+ poolItem.img,
+ false,
+ poolItem.clearPlaceholder
+ );
+ }
+ }
+ _imagesToAppendPool = [];
+ }
+ };
+
+_registerModule('Controller', {
+ publicMethods: {
+ lazyLoadItem: function (index) {
+ index = _getLoopedId(index);
+ var item = _getItemAt(index);
+ if (!item || ((item.loaded || item.loading) && !_itemsNeedUpdate)) {
+ return;
+ }
+
+ _shout('gettingData', index, item);
+
+ if (!item.src) {
+ return;
+ }
+
+ _preloadImage(item);
+ },
+ initController: function () {
+ framework.extend(_options, _controllerDefaultOptions, true);
+ self.items = _items = items;
+ _getItemAt = self.getItemAt;
+ _getNumItems = _options.getNumItemsFn; //self.getNumItems;
+
+ _initialIsLoop = _options.loop;
+ if (_getNumItems() < 3) {
+ _options.loop = false; // disable loop if less then 3 items
+ }
+
+ _listen('beforeChange', function (diff) {
+ self.lazyLoadItem(_currentItemIndex);
+ });
+
+ _listen('initialLayout', function () {
+ self.currItem.initialLayout =
+ _options.getThumbBoundsFn &&
+ _options.getThumbBoundsFn(_currentItemIndex);
+ });
+
+ _listen('mainScrollAnimComplete', _appendImagesPool);
+ _listen('initialZoomInEnd', _appendImagesPool);
+
+ _listen('destroy', function () {
+ var item;
+ for (var i = 0; i < _items.length; i++) {
+ item = _items[i];
+ // remove reference to DOM elements, for GC
+ if (item.container) {
+ item.container = null;
+ }
+ if (item.placeholder) {
+ item.placeholder = null;
+ }
+ if (item.img) {
+ item.img = null;
+ }
+ if (item.preloader) {
+ item.preloader = null;
+ }
+ if (item.loadError) {
+ item.loaded = item.loadError = false;
+ }
+ }
+ _imagesToAppendPool = null;
+ });
+ },
+
+ getItemAt: function (index) {
+ if (index >= 0) {
+ return _items[index] !== undefined ? _items[index] : false;
+ }
+ return false;
+ },
+
+ allowProgressiveImg: function () {
+ // 1. Progressive image loading isn't working on webkit/blink
+ // when hw-acceleration (e.g. translateZ) is applied to IMG element.
+ // That's why in PhotoSwipe parent element gets zoom transform, not image itself.
+ //
+ // 2. Progressive image loading sometimes blinks in webkit/blink when applying animation to parent element.
+ // That's why it's disabled on touch devices (mainly because of swipe transition)
+ //
+ // 3. Progressive image loading sometimes doesn't work in IE (up to 11).
+
+ // Don't allow progressive loading on non-large touch devices
+ return (
+ _options.forceProgressiveLoading ||
+ !_likelyTouchDevice ||
+ _options.mouseUsed ||
+ screen.width > 1200
+ );
+ // 1200 - to eliminate touch devices with large screen (like Chromebook Pixel)
+ },
+
+ setContent: function (holder, index) {
+ if (_options.loop) {
+ index = _getLoopedId(index);
+ }
+
+ var prevItem = self.getItemAt(holder.index);
+ if (prevItem) {
+ prevItem.container = null;
+ }
+
+ var item = self.getItemAt(index),
+ img;
+
+ if (!item) {
+ holder.el.innerHTML = '';
+ return;
+ }
+
+ // allow to override data
+ if (index === _currentItemIndex) {
+ _shout('gettingData', index, item);
+ }
+
+ holder.index = index;
+ holder.item = item;
+
+ // base container DIV is created only once for each of 3 holders
+ var baseDiv = (item.container =
+ framework.createEl('pswp__zoom-wrap'));
+
+ if (!item.src && item.html) {
+ if (item.html.tagName) {
+ baseDiv.appendChild(item.html);
+ } else {
+ baseDiv.innerHTML = item.html;
+ }
+ }
+
+ _checkForError(item);
+
+ _calculateItemSize(item, _viewportSize);
+
+ if (item.src && !item.loadError && !item.loaded) {
+ item.loadComplete = function (item) {
+ // gallery closed before image finished loading
+ if (!_isOpen) {
+ return;
+ }
+
+ // check if holder hasn't changed while image was loading
+ if (holder && holder.index === index) {
+ if (_checkForError(item, true)) {
+ item.loadComplete = item.img = null;
+ _calculateItemSize(item, _viewportSize);
+ _applyZoomPanToItem(item);
+
+ if (holder.index === _currentItemIndex) {
+ // recalculate dimensions
+ self.updateCurrZoomItem();
+ }
+ return;
+ }
+ if (!item.imageAppended) {
+ if (
+ _features.transform &&
+ (_mainScrollAnimating || _initialZoomRunning)
+ ) {
+ _imagesToAppendPool.push({
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder,
+ clearPlaceholder: true,
+ });
+ } else {
+ _appendImage(
+ index,
+ item,
+ baseDiv,
+ item.img,
+ _mainScrollAnimating || _initialZoomRunning,
+ true
+ );
+ }
+ } else {
+ // remove preloader & mini-img
+ if (!_initialZoomRunning && item.placeholder) {
+ item.placeholder.style.display = 'none';
+ item.placeholder = null;
+ }
+ }
+ }
+
+ item.loadComplete = null;
+ item.img = null; // no need to store image element after it's added
+
+ _shout('imageLoadComplete', index, item);
+ };
+
+ if (framework.features.transform) {
+ var placeholderClassName =
+ 'pswp__img pswp__img--placeholder';
+ placeholderClassName += item.msrc
+ ? ''
+ : ' pswp__img--placeholder--blank';
+
+ var placeholder = framework.createEl(
+ placeholderClassName,
+ item.msrc ? 'img' : ''
+ );
+ placeholder.oncontextmenu=(e)=>e.preventDefault();
+ if (item.msrc) {
+ placeholder.src = item.msrc;
+ }
+
+ _setImageSize(item, placeholder);
+
+ baseDiv.appendChild(placeholder);
+ item.placeholder = placeholder;
+ }
+
+ if (self.allowProgressiveImg()) {
+ // just append image
+ if (!_initialContentSet && _features.transform) {
+ _imagesToAppendPool.push({
+ item: item,
+ baseDiv: baseDiv,
+ img: item.img,
+ index: index,
+ holder: holder,
+ });
+ } else {
+ _appendImage(
+ index,
+ item,
+ baseDiv,
+ item.img,
+ true,
+ true
+ );
+ }
+ }
+ } else if (item.src && !item.loadError) {
+ // image object is created every time, due to bugs of image loading & delay when switching images
+ img = framework.createEl('pswp__img', 'img');
+ img.style.opacity = 1;
+ img.src = item.src;
+ img.oncontextmenu=(e)=>e.preventDefault();
+ _setImageSize(item, img);
+ _appendImage(index, item, baseDiv, img, true);
+ }
+
+ if (!_initialContentSet && index === _currentItemIndex) {
+ _currZoomElementStyle = baseDiv.style;
+ if (!item.initialPosition) {
+ item.initialPosition = { x: 48, y: 44 };
+ item.bounds = {
+ center: {
+ x: 48,
+ y: 44,
+ },
+ max: {
+ x: 48,
+ y: 44,
+ },
+ min: {
+ x: 48,
+ y: 44,
+ },
+ };
+ item.h = window.innerHeight;
+ item.w = window.innerWidth;
+ item.fitRatio = 0.9067796610169492;
+ item.initialZoomLevel = 0.9067796610169492;
+ }
+ _showOrHide(item, img || item.img);
+ } else {
+ _applyZoomPanToItem(item);
+ }
+
+ holder.el.innerHTML = '';
+ holder.el.appendChild(baseDiv);
+ },
+
+ cleanSlide: function (item) {
+ if (item.img) {
+ item.img.onload = item.img.onerror = null;
+ }
+ item.loaded = item.loading = item.img = item.imageAppended = false;
+ },
+ },
+});
diff --git a/apps/photos/thirdparty/photoswipe/src/js/show-hide-transition.js b/apps/photos/thirdparty/photoswipe/src/js/show-hide-transition.js
new file mode 100644
index 000000000..a046612b1
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/show-hide-transition.js
@@ -0,0 +1,211 @@
+/**
+ * show-hide-transition.js:
+ *
+ * Manages initial opening or closing transition.
+ *
+ * If you're not planning to use transition for gallery at all,
+ * you may set options hideAnimationDuration and showAnimationDuration to 0,
+ * and just delete startAnimation function.
+ *
+ */
+
+var _showOrHideTimeout,
+ _showOrHide = function (item, img, out, completeFn) {
+ if (_showOrHideTimeout) {
+ clearTimeout(_showOrHideTimeout);
+ }
+
+ _initialZoomRunning = true;
+ _initialContentSet = true;
+
+ // dimensions of small thumbnail {x:,y:,w:}.
+ // Height is optional, as calculated based on large image.
+ var thumbBounds;
+ if (item.initialLayout) {
+ thumbBounds = item.initialLayout;
+ item.initialLayout = null;
+ } else {
+ thumbBounds =
+ _options.getThumbBoundsFn &&
+ _options.getThumbBoundsFn(_currentItemIndex);
+ }
+
+ var duration = out
+ ? _options.hideAnimationDuration
+ : _options.showAnimationDuration;
+
+ var onComplete = function () {
+ _stopAnimation('initialZoom');
+ if (!out) {
+ _applyBgOpacity(1);
+ if (img) {
+ img.style.display = 'block';
+ }
+ framework.addClass(template, 'pswp--animated-in');
+ _shout('initialZoom' + (out ? 'OutEnd' : 'InEnd'));
+ } else {
+ self.template.removeAttribute('style');
+ self.bg.removeAttribute('style');
+ }
+
+ if (completeFn) {
+ completeFn();
+ }
+ _initialZoomRunning = false;
+ };
+
+ // if bounds aren't provided, just open gallery without animation
+ if (!duration || !thumbBounds || thumbBounds.x === undefined) {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
+
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
+
+ template.style.opacity = out ? 0 : 1;
+ _applyBgOpacity(1);
+
+ if (duration) {
+ setTimeout(function () {
+ onComplete();
+ }, duration);
+ } else {
+ onComplete();
+ }
+
+ return;
+ }
+
+ var startAnimation = function () {
+ var closeWithRaf = _closedByScroll,
+ fadeEverything =
+ !self.currItem.src ||
+ self.currItem.loadError ||
+ _options.showHideOpacity;
+
+ // apply hw-acceleration to image
+ if (item.miniImg) {
+ item.miniImg.style.webkitBackfaceVisibility = 'hidden';
+ }
+
+ if (!out) {
+ _currZoomLevel = thumbBounds.w / item.w;
+ _panOffset.x = thumbBounds.x;
+ _panOffset.y = thumbBounds.y - _initalWindowScrollY;
+
+ self[fadeEverything ? 'template' : 'bg'].style.opacity = 0.001;
+ _applyCurrentZoomPan();
+ }
+
+ _registerStartAnimation('initialZoom');
+
+ if (out && !closeWithRaf) {
+ framework.removeClass(template, 'pswp--animated-in');
+ }
+
+ if (fadeEverything) {
+ if (out) {
+ framework[(closeWithRaf ? 'remove' : 'add') + 'Class'](
+ template,
+ 'pswp--animate_opacity'
+ );
+ } else {
+ setTimeout(function () {
+ framework.addClass(template, 'pswp--animate_opacity');
+ }, 30);
+ }
+ }
+
+ _showOrHideTimeout = setTimeout(
+ function () {
+ _shout('initialZoom' + (out ? 'Out' : 'In'));
+
+ if (!out) {
+ // "in" animation always uses CSS transitions (instead of rAF).
+ // CSS transition work faster here,
+ // as developer may also want to animate other things,
+ // like ui on top of sliding area, which can be animated just via CSS
+
+ _currZoomLevel = item.initialZoomLevel;
+ _equalizePoints(_panOffset, item.initialPosition);
+ _applyCurrentZoomPan();
+ _applyBgOpacity(1);
+
+ if (fadeEverything) {
+ template.style.opacity = 1;
+ } else {
+ _applyBgOpacity(1);
+ }
+
+ _showOrHideTimeout = setTimeout(
+ onComplete,
+ duration + 20
+ );
+ } else {
+ // "out" animation uses rAF only when PhotoSwipe is closed by browser scroll, to recalculate position
+ var destZoomLevel = thumbBounds.w / item.w,
+ initialPanOffset = {
+ x: _panOffset.x,
+ y: _panOffset.y,
+ },
+ initialZoomLevel = _currZoomLevel,
+ initalBgOpacity = _bgOpacity,
+ onUpdate = function (now) {
+ if (now === 1) {
+ _currZoomLevel = destZoomLevel;
+ _panOffset.x = thumbBounds.x;
+ _panOffset.y =
+ thumbBounds.y - _currentWindowScrollY;
+ } else {
+ _currZoomLevel =
+ (destZoomLevel - initialZoomLevel) *
+ now +
+ initialZoomLevel;
+ _panOffset.x =
+ (thumbBounds.x - initialPanOffset.x) *
+ now +
+ initialPanOffset.x;
+ _panOffset.y =
+ (thumbBounds.y -
+ _currentWindowScrollY -
+ initialPanOffset.y) *
+ now +
+ initialPanOffset.y;
+ }
+
+ _applyCurrentZoomPan();
+ if (fadeEverything) {
+ template.style.opacity = 1 - now;
+ } else {
+ _applyBgOpacity(
+ initalBgOpacity - now * initalBgOpacity
+ );
+ }
+ };
+
+ if (closeWithRaf) {
+ _animateProp(
+ 'initialZoom',
+ 0,
+ 1,
+ duration,
+ framework.easing.cubic.out,
+ onUpdate,
+ onComplete
+ );
+ } else {
+ onUpdate(1);
+ _showOrHideTimeout = setTimeout(
+ onComplete,
+ duration + 20
+ );
+ }
+ }
+ },
+ out ? 25 : 90
+ ); // Main purpose of this delay is to give browser time to paint and
+ // create composite layers of PhotoSwipe UI parts (background, controls, caption, arrows).
+ // Which avoids lag at the beginning of scale transition.
+ };
+ startAnimation();
+ };
diff --git a/apps/photos/thirdparty/photoswipe/src/js/tap.js b/apps/photos/thirdparty/photoswipe/src/js/tap.js
new file mode 100644
index 000000000..55aab5ffb
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/tap.js
@@ -0,0 +1,81 @@
+/**
+ * tap.js:
+ *
+ * Displatches tap and double-tap events.
+ *
+ */
+
+var tapTimer,
+ tapReleasePoint = {},
+ _dispatchTapEvent = function (origEvent, releasePoint, pointerType) {
+ var e = document.createEvent('CustomEvent'),
+ eDetail = {
+ origEvent: origEvent,
+ target: origEvent.target,
+ releasePoint: releasePoint,
+ pointerType: pointerType || 'touch',
+ };
+
+ e.initCustomEvent('pswpTap', true, true, eDetail);
+ origEvent.target.dispatchEvent(e);
+ };
+
+_registerModule('Tap', {
+ publicMethods: {
+ initTap: function () {
+ _listen('firstTouchStart', self.onTapStart);
+ _listen('touchRelease', self.onTapRelease);
+ _listen('destroy', function () {
+ tapReleasePoint = {};
+ tapTimer = null;
+ });
+ },
+ onTapStart: function (touchList) {
+ if (touchList.length > 1) {
+ clearTimeout(tapTimer);
+ tapTimer = null;
+ }
+ },
+ onTapRelease: function (e, releasePoint) {
+ if (!releasePoint) {
+ return;
+ }
+
+ if (!_moved && !_isMultitouch && !_numAnimations) {
+ var p0 = releasePoint;
+ if (tapTimer) {
+ clearTimeout(tapTimer);
+ tapTimer = null;
+
+ // Check if taped on the same place
+ if (_isNearbyPoints(p0, tapReleasePoint)) {
+ _shout('doubleTap', p0);
+ return;
+ }
+ }
+
+ if (releasePoint.type === 'mouse') {
+ _dispatchTapEvent(e, releasePoint, 'mouse');
+ return;
+ }
+
+ var clickedTagName = e.target.tagName.toUpperCase();
+ // avoid double tap delay on buttons and elements that have class pswp__single-tap
+ if (
+ clickedTagName === 'BUTTON' ||
+ framework.hasClass(e.target, 'pswp__single-tap')
+ ) {
+ _dispatchTapEvent(e, releasePoint);
+ return;
+ }
+
+ _equalizePoints(tapReleasePoint, p0);
+
+ tapTimer = setTimeout(function () {
+ _dispatchTapEvent(e, releasePoint);
+ tapTimer = null;
+ }, 300);
+ }
+ },
+ },
+});
diff --git a/apps/photos/thirdparty/photoswipe/src/js/ui/photoswipe-ui-default.js b/apps/photos/thirdparty/photoswipe/src/js/ui/photoswipe-ui-default.js
new file mode 100644
index 000000000..ad6b51c7a
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/src/js/ui/photoswipe-ui-default.js
@@ -0,0 +1,949 @@
+/**
+ *
+ * UI on top of main sliding area (caption, arrows, close button, etc.).
+ * Built just using public methods/properties of PhotoSwipe.
+ *
+ */
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else if (typeof exports === 'object') {
+ module.exports = factory();
+ } else {
+ root.PhotoSwipeUI_Default = factory();
+ }
+})(this, function () {
+ 'use strict';
+
+ var PhotoSwipeUI_Default = function (pswp, framework) {
+ var ui = this;
+ var _overlayUIUpdated = false,
+ _controlsVisible = true,
+ _fullscrenAPI,
+ _controls,
+ _captionContainer,
+ _fakeCaptionContainer,
+ _indexIndicator,
+ _shareButton,
+ _shareModal,
+ _shareModalHidden = true,
+ _initalCloseOnScrollValue,
+ _isIdle,
+ _listen,
+ _loadingIndicator,
+ _loadingIndicatorHidden,
+ _loadingIndicatorTimeout,
+ _galleryHasOneSlide,
+ _options,
+ _defaultUIOptions = {
+ barsSize: { top: 44, bottom: 'auto' },
+ closeElClasses: [
+ 'item',
+ 'caption',
+ 'zoom-wrap',
+ 'ui',
+ 'top-bar',
+ ],
+ timeToIdle: 4000,
+ timeToIdleOutside: 1000,
+ loadingIndicatorDelay: 1000, // 2s
+
+ addCaptionHTMLFn: function (item, captionEl /*, isFake */) {
+ if (!item.title) {
+ captionEl.children[0].innerHTML = '';
+ return false;
+ }
+ captionEl.children[0].innerHTML = item.title;
+ return true;
+ },
+
+ closeEl: true,
+ captionEl: true,
+ fullscreenEl: true,
+ zoomEl: true,
+ shareEl: true,
+ counterEl: true,
+ arrowEl: true,
+ preloaderEl: true,
+
+ tapToClose: false,
+ tapToToggleControls: true,
+
+ clickToCloseNonZoomable: true,
+
+ shareButtons: [
+ {
+ id: 'facebook',
+ label: 'Share on Facebook',
+ url: 'https://www.facebook.com/sharer/sharer.php?u={{url}}',
+ },
+ {
+ id: 'twitter',
+ label: 'Tweet',
+ url: 'https://twitter.com/intent/tweet?text={{text}}&url={{url}}',
+ },
+ {
+ id: 'pinterest',
+ label: 'Pin it',
+ url:
+ 'http://www.pinterest.com/pin/create/button/' +
+ '?url={{url}}&media={{image_url}}&description={{text}}',
+ },
+ {
+ id: 'download',
+ label: 'Download image',
+ url: '{{raw_image_url}}',
+ download: true,
+ },
+ ],
+ getImageURLForShare: function (/* shareButtonData */) {
+ return pswp.currItem.src || '';
+ },
+ getPageURLForShare: function (/* shareButtonData */) {
+ return window.location.href;
+ },
+ getTextForShare: function (/* shareButtonData */) {
+ return pswp.currItem.title || '';
+ },
+
+ indexIndicatorSep: ' / ',
+ fitControlsWidth: 1200,
+ },
+ _blockControlsTap,
+ _blockControlsTapTimeout;
+
+ var _onControlsTap = function (e) {
+ if (_blockControlsTap) {
+ return true;
+ }
+
+ e = e || window.event;
+
+ if (_options.timeToIdle && _options.mouseUsed && !_isIdle) {
+ // reset idle timer
+ _onIdleMouseMove();
+ }
+
+ var target = e.target || e.srcElement,
+ uiElement,
+ clickedClass = target.getAttribute('class') || '',
+ found;
+
+ for (var i = 0; i < _uiElements.length; i++) {
+ uiElement = _uiElements[i];
+ if (
+ uiElement.onTap &&
+ clickedClass.indexOf('pswp__' + uiElement.name) > -1
+ ) {
+ uiElement.onTap();
+ found = true;
+ }
+ }
+
+ if (found) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+ _blockControlsTap = true;
+
+ // Some versions of Android don't prevent ghost click event
+ // when preventDefault() was called on touchstart and/or touchend.
+ //
+ // This happens on v4.3, 4.2, 4.1,
+ // older versions strangely work correctly,
+ // but just in case we add delay on all of them)
+ var tapDelay = framework.features.isOldAndroid ? 600 : 30;
+ _blockControlsTapTimeout = setTimeout(function () {
+ _blockControlsTap = false;
+ }, tapDelay);
+ }
+ },
+ _fitControlsInViewport = function () {
+ return (
+ !pswp.likelyTouchDevice ||
+ _options.mouseUsed ||
+ screen.width > _options.fitControlsWidth
+ );
+ },
+ _togglePswpClass = function (el, cName, add) {
+ framework[(add ? 'add' : 'remove') + 'Class'](
+ el,
+ 'pswp__' + cName
+ );
+ },
+ // add class when there is just one item in the gallery
+ // (by default it hides left/right arrows and 1ofX counter)
+ _countNumItems = function () {
+ var hasOneSlide = _options.getNumItemsFn() === 1;
+
+ if (hasOneSlide !== _galleryHasOneSlide) {
+ _togglePswpClass(_controls, 'ui--one-slide', hasOneSlide);
+ _galleryHasOneSlide = hasOneSlide;
+ }
+ },
+ _toggleShareModalClass = function () {
+ _togglePswpClass(
+ _shareModal,
+ 'share-modal--hidden',
+ _shareModalHidden
+ );
+ },
+ _toggleShareModal = function () {
+ _shareModalHidden = !_shareModalHidden;
+
+ if (!_shareModalHidden) {
+ _toggleShareModalClass();
+ setTimeout(function () {
+ if (!_shareModalHidden) {
+ framework.addClass(
+ _shareModal,
+ 'pswp__share-modal--fade-in'
+ );
+ }
+ }, 30);
+ } else {
+ framework.removeClass(
+ _shareModal,
+ 'pswp__share-modal--fade-in'
+ );
+ setTimeout(function () {
+ if (_shareModalHidden) {
+ _toggleShareModalClass();
+ }
+ }, 300);
+ }
+
+ if (!_shareModalHidden) {
+ _updateShareURLs();
+ }
+ return false;
+ },
+ _openWindowPopup = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ pswp.shout('shareLinkClick', e, target);
+
+ if (!target.href) {
+ return false;
+ }
+
+ if (target.hasAttribute('download')) {
+ return true;
+ }
+
+ window.open(
+ target.href,
+ 'pswp_share',
+ 'scrollbars=yes,resizable=yes,toolbar=no,' +
+ 'location=yes,width=550,height=420,top=100,left=' +
+ (window.screen
+ ? Math.round(screen.width / 2 - 275)
+ : 100)
+ );
+
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ return false;
+ },
+ _updateShareURLs = function () {
+ var shareButtonOut = '',
+ shareButtonData,
+ shareURL,
+ image_url,
+ page_url,
+ share_text;
+
+ for (var i = 0; i < _options.shareButtons.length; i++) {
+ shareButtonData = _options.shareButtons[i];
+
+ image_url = _options.getImageURLForShare(shareButtonData);
+ page_url = _options.getPageURLForShare(shareButtonData);
+ share_text = _options.getTextForShare(shareButtonData);
+
+ shareURL = shareButtonData.url
+ .replace('{{url}}', encodeURIComponent(page_url))
+ .replace('{{image_url}}', encodeURIComponent(image_url))
+ .replace('{{raw_image_url}}', image_url)
+ .replace('{{text}}', encodeURIComponent(share_text));
+
+ shareButtonOut +=
+ '' +
+ shareButtonData.label +
+ ' ';
+
+ if (_options.parseShareButtonOut) {
+ shareButtonOut = _options.parseShareButtonOut(
+ shareButtonData,
+ shareButtonOut
+ );
+ }
+ }
+ _shareModal.children[0].innerHTML = shareButtonOut;
+ _shareModal.children[0].onclick = _openWindowPopup;
+ },
+ _hasCloseClass = function (target) {
+ for (var i = 0; i < _options.closeElClasses.length; i++) {
+ if (
+ framework.hasClass(
+ target,
+ 'pswp__' + _options.closeElClasses[i]
+ )
+ ) {
+ return true;
+ }
+ }
+ },
+ _idleInterval,
+ _idleTimer,
+ _idleIncrement = 0,
+ _onIdleMouseMove = function () {
+ clearTimeout(_idleTimer);
+ _idleIncrement = 0;
+ if (_isIdle) {
+ ui.setIdle(false);
+ }
+ },
+ _onMouseLeaveWindow = function (e) {
+ e = e ? e : window.event;
+ var from = e.relatedTarget || e.toElement;
+ if (!from || from.nodeName === 'HTML') {
+ clearTimeout(_idleTimer);
+ _idleTimer = setTimeout(function () {
+ ui.setIdle(true);
+ }, _options.timeToIdleOutside);
+ }
+ },
+ _setupFullscreenAPI = function () {
+ if (_options.fullscreenEl && !framework.features.isOldAndroid) {
+ if (!_fullscrenAPI) {
+ _fullscrenAPI = ui.getFullscreenAPI();
+ }
+ if (_fullscrenAPI) {
+ framework.bind(
+ document,
+ _fullscrenAPI.eventK,
+ ui.updateFullscreen
+ );
+ ui.updateFullscreen();
+ framework.addClass(pswp.template, 'pswp--supports-fs');
+ } else {
+ framework.removeClass(
+ pswp.template,
+ 'pswp--supports-fs'
+ );
+ }
+ }
+ },
+ _setupLoadingIndicator = function () {
+ // Setup loading indicator
+ if (_options.preloaderEl) {
+ _toggleLoadingIndicator(true);
+
+ _listen('beforeChange', function () {
+ clearTimeout(_loadingIndicatorTimeout);
+
+ // display loading indicator with delay
+ _loadingIndicatorTimeout = setTimeout(function () {
+ if (pswp.currItem && pswp.currItem.loading) {
+ if (
+ !pswp.allowProgressiveImg() ||
+ (pswp.currItem.img &&
+ !pswp.currItem.img.naturalWidth)
+ ) {
+ // show preloader if progressive loading is not enabled,
+ // or image width is not defined yet (because of slow connection)
+ _toggleLoadingIndicator(false);
+ // items-controller.js function allowProgressiveImg
+ }
+ } else {
+ _toggleLoadingIndicator(true); // hide preloader
+ }
+ }, _options.loadingIndicatorDelay);
+ });
+ _listen('imageLoadComplete', function (index, item) {
+ if (pswp.currItem === item) {
+ _toggleLoadingIndicator(true);
+ }
+ });
+ }
+ },
+ _toggleLoadingIndicator = function (hide) {
+ if (_loadingIndicatorHidden !== hide) {
+ _togglePswpClass(
+ _loadingIndicator,
+ 'preloader--active',
+ !hide
+ );
+ _loadingIndicatorHidden = hide;
+ }
+ },
+ _applyNavBarGaps = function (item) {
+ var gap = item.vGap;
+
+ if (_fitControlsInViewport()) {
+ var bars = _options.barsSize;
+ if (_options.captionEl && bars.bottom === 'auto') {
+ if (!_fakeCaptionContainer) {
+ _fakeCaptionContainer = framework.createEl(
+ 'pswp__caption pswp__caption--fake'
+ );
+ _fakeCaptionContainer.appendChild(
+ framework.createEl('pswp__caption__center')
+ );
+ _controls.insertBefore(
+ _fakeCaptionContainer,
+ _captionContainer
+ );
+ framework.addClass(_controls, 'pswp__ui--fit');
+ }
+ if (
+ _options.addCaptionHTMLFn(
+ item,
+ _fakeCaptionContainer,
+ true
+ )
+ ) {
+ var captionSize =
+ _fakeCaptionContainer.clientHeight;
+ gap.bottom = parseInt(captionSize, 10) || 44;
+ } else {
+ gap.bottom = bars.top; // if no caption, set size of bottom gap to size of top
+ }
+ } else {
+ gap.bottom = bars.bottom === 'auto' ? 0 : bars.bottom;
+ }
+
+ // height of top bar is static, no need to calculate it
+ gap.top = bars.top;
+ } else {
+ gap.top = gap.bottom = 0;
+ }
+ },
+ _setupIdle = function () {
+ // Hide controls when mouse is used
+ if (_options.timeToIdle) {
+ _listen('mouseUsed', function () {
+ framework.bind(document, 'mousemove', _onIdleMouseMove);
+ framework.bind(
+ document,
+ 'mouseout',
+ _onMouseLeaveWindow
+ );
+
+ _idleInterval = setInterval(function () {
+ _idleIncrement++;
+ if (_idleIncrement === 2) {
+ ui.setIdle(true);
+ }
+ }, _options.timeToIdle / 2);
+ });
+ }
+ },
+ _setupHidingControlsDuringGestures = function () {
+ // Hide controls on vertical drag
+ _listen('onVerticalDrag', function (now) {
+ if (_controlsVisible && now < 0.95) {
+ ui.hideControls();
+ } else if (!_controlsVisible && now >= 0.95) {
+ ui.showControls();
+ }
+ });
+
+ // Hide controls when pinching to close
+ var pinchControlsHidden;
+ _listen('onPinchClose', function (now) {
+ if (_controlsVisible && now < 0.9) {
+ ui.hideControls();
+ pinchControlsHidden = true;
+ } else if (
+ pinchControlsHidden &&
+ !_controlsVisible &&
+ now > 0.9
+ ) {
+ ui.showControls();
+ }
+ });
+
+ _listen('zoomGestureEnded', function () {
+ pinchControlsHidden = false;
+ if (pinchControlsHidden && !_controlsVisible) {
+ ui.showControls();
+ }
+ });
+ };
+
+ var _uiElements = [
+ {
+ name: 'caption',
+ option: 'captionEl',
+ onInit: function (el) {
+ _captionContainer = el;
+ },
+ },
+ {
+ name: 'share-modal',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareModal = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ },
+ },
+ {
+ name: 'button--share',
+ option: 'shareEl',
+ onInit: function (el) {
+ _shareButton = el;
+ },
+ onTap: function () {
+ _toggleShareModal();
+ },
+ },
+ {
+ name: 'button--zoom',
+ option: 'zoomEl',
+ onTap: pswp.toggleDesktopZoom,
+ },
+ {
+ name: 'counter',
+ option: 'counterEl',
+ onInit: function (el) {
+ _indexIndicator = el;
+ },
+ },
+ {
+ name: 'button--close',
+ option: 'closeEl',
+ onTap: pswp.close,
+ },
+ {
+ name: 'button--arrow--left',
+ option: 'arrowEl',
+ onTap: pswp.prev,
+ },
+ {
+ name: 'button--arrow--right',
+ option: 'arrowEl',
+ onTap: pswp.next,
+ },
+ {
+ name: 'button--fs',
+ option: 'fullscreenEl',
+ onTap: function () {
+ if (_fullscrenAPI.isFullscreen()) {
+ _fullscrenAPI.exit();
+ } else {
+ _fullscrenAPI.enter();
+ }
+ },
+ },
+ {
+ name: 'preloader',
+ option: 'preloaderEl',
+ onInit: function (el) {
+ _loadingIndicator = el;
+ },
+ },
+ ];
+
+ var _setupUIElements = function () {
+ var item, classAttr, uiElement;
+
+ var loopThroughChildElements = function (sChildren) {
+ if (!sChildren) {
+ return;
+ }
+
+ var l = sChildren.length;
+ for (var i = 0; i < l; i++) {
+ item = sChildren[i];
+ classAttr = item.className;
+
+ for (var a = 0; a < _uiElements.length; a++) {
+ uiElement = _uiElements[a];
+
+ if (classAttr.indexOf('pswp__' + uiElement.name) > -1) {
+ if (_options[uiElement.option]) {
+ // if element is not disabled from options
+
+ framework.removeClass(
+ item,
+ 'pswp__element--disabled'
+ );
+ if (uiElement.onInit) {
+ uiElement.onInit(item);
+ }
+
+ //item.style.display = 'block';
+ } else {
+ framework.addClass(
+ item,
+ 'pswp__element--disabled'
+ );
+ //item.style.display = 'none';
+ }
+ }
+ }
+ }
+ };
+ loopThroughChildElements(_controls.children);
+
+ var topBar = framework.getChildByClass(_controls, 'pswp__top-bar');
+ if (topBar) {
+ loopThroughChildElements(topBar.children);
+ }
+ };
+
+ ui.init = function () {
+ // extend options
+ framework.extend(pswp.options, _defaultUIOptions, true);
+
+ // create local link for fast access
+ _options = pswp.options;
+
+ // find pswp__ui element
+ _controls = framework.getChildByClass(pswp.scrollWrap, 'pswp__ui');
+
+ // create local link
+ _listen = pswp.listen;
+
+ _setupHidingControlsDuringGestures();
+
+ // update controls when slides change
+ _listen('beforeChange', ui.update);
+
+ // toggle zoom on double-tap
+ _listen('doubleTap', function (point) {
+ var initialZoomLevel = pswp.currItem.initialZoomLevel;
+ if (pswp.getZoomLevel() !== initialZoomLevel) {
+ pswp.zoomTo(initialZoomLevel, point, 333);
+ } else {
+ pswp.zoomTo(
+ _options.getDoubleTapZoom(false, pswp.currItem),
+ point,
+ 333
+ );
+ }
+ });
+
+ // Allow text selection in caption
+ _listen('preventDragEvent', function (e, isDown, preventObj) {
+ var t = e.target || e.srcElement;
+ if (
+ t &&
+ t.getAttribute('class') &&
+ e.type.indexOf('mouse') > -1 &&
+ (t.getAttribute('class').indexOf('__caption') > 0 ||
+ /(SMALL|STRONG|EM)/i.test(t.tagName))
+ ) {
+ preventObj.prevent = false;
+ }
+ });
+
+ // bind events for UI
+ _listen('bindEvents', function () {
+ framework.bind(_controls, 'pswpTap click', _onControlsTap);
+ framework.bind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+
+ if (!pswp.likelyTouchDevice) {
+ framework.bind(
+ pswp.scrollWrap,
+ 'mouseover',
+ ui.onMouseOver
+ );
+ }
+ });
+
+ // unbind events for UI
+ _listen('unbindEvents', function () {
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ if (_idleInterval) {
+ clearInterval(_idleInterval);
+ }
+ framework.unbind(document, 'mouseout', _onMouseLeaveWindow);
+ framework.unbind(document, 'mousemove', _onIdleMouseMove);
+ framework.unbind(_controls, 'pswpTap click', _onControlsTap);
+ framework.unbind(pswp.scrollWrap, 'pswpTap', ui.onGlobalTap);
+ framework.unbind(pswp.scrollWrap, 'mouseover', ui.onMouseOver);
+
+ if (_fullscrenAPI) {
+ framework.unbind(
+ document,
+ _fullscrenAPI.eventK,
+ ui.updateFullscreen
+ );
+ if (_fullscrenAPI.isFullscreen()) {
+ _options.hideAnimationDuration = 0;
+ _fullscrenAPI.exit();
+ }
+ _fullscrenAPI = null;
+ }
+ });
+
+ // clean up things when gallery is destroyed
+ _listen('destroy', function () {
+ if (_options.captionEl) {
+ if (_fakeCaptionContainer) {
+ _controls.removeChild(_fakeCaptionContainer);
+ }
+ framework.removeClass(
+ _captionContainer,
+ 'pswp__caption--empty'
+ );
+ }
+
+ if (_shareModal) {
+ _shareModal.children[0].onclick = null;
+ }
+ framework.removeClass(_controls, 'pswp__ui--over-close');
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ ui.setIdle(false);
+ });
+
+ if (!_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ _listen('initialZoomIn', function () {
+ if (_options.showAnimationDuration) {
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ }
+ });
+ _listen('initialZoomOut', function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ });
+
+ _listen('parseVerticalMargin', _applyNavBarGaps);
+
+ _setupUIElements();
+
+ if (_options.shareEl && _shareButton && _shareModal) {
+ _shareModalHidden = true;
+ }
+
+ _countNumItems();
+
+ _setupIdle();
+
+ _setupFullscreenAPI();
+
+ _setupLoadingIndicator();
+ };
+
+ ui.setIdle = function (isIdle) {
+ _isIdle = isIdle;
+ _togglePswpClass(_controls, 'ui--idle', isIdle);
+ };
+
+ ui.update = function () {
+ // Don't update UI if it's hidden
+ if (_controlsVisible && pswp.currItem) {
+ ui.updateIndexIndicator();
+
+ if (_options.captionEl) {
+ _options.addCaptionHTMLFn(pswp.currItem, _captionContainer);
+
+ _togglePswpClass(
+ _captionContainer,
+ 'caption--empty',
+ !pswp.currItem.title
+ );
+ }
+
+ _overlayUIUpdated = true;
+ } else {
+ _overlayUIUpdated = false;
+ }
+
+ if (!_shareModalHidden) {
+ _toggleShareModal();
+ }
+
+ _countNumItems();
+ };
+
+ ui.updateFullscreen = function (e) {
+ if (e) {
+ // some browsers change window scroll position during the fullscreen
+ // so PhotoSwipe updates it just in case
+ setTimeout(function () {
+ pswp.setScrollOffset(0, framework.getScrollY());
+ }, 50);
+ }
+
+ // toogle pswp--fs class on root element
+ framework[
+ (_fullscrenAPI.isFullscreen() ? 'add' : 'remove') + 'Class'
+ ](pswp.template, 'pswp--fs');
+ };
+
+ ui.updateIndexIndicator = function () {
+ if (_options.counterEl) {
+ _indexIndicator.innerHTML =
+ pswp.getCurrentIndex() +
+ 1 +
+ _options.indexIndicatorSep +
+ _options.getNumItemsFn();
+ }
+ };
+
+ ui.onGlobalTap = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ if (_blockControlsTap) {
+ return;
+ }
+
+ if (e.detail && e.detail.pointerType === 'mouse') {
+ // close gallery if clicked outside of the image
+ if (_hasCloseClass(target)) {
+ pswp.close();
+ return;
+ }
+
+ if (framework.hasClass(target, 'pswp__img')) {
+ if (
+ pswp.getZoomLevel() === 1 &&
+ pswp.getZoomLevel() <= pswp.currItem.fitRatio
+ ) {
+ if (_options.clickToCloseNonZoomable) {
+ pswp.close();
+ }
+ } else {
+ pswp.toggleDesktopZoom(e.detail.releasePoint);
+ }
+ }
+ } else {
+ // tap anywhere (except buttons) to toggle visibility of controls
+ if (_options.tapToToggleControls) {
+ if (_controlsVisible) {
+ ui.hideControls();
+ } else {
+ ui.showControls();
+ }
+ }
+
+ // tap to close gallery
+ if (
+ _options.tapToClose &&
+ (framework.hasClass(target, 'pswp__img') ||
+ _hasCloseClass(target))
+ ) {
+ pswp.close();
+ return;
+ }
+ }
+ };
+ ui.onMouseOver = function (e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+
+ // add class when mouse is over an element that should close the gallery
+ _togglePswpClass(
+ _controls,
+ 'ui--over-close',
+ _hasCloseClass(target)
+ );
+ };
+
+ ui.hideControls = function () {
+ framework.addClass(_controls, 'pswp__ui--hidden');
+ _controlsVisible = false;
+ };
+
+ ui.showControls = function () {
+ _controlsVisible = true;
+ if (!_overlayUIUpdated) {
+ ui.update();
+ }
+ framework.removeClass(_controls, 'pswp__ui--hidden');
+ };
+
+ ui.supportsFullscreen = function () {
+ var d = document;
+ return !!(
+ d.exitFullscreen ||
+ d.mozCancelFullScreen ||
+ d.webkitExitFullscreen ||
+ d.msExitFullscreen
+ );
+ };
+
+ ui.getFullscreenAPI = function () {
+ var dE = document.documentElement,
+ api,
+ tF = 'fullscreenchange';
+
+ if (dE.requestFullscreen) {
+ api = {
+ enterK: 'requestFullscreen',
+ exitK: 'exitFullscreen',
+ elementK: 'fullscreenElement',
+ eventK: tF,
+ };
+ } else if (dE.mozRequestFullScreen) {
+ api = {
+ enterK: 'mozRequestFullScreen',
+ exitK: 'mozCancelFullScreen',
+ elementK: 'mozFullScreenElement',
+ eventK: 'moz' + tF,
+ };
+ } else if (dE.webkitRequestFullscreen) {
+ api = {
+ enterK: 'webkitRequestFullscreen',
+ exitK: 'webkitExitFullscreen',
+ elementK: 'webkitFullscreenElement',
+ eventK: 'webkit' + tF,
+ };
+ } else if (dE.msRequestFullscreen) {
+ api = {
+ enterK: 'msRequestFullscreen',
+ exitK: 'msExitFullscreen',
+ elementK: 'msFullscreenElement',
+ eventK: 'MSFullscreenChange',
+ };
+ }
+
+ if (api) {
+ api.enter = function () {
+ // disable close-on-scroll in fullscreen
+ _initalCloseOnScrollValue = _options.closeOnScroll;
+ _options.closeOnScroll = false;
+
+ if (this.enterK === 'webkitRequestFullscreen') {
+ pswp.template[this.enterK](
+ Element.ALLOW_KEYBOARD_INPUT
+ );
+ } else {
+ return pswp.template[this.enterK]();
+ }
+ };
+ api.exit = function () {
+ _options.closeOnScroll = _initalCloseOnScrollValue;
+
+ return document[this.exitK]();
+ };
+ api.isFullscreen = function () {
+ return document[this.elementK];
+ };
+ }
+
+ return api;
+ };
+ };
+ return PhotoSwipeUI_Default;
+});
diff --git a/apps/photos/thirdparty/photoswipe/website/_includes/menu.html b/apps/photos/thirdparty/photoswipe/website/_includes/menu.html
new file mode 100644
index 000000000..49c915215
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/_includes/menu.html
@@ -0,0 +1,79 @@
+
+
diff --git a/apps/photos/thirdparty/photoswipe/website/_layouts/default.html b/apps/photos/thirdparty/photoswipe/website/_layouts/default.html
new file mode 100644
index 000000000..349d09a98
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/_layouts/default.html
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+ {{ page.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% if page.markdownpage == true %}
+
+
+
+ {% else %}
+
+
+
+
+
+ {% if site.url == 'local' %}
+
+ {% else %}
+
+
+ {% endif %}
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+ {% if page.markdownpage == true %}
+
+
+
+
PhotoSwipe
+
+
{{ page.h1_title || page.title }}
+
+ {% include menu.html %}
+
+
+
+ {% else %}
+ {% endif %}
+
+
+ {{ content | markdown }}
+
+
+ {% if page.markdownpage == true %}
+
+
</> with <3 in by @dimsemenov
+
+
+
+
+
+
+
+
+ {% else %}
+ {% endif %}
+
+ {% if site.url != 'local' %}
+
+
+
+
+
+ {% endif %}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/website/documentation/api.md b/apps/photos/thirdparty/photoswipe/website/documentation/api.md
new file mode 100644
index 000000000..35fd29e60
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/documentation/api.md
@@ -0,0 +1,317 @@
+---
+
+layout: default
+
+title: PhotoSwipe API
+
+h1_title: API
+
+description: Public methods, properties and events of PhotoSwipe JavaScript image gallery.
+
+addjs: true
+
+canonical_url: http://photoswipe.com/documentation/api.html
+
+buildtool: true
+
+markdownpage: true
+
+---
+
+All methods and properties listed on this page are public. If you want to take a look at example of what API can do, take a look in [source of default PhotoSwipe UI](https://github.com/dimsemenov/PhotoSwipe/blob/master/src/js/ui/photoswipe-ui-default.js).
+
+You can get PhotoSwipe instance object during the initialization, e.g.:
+
+```javascript
+var photoswipeInstance = new PhotoSwipe( /* ... */ );
+```
+
+## Methods
+
+```javascript
+var pswp = new PhotoSwipe( /* ... */ );
+
+// Initialize and open gallery
+// (you can bind events before this method)
+pswp.init();
+
+// Go to slide by index
+// @param {int} `index`
+pswp.goTo(index);
+
+// Go to the next slide
+pswp.next();
+
+// Go to the previous slide
+pswp.prev();
+
+// Update gallery size
+// @param {boolean} `force` If you set it to `true`,
+// size of the gallery will be updated
+// even if viewport size hasn't changed.
+pswp.updateSize(force);
+
+// Close gallery
+pswp.close();
+
+// Destroy gallery,
+// automatically called after close()
+pswp.destroy()
+
+// Zoom current slide to (optionally with animation)
+// @param {number} `destZoomLevel` Destination scale number. 1 - original.
+// pswp.currItem.fitRatio - image will fit into viewport.
+// @param {object} `centerPoint` Object of x and y coordinates, relative to viewport.
+// @param {int} `speed` Animation duration. Can be 0.
+// @param {function} `easingFn` Easing function (optional). Set to false to use default easing.
+// @param {function} `updateFn` Function will be called on each update frame. (optional)
+//
+// Example below will 2x zoom to center of slide:
+// pswp.zoomTo(2, {x:pswp.viewportSize.x/2,y:pswp.viewportSize.y/2}, 2000, false, function(now) {
+//
+// });
+pswp.zoomTo(destZoomLevel, centerPoint, speed, easingFn, updateFn);
+
+// Apply zoom and pan to the current slide
+//
+// @param {number} `zoomLevel`
+// @param {int} `panX`
+// @param {int} `panY`
+//
+// For example: `pswp.applyZoomPan(1, 0, 0)`
+// will zoom current image to the original size
+// and will place it on top left corner
+//
+//
+pswp.applyZoomPan(zoomLevel, panX, panY);
+```
+
+## Properties
+
+```javascript
+
+// current slide object
+pswp.currItem
+
+// items array (slides, images)
+pswp.items
+
+// size of sliding viewport
+pswp.viewportSize
+
+// object holds all functions from framework
+// framework-bridge.js
+pswp.framework
+
+// UI object (e.g. PhotoSwipeUI_Default instance)
+pswp.ui
+
+// background element (pswp__bg)
+pswp.bg
+
+// container element (pswp__container)
+pswp.container
+
+// options
+pswp.options
+
+
+
+// Even though methods below aren't technically properties, we list them here:
+
+// current item index (int)
+pswp.getCurrentIndex();
+
+// total number of items
+pswp.options.getNumItemsFn()
+
+// current zoom level (number)
+pswp.getZoomLevel();
+
+// one (or more) pointer is used
+pswp.isDragging();
+
+// two (or more) pointers are used
+pswp.isZooming();
+
+// `true` when transition between is running (after swipe)
+pswp.isMainScrollAnimating();
+```
+
+## Events
+
+PhotoSwipe uses very simple Event/Messaging system. It has two methods `shout` (triggers event) and `listen` (handles event). For now there is no method to unbind listener, but all of them are cleared when PhotoSwipe is closed.
+
+```javascript
+var pswp = new PhotoSwipe(/* ... */);
+
+// Listen for "helloWorld" event
+pswp.listen('helloWorld', function(name) {
+ alert('Name is: ' + name);
+});
+
+// Trigger "helloWorld" event
+pswp.shout('helloWorld', 'John' /* you may pass more arguments */);
+```
+
+Available events:
+
+```javascript
+
+// Before slides change
+// (before the content is changed, but after navigation)
+// Update UI here (like "1 of X" indicator)
+pswp.listen('beforeChange', function() { });
+
+// After slides change
+// (after content changed)
+pswp.listen('afterChange', function() { });
+
+// Image loaded
+pswp.listen('imageLoadComplete', function(index, item) {
+ // index - index of a slide that was loaded
+ // item - slide object
+});
+
+// Viewport size changed
+pswp.listen('resize', function() { });
+
+// Triggers when PhotoSwipe "reads" slide object data,
+// which happens before content is set, or before lazy-loading is initiated.
+// Use it to dynamically change properties
+pswp.listen('gettingData', function(index, item) {
+ // index - index of a slide that was loaded
+ // item - slide object
+
+ // e.g. change path to the image based on `something`
+ if( something ) {
+ item.src = item.something;
+ } else {
+ item.src = item.somethingElse;
+ }
+});
+
+// Mouse was used (triggers only once)
+pswp.listen('mouseUsed', function() { });
+
+
+// Opening zoom in animation starting
+pswp.listen('initialZoomIn', function() { });
+
+// Opening zoom in animation finished
+pswp.listen('initialZoomInEnd', function() { });
+
+// Closing zoom out animation started
+pswp.listen('initialZoomOut', function() { });
+
+// Closing zoom out animation finished
+pswp.listen('initialZoomOutEnd', function() { });
+
+
+// Allows overriding vertical margin for individual items
+pswp.listen('parseVerticalMargin', function(item) {
+ // For example:
+ var gap = item.vGap;
+
+ gap.top = 50; // There will be 50px gap from top of viewport
+ gap.bottom = 100; // and 100px gap from the bottom
+})
+
+// Gallery starts closing
+pswp.listen('close', function() { });
+
+// Gallery unbinds events
+// (triggers before closing animation)
+pswp.listen('unbindEvents', function() { });
+
+// After gallery is closed and closing animation finished.
+// Clean up your stuff here.
+pswp.listen('destroy', function() { });
+
+// Called when the page scrolls.
+// The callback is passed an offset with properties {x: number, y: number}.
+//
+// PhotoSwipe uses the offset to determine the top-left of the template,
+// which by default is the top-left of the viewport. When using modal: false,
+// you should listen to this event (before calling .init()) and modify the offset
+// with the template's getBoundingClientRect().
+//
+// Look at the "Implementing inline gallery display" FAQ section for more info.
+pswp.listen('updateScrollOffset', function(_offset) {
+ var r = gallery.template.getBoundingClientRect();
+ _offset.x += r.left;
+ _offset.y += r.top;
+});
+
+// PhotoSwipe has a special event called pswpTap.
+// It's dispatched using default JavaScript event model.
+// So you can, for example, call stopPropagation on it.
+// pswp.framework.bind - is a shorthand for addEventListener
+pswp.framework.bind( pswp.scrollWrap /* bind on any element of gallery */, 'pswpTap', function(e) {
+ console.log('tap', e, e.detail);
+ // e.detail.origEvent // original event that finished tap (e.g. mouseup or touchend)
+ // e.detail.target // e.target of original event
+ // e.detail.releasePoint // object with x/y coordinates of tap
+ // e.detail.pointerType // mouse, touch, or pen
+});
+
+// Allow to call preventDefault on down and up events
+pswp.listen('preventDragEvent', function(e, isDown, preventObj) {
+ // e - original event
+ // isDown - true = drag start, false = drag release
+
+ // Line below will force e.preventDefault() on:
+ // touchstart/mousedown/pointerdown events
+ // as well as on:
+ // touchend/mouseup/pointerup events
+ preventObj.prevent = true;
+});
+
+
+
+// Default UI events
+// -------------------------
+
+// Share link clicked
+pswp.listen('shareLinkClick', function(e, target) {
+ // e - original click event
+ // target - link that was clicked
+
+ // If `target` has `href` attribute and
+ // does not have `download` attribute -
+ // share modal window will popup
+});
+
+
+```
+
+## Adding slides dynamically
+
+To add, edit, or remove slides after PhotoSwipe is opened, you just need to modify the `items` array. For example, you can push new slide objects into the `items` array:
+
+```javascript
+pswp.items.push({
+ src: "path/to/image.jpg",
+ w:1200,
+ h:500
+});
+```
+
+If you changed slide that is CURRENT, NEXT or PREVIOUS (which you should try to avoid) – you need to call method that will update their content:
+
+```javascript
+// sets a flag that slides should be updated
+pswp.invalidateCurrItems();
+// updates the content of slides
+pswp.updateSize(true);
+```
+
+Otherwise, you don't need to do anything else. Except, maybe, calling `pswp.ui.update()` if you want some parts of default UI to update (e.g. "1 of X" counter). Also note:
+
+- You can't reassign whole array, you can only modify it (e.g. use `splice` to remove elements).
+- If you're going to remove current slide – call `goTo` method before.
+- There must be at least one slide.
+- This technique is used to [serve responsive images](responsive-images.html).
+
+Some method or property is missing? Found a grammatical mistake? Know how this page can be improved? [Please suggest an edit!](https://github.com/dimsemenov/PhotoSwipe/blob/master/website/documentation/api.md)
+
diff --git a/apps/photos/thirdparty/photoswipe/website/documentation/creating-custom-ui.md b/apps/photos/thirdparty/photoswipe/website/documentation/creating-custom-ui.md
new file mode 100644
index 000000000..0ffdd02fc
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/documentation/creating-custom-ui.md
@@ -0,0 +1 @@
+// TODO
\ No newline at end of file
diff --git a/apps/photos/thirdparty/photoswipe/website/documentation/custom-html-in-slides.md b/apps/photos/thirdparty/photoswipe/website/documentation/custom-html-in-slides.md
new file mode 100644
index 000000000..3e120f236
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/documentation/custom-html-in-slides.md
@@ -0,0 +1,79 @@
+---
+
+layout: default
+
+title: Custom HTML Content in PhotoSwipe Slides
+
+h1_title: Custom HTML Content in Slides
+
+description: How to add custom HTML in PhotoSwipe slides, like ads or list of related galleries.
+
+addjs: true
+
+canonical_url: http://photoswipe.com/documentation/custom-html-in-slides.html
+
+buildtool: true
+
+markdownpage: true
+
+---
+
+To make PhotoSwipe display HTML content in slides you need to define `html` property in slide object. It should contain HTML string or DOM element object.
+
+```javascript
+
+var items = [
+ // slide 1 with HTML
+ {
+ html: ''
+ },
+
+ // slide 2 with image
+ {
+ src: 'path/to/image.jpg',
+ w:600,
+ h:200
+ }
+];
+
+
+// initialise as usual
+var gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
+
+// You don't necessarily need to have "html" property in slide object initially.
+// You may create it dynamically in gettingData event:
+/*
+ gallery.listen('gettingData', function(index, item) {
+ if(index === 3) {
+ item.html = 'Dynamically generated HTML ' + Math.random() + '
';
+ }
+
+ });
+*/
+
+// Note that init() method is called after gettingData event is bound
+gallery.init();
+```
+
+Additional important notes:
+
+- To avoid conflicts with third-party modules, slide that has `html` property, should not have `src` (image) property.
+- PhotoSwipe is designed for images, not as a scroller of text content. Use "custom HTML" feature as an addition, for example for slide with related galleries, an introductory slide, or advertisements BETWEEN images.
+- It's strongly not recommended to add video or audio elements using this method (including YouTube, Vimeo etc. iframes). As HTML5 video blocks touch events over it in many mobile browsers (user won't be able to swipe it). If you really need to have video in PhotoSwipe, you may add it as modal that appears when user taps on current slide, you can dynamically create modal in DOM and append it after `.pswp__scroll-wrap` element.
+- If you have initial zoom-in/zoom-out transition enabled, PhotoSwipe will automatically disable it if current slide has `html`, simple fade transition will be used instead.
+- By default PhotoSwipe will allow click event just on links (``) and their child elements. To change this behavior look into `isClickableElement` option or `preventDragEvent` event.
+- Zoom of HTML slides is not supported, yet.
+
+Example:
+
+
+
+Tip: you may download the example from CodePen to play with it locally (`Edit on CodePen` -> `Share` -> `Export .zip`).
+
+Know how this page can be improved? [Suggest an edit!](https://github.com/dimsemenov/PhotoSwipe/blob/master/website/documentation/custom-html-in-slides.md)
+
+
diff --git a/apps/photos/thirdparty/photoswipe/website/documentation/faq.md b/apps/photos/thirdparty/photoswipe/website/documentation/faq.md
new file mode 100644
index 000000000..87563c629
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/documentation/faq.md
@@ -0,0 +1,257 @@
+---
+
+layout: default
+
+title: PhotoSwipe FAQ
+
+h1_title: FAQ
+
+description: Frequently asked questions and known issues about PhotoSwipe image gallery.
+
+addjs: true
+
+canonical_url: http://photoswipe.com/documentation/faq.html
+
+buildtool: true
+
+markdownpage: true
+
+---
+
+## Implementation
+
+### I'm unable to predefine image size, what to do?
+
+Use another gallery script ([1](http://dimsemenov.com/plugins/magnific-popup/), [2](http://dimsemenov.com/plugins/royal-slider/gallery/)), or find a way:
+
+- You can read size of an image by downloading only small part of it ([PHP version](http://stackoverflow.com/questions/4635936/super-fast-getimagesize-in-php), [Ruby](https://github.com/sdsykes/fastimage), [Node.js](http://stackoverflow.com/a/20111234/331460)).
+- You can store size of an image directly in its filename and parse it on frontend during PhotoSwipe initialization (`gettingData` event in API section).
+- Most CMS store size of an image in a database and have API to retrieve it.
+- Most web API (Facebook, 500px, Instagram, Flickr, Twitter, YouTube, Vimeo etc.) return a size of images.
+
+Dimensions are used for progressive loading, stretched placeholder, initial zoom-in transition, panning, zooming, caption positioning. Discussion in GitHub [issue #741](https://github.com/dimsemenov/PhotoSwipe/issues/741).
+
+
+### My thumbnails are square, but large images have different dimensions, what to do with opening/closing transition?
+
+1. If thumbnail aspect ratio does not match large image, do not define `msrc` property for slide objects and enable opacity transition option (`showHideOpacity:true, getThumbBoundsFn:false`).
+2. If aspect ratio of thumbnail image file matches large image, **but thumbnail area is cropped via CSS**, just add `showHideOpacity:true` and make sure that `getThumbBoundsFn` option returns coordinates that consider crop area.
+
+I strongly recommend to display thumbnails that match aspect ratio of large image, or crop the visible area via CSS (2).
+
+I'll try to explain why this is not implemented yet. There are two ways to make expanding area animation:
+
+1. Animate `clip` property. But [it forces Paint](http://csstriggers.com/#clip) each time, which makes animations jerky.
+2. Wrap an image that expands with two divs that have `overflow:hidden` and reposition them via `transform:translate` during the animation so they clip it at right parts. This method does not force Paint or Layout, but requires two additional elements in markup of each slide. Test prototype showed that it works smooth only on high-end mobile devices (like Nexus 5 with Chrome). Maybe some day I'll implement it.
+
+
+### My captions are large, can I add scroll to them?
+
+Refer to [issue #657](https://github.com/dimsemenov/PhotoSwipe/issues/657).
+
+
+### How to implement inline gallery display
+
+Note that this is an experimental feature, for now it doesn't allow to scroll the page vertically over the gallery on mobile (as it calls `prevetDefault()` on touch events). Please report issues if you'll find any. To implement an embedded gallery that flows with the rest of your document, follow these steps:
+
+1. Put the `.pswp` template inside a positioned parent element.
+2. Set `modal: false, closeOnScroll: false` options.
+3. Modify the `getThumbBoundsFn` (if you're using it) to subtract the template parent's bounding rect.
+4. Construct the PhotoSwipe.
+5. Listen for the `updateScrollOffset` event and add the template's bounding rect to the offset.
+6. `init()` the PhotoSwipe.
+
+[**Live example on CodePen →**](http://codepen.io/dimsemenov/pen/JogxWM)
+
+```html
+
+```
+
+```javascript
+var items = [...];
+var template = document.getElementById("gallery"); // .pswp
+var options = {
+ ...,
+ modal: false,
+ closeOnScroll: false,
+ getThumbBoundsFn: function(index) {
+ // rect was the original bounds
+ var rect = {x: ..., y: ..., w: ...},
+
+ var templateBounds = template.parentElement.getBoundingClientRect();
+ rect.x -= templateBounds.left;
+ rect.y -= templateBounds.top;
+
+ return rect;
+ }
+};
+var photoSwipe = new PhotoSwipe(template, PhotoSwipeUI_Default, items, options);
+photoSwipe.listen('updateScrollOffset', function(_offset) {
+ var r = template.getBoundingClientRect();
+ _offset.x += r.left;
+ _offset.y += r.top;
+});
+photoSwipe.init();
+```
+
+### How to use custom identifiers instead of indexes in URL
+
+to make URLs to a single image look like this:
+
+```
+http://example.com/#&gid=1&pid=custom-first-id
+http://example.com/#&gid=1&pid=custom-second-id
+```
+
+instead of:
+
+```
+http://example.com/#&gid=1&pid=1
+http://example.com/#&gid=1&pid=2
+```
+
+... enable options `history:true, galleryPIDs:true` and add `pid` (unique picture identifier) property to slide objects (`pid` can be an integer or a string), for example:
+
+```js
+var slides = [
+ {
+ src: 'path/to/1.jpg',
+ w:500,
+ h:400,
+ pid: 'custom-first-id'
+ },
+ {
+ src: 'path/to/2.jpg',
+ w:300,
+ h:700,
+ pid: 'custom-second-id'
+ },
+ ...
+];
+```
+
+- Note that PhotoSwipe does not execute any code until you initialize and open it. That's why on initial page load you need to parse the URL by yourself. Default code from the [Getting Started](http://photoswipe.com/documentation/getting-started.html#dom-to-slide-objects) section of documentation includes this functionality (check `photoswipeParseHash` function if you need some modification).
+- Option `galleryPIDs` is available since PhotoSwipe v4.0.8 ([option description](options.html#galleryPIDs)).
+
+
+## Bugs
+
+### GIF images sometimes freeze on iOS8
+
+iOS Safari has a bug that freezes GIF images that are shifted outside of the window (or outside of element with `overflow:hidden`). My recommendation is to avoid using animated GIFs in PhotoSwipe at all, as they slow down animation performance in any mobile browser. But if you really need to use it, refer to [this hack](https://github.com/dimsemenov/PhotoSwipe/issues/662#issuecomment-66420874).
+
+
+### Mobile browser crashes when opening gallery with huge images
+
+Mostly, it can happen on mobile devices with low memory limit – iOS Safari, default browser in old Android (before KitKat). The most common reason of a crash is too big images (usually larger than 2000x1500px). PhotoSwipe applies hardware-acceleration on images, which consumes more memory than regular image on page, so when you run out of limit browser starts lagging or even crashes.
+
+So [serve responsive images](responsive-images.html), or at least don't serve huge images. Ideally, for an average 900x600 phone you should serve 1200px wide image. Note that if everything works smoothly in iOS Simulator, it doesn't mean that crash won't occur on real device.
+
+In much more rare cases crash can occur if you open PhotoSwipe during some process on your page (this can be initial page load/render, or some complex animation on page), try to delay PhotoSwipe initialization until page is rendered (18-300ms after document.ready), especially if you are displaying large images.
+
+**UPD.:** in [v4.1.0](https://github.com/dimsemenov/PhotoSwipe/releases/tag/v4.1.0) this is partly fixed.
+
+## Miscellaneous
+
+### Where is the changelog, how to do I get notified about updates?
+
+Each time PhotoSwipe gets an update - [GitHub releases](https://github.com/dimsemenov/PhotoSwipe/releases) page is updated with details.
+Releases page has an [Atom feed](https://github.com/dimsemenov/PhotoSwipe/releases.atom), you may setup email notifications when feed is updated [using IFTTT](https://ifttt.com/recipes/230902-photoswipe-update-notification).
+
+Also, you may join my [email newsletter](http://dimsemenov.com/subscribe.html?i=pswp) (sent 3-4 times a year), follow [@PhotoSwipe on Twitter](http://twitter.com/photoswipe), and star/watch [PhotoSwipe on GitHub](https://github.com/dimsemenov/PhotoSwipe/).
+
+### When WordPress plugin will be released?
+
+Plugin is under development and will be released in 2015. To get notified [subscribe to my newsletter](http://dimsemenov.com/subscribe.html?i=pswp-wp).
+
+
+### I want to use PhotoSwipe in WordPress/Magento/Joomla... template, can I?
+
+Yes, you can use PhotoSwipe in a free or commercial themes without any limitations. If you can, please leave a credit (link to PhotoSwipe homepage) in theme description or/and in admin area.
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/photos/thirdparty/photoswipe/website/documentation/getting-started.md b/apps/photos/thirdparty/photoswipe/website/documentation/getting-started.md
new file mode 100644
index 000000000..bae2e5967
--- /dev/null
+++ b/apps/photos/thirdparty/photoswipe/website/documentation/getting-started.md
@@ -0,0 +1,536 @@
+---
+
+layout: default
+
+title: "PhotoSwipe Documentation: Getting Started"
+
+h1_title: Getting Started
+
+description: PhotoSwipe image gallery getting started guide.
+
+addjs: true
+
+canonical_url: http://photoswipe.com/documentation/getting-started.html
+
+buildtool: true
+
+markdownpage: true
+
+---
+
+First things that you should know before you start:
+
+- PhotoSwipe is not a simple jQuery plugin, at least basic JavaScript knowledge is required to install.
+- PhotoSwipe requires predefined image dimensions ([more about this](faq.html#image-size)).
+- If you use PhotoSwipe on non-responsive website – controls will be scaled on mobile (as the whole page is scaled). So you'll need to implement custom controls (e.g. single large close button in top right corner).
+- All code in the documentation is pure Vanilla JS and supports IE 8 and above. If your website or app uses some JavaScript framework (like jQuery or MooTools) or you don't need to support old browsers – feel free to simplify the code.
+- Avoid serving big images (larger than 2000x1500px) for mobile, as they will dramatically reduce animation performance and can cause crash (especially on iOS Safari). Possible solutions: [serve responsive images](responsive-images.html), or open image on a separate page, or use libraries that support image tiling (like [Leaflet](http://leafletjs.com/)) ([more in FAQ](faq.html#mobile-crash)).
+
+## Initialization
+
+### Step 1: include JS and CSS files
+
+You can find them in [dist/](https://github.com/dimsemenov/PhotoSwipe/tree/master/dist) folder of [GitHub](https://github.com/dimsemenov/PhotoSwipe) repository. Sass and uncompiled JS files are in folder [src/](https://github.com/dimsemenov/PhotoSwipe/tree/master/src). I recommend using Sass if you're planning to modify existing styles, as code there is structured and commented.
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+```
+
+It doesn't matter how and where will you include JS and CSS files. Code is executed only when you call `new PhotoSwipe()`. So feel free to defer loading of files if you don't need PhotoSwipe to be opened initially.
+
+PhotoSwipe also supports AMD loaders (like RequireJS) and CommonJS, use them like so:
+
+```javascript
+require([
+ 'path/to/photoswipe.js',
+ 'path/to/photoswipe-ui-default.js'
+ ], function( PhotoSwipe, PhotoSwipeUI_Default ) {
+
+ // var gallery = new PhotoSwipe( someElement, PhotoSwipeUI_Default ...
+ // gallery.init()
+ // ...
+
+});
+```
+
+And also, you can install it via Bower (`bower install photoswipe`), or [NPM](https://www.npmjs.com/package/photoswipe) (`npm install photoswipe`).
+
+### Step 2: add PhotoSwipe (.pswp) element to DOM
+
+You can add HTML code dynamically via JS (directly before the initialization), or have it in the page initially (like it's done on the demo page). This code can be appended anywhere, but ideally before the closing `